簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.
線程的劃分尺度小于進(jìn)程拨扶,使得多線程程序的并發(fā)性高箫荡。
另外说榆,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存牛郑,從而極大地提高了程序的運(yùn)行效率怠肋。
線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口淹朋、順序執(zhí)行序列和程序的出口笙各。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中础芍,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制杈抢。
從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中仑性,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行惶楼。但操作系統(tǒng)并沒(méi)有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配诊杆。這就是進(jìn)程和線程的重要區(qū)別歼捐。
進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.
線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源.
一個(gè)線程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線程;同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行.
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間晨汹,一個(gè)進(jìn)程崩潰后豹储,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑淘这。線程有自己的堆棧和局部變量剥扣,但線程之間沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉铝穷,所以多進(jìn)程的程序要比多線程的程序健壯钠怯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大曙聂,效率要差一些呻疹。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程筹陵,不能用進(jìn)程。
The term thread is used to refer to a separate path of execution for code.
The term process is used to refer to a running executable, which can encompass multiple threads.線程用于指代一個(gè)獨(dú)立執(zhí)行的代碼路徑
進(jìn)程用于指代一個(gè)可執(zhí)行程序镊尺,他可以包含多個(gè)線程
當(dāng)一個(gè)可執(zhí)行程序中擁有多個(gè)獨(dú)立執(zhí)行的代碼路徑的時(shí)候朦佩,這就叫做多線程。
進(jìn)程
進(jìn)程(process)是一塊包含了某些資源的內(nèi)存區(qū)域庐氮。操作系統(tǒng)利用進(jìn)程把它的工作劃分為一些功能單元语稠。
進(jìn)程中所包含的一個(gè)或多個(gè)執(zhí)行單元稱(chēng)為線程(thread)。進(jìn)程還擁有一個(gè)私有的虛擬地址空間,該空間僅能被它所包含的線程訪問(wèn)仙畦。
線程只能歸屬于一個(gè)進(jìn)程并且它只能訪問(wèn)該進(jìn)程所擁有的資源输涕。當(dāng)操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程后,該進(jìn)程會(huì)自動(dòng)申請(qǐng)一個(gè)名為主線程或首要線程的線程慨畸。
應(yīng)用程序(application)是由一個(gè)或多個(gè)相互協(xié)作的進(jìn)程組成的莱坎。
線程
一個(gè)線程包含以下內(nèi)容:
<ul>
<li> 一個(gè)指向當(dāng)前被執(zhí)行指令的指令指針;</li>
<li> 一個(gè)棧寸士;</li>
<li> 一個(gè)寄存器值的集合檐什,定義了一部分描述正在執(zhí)行線程的處理器狀態(tài)的值;</li>
<li> 一個(gè)私有的數(shù)據(jù)區(qū)弱卡。</li>
</ul>
所有這些元素都?xì)w于線程執(zhí)行上下文的名下乃正。處在同一個(gè)進(jìn)程中的所有線程都可以訪問(wèn)該進(jìn)程所包含的地址空間,當(dāng)然也包含存儲(chǔ)在該空間中的所有資源婶博。
并行使用一些線程通常是我們?cè)趯?shí)現(xiàn)算法時(shí)的自然反應(yīng)瓮具。實(shí)際上,一個(gè)算法往往由一系列可以并發(fā)執(zhí)行的任務(wù)組成凡人。但是需要引起注意的是名党,使用大量的線程將引起過(guò)多的上下文切換,最終反而影響了性能划栓。
進(jìn)程與線程的一個(gè)簡(jiǎn)單解釋
<li> 計(jì)算機(jī)的核心是CPU兑巾,它承擔(dān)了所有的計(jì)算任務(wù)。它就像一座工廠忠荞,時(shí)刻在運(yùn)行蒋歌。</li>
<li> 假定工廠的電力有限,一次只能供給一個(gè)車(chē)間使用委煤。也就是說(shuō)堂油,一個(gè)車(chē)間開(kāi)工的時(shí)候,其他車(chē)間都必須停工碧绞。背后的含義就是府框,單個(gè)CPU一次只能運(yùn)行一個(gè)任務(wù)。</li>
<li> 進(jìn)程就好比工廠的車(chē)間讥邻,它代表CPU所能處理的單個(gè)任務(wù)迫靖。任一時(shí)刻,CPU總是運(yùn)行一個(gè)進(jìn)程兴使,其他進(jìn)程處于非運(yùn)行狀態(tài)系宜。</li>
<li> 一個(gè)車(chē)間里,可以有很多工人发魄。他們協(xié)同完成一個(gè)任務(wù)盹牧。</li>
<li> 線程就好比車(chē)間里的工人俩垃。一個(gè)進(jìn)程可以包括多個(gè)線程。</li>
<li> 車(chē)間的空間是工人們共享的汰寓,比如許多房間是每個(gè)工人都可以進(jìn)出的口柳。這象征一個(gè)進(jìn) <li> 程的內(nèi)存空間是共享的,每個(gè)線程都可以使用這些共享內(nèi)存有滑。</li>
<li> 可是跃闹,每間房間的大小不同,有些房間最多只能容納一個(gè)人俺孙,比如廁所辣卒。里面有人的時(shí)候,其他人就不能進(jìn)去了睛榄。這代表一個(gè)線程使用某些共享內(nèi)存時(shí)荣茫,其他線程必須等它結(jié)束,才能使用這一塊內(nèi)存场靴。</li>
<li> 一個(gè)防止他人進(jìn)入的簡(jiǎn)單方法啡莉,就是門(mén)口加一把鎖。先到的人鎖上門(mén)旨剥,后到的人看到上鎖咧欣,就在門(mén)口排隊(duì),等鎖打開(kāi)再進(jìn)去轨帜。這就叫"互斥鎖"(Mutual exclusion魄咕,縮寫(xiě) Mutex),防止多個(gè)線程同時(shí)讀寫(xiě)某一塊內(nèi)存區(qū)域蚌父。</li>
<li> 還有些房間哮兰,可以同時(shí)容納n個(gè)人,比如廚房苟弛。也就是說(shuō)喝滞,如果人數(shù)大于n,多出來(lái)的人只能在外面等著膏秫。這好比某些內(nèi)存區(qū)域右遭,只能供給固定數(shù)目的線程使用。</li>
<li> 這時(shí)的解決方法缤削,就是在門(mén)口掛n把鑰匙窘哈。進(jìn)去的人就取一把鑰匙,出來(lái)時(shí)再把鑰匙掛回原處亭敢。后到的人發(fā)現(xiàn)鑰匙架空了滚婉,就知道必須在門(mén)口排隊(duì)等著了。這種做法叫做"信號(hào)量"(Semaphore)吨拗,用來(lái)保證多個(gè)線程不會(huì)互相沖突。
不難看出,mutex是semaphore的一種特殊情況(n=1時(shí))劝篷。也就是說(shuō)哨鸭,完全可以用后者替代前者。但是娇妓,因?yàn)閙utex較為簡(jiǎn)單像鸡,且效率高,所以在必須保證資源獨(dú)占的情況下哈恰,還是采用這種設(shè)計(jì)只估。</li>
<li> 操作系統(tǒng)的設(shè)計(jì),因此可以歸結(jié)為三點(diǎn):
(1)以多進(jìn)程形式着绷,允許多個(gè)任務(wù)同時(shí)運(yùn)行蛔钙;
(2)以多線程形式,允許單個(gè)任務(wù)分成不同的部分運(yùn)行荠医;
(3)提供協(xié)調(diào)機(jī)制吁脱,一方面防止進(jìn)程之間和線程之間產(chǎn)生沖突,另一方面允許進(jìn)程之間和線程之間共享資源彬向。
</li>