程序并不能單獨(dú)執(zhí)行玻蝌,只有將程序加載到內(nèi)存中扒寄,系統(tǒng)為他分配資源后才能夠執(zhí)行或杠,這種執(zhí)行的程序稱之為進(jìn)程哪怔,也就是說進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,每個(gè)進(jìn)程都有自己?jiǎn)为?dú)的地址空間向抢。所以說程序與進(jìn)程的區(qū)別在于认境,程序是指令的集合,是進(jìn)程運(yùn)行的靜態(tài)描述文本挟鸠,而進(jìn)程則是程序在系統(tǒng)上順序執(zhí)行時(shí)的動(dòng)態(tài)活動(dòng)叉信。
但是進(jìn)程存在著很多缺陷,主要集中在兩點(diǎn):?
(1).進(jìn)程只能在同一時(shí)間干一件事情艘希,如果想同時(shí)干兩件事或多件事情硼身,進(jìn)程就無能為力了。?
(2).進(jìn)程在執(zhí)行的過程中如果由于某種原因阻塞了覆享,例如等待輸入佳遂,整個(gè)進(jìn)程就會(huì)掛起,其他與輸入無關(guān)的工作也必須等待輸入結(jié)束后才能順序執(zhí)行撒顿。
為了解決上述兩點(diǎn)缺陷丑罪,引入了線程這個(gè)概念。
線程是進(jìn)程的一個(gè)實(shí)體,也是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,有時(shí)又被稱為輕權(quán)進(jìn)程或輕量級(jí)進(jìn)程吩屹,相對(duì)進(jìn)程而言跪另,線程是一個(gè)更加接近于執(zhí)行體的概念,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元煤搜,而線程自己基本上不擁有系統(tǒng)資源免绿,也沒有自己的地址空間,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),線程的改變只代表了 CPU 執(zhí)行過程的改變擦盾,而沒有發(fā)生進(jìn)程所擁有的資源變化嘲驾。除了CPU 之外,計(jì)算機(jī)內(nèi)的軟硬件資源的分配與線程無關(guān)厌衙,但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源距淫。
進(jìn)程和線程的主要差別在于操作系統(tǒng)并沒有將多個(gè)線程看作多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配婶希。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后蓬衡,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響喻杈,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量狰晚,但線程之間沒有單獨(dú)的地址空間筒饰,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯壁晒,但在進(jìn)程切換時(shí)瓷们,耗費(fèi)資源較大,效率要差一些秒咐,對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作谬晕,只能用線程,不能用進(jìn)程携取,每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口攒钳、順序執(zhí)行序列和程序的出口,但是線程不能夠獨(dú)立執(zhí)行雷滋,必須依存在應(yīng)用程序中不撑,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。
最后附一篇材料晤斩,以圖的方式將進(jìn)程和線程做了很好的類比:
計(jì)算機(jī)的核心是CPU焕檬,它承擔(dān)了所有的計(jì)算任務(wù)。它就像一座工廠澳泵,時(shí)刻在運(yùn)行实愚。
假定工廠的電力有限,一次只能供給一個(gè)車間使用。也就是說爆侣,一個(gè)車間開工的時(shí)候萍程,其他車間都必須停工。背后的含義就是兔仰,單個(gè)CPU一次只能運(yùn)行一個(gè)任務(wù)
進(jìn)程就好比工廠的車間茫负,它代表CPU所能處理的單個(gè)任務(wù)。任一時(shí)刻乎赴,CPU總是運(yùn)行一個(gè)進(jìn)程忍法,其他進(jìn)程處于非運(yùn)行狀態(tài)。
一個(gè)車間里榕吼,可以有很多工人饿序。他們協(xié)同完成一個(gè)任務(wù)。
線程就好比車間里的工人羹蚣。一個(gè)進(jìn)程可以包括多個(gè)線程原探。
車間的空間是工人們共享的,比如許多房間是每個(gè)工人都可以進(jìn)出的顽素。這象征一個(gè)進(jìn)程的內(nèi)存空間是共享的咽弦,每個(gè)線程都可以使用這些共享內(nèi)存。
可是胁出,每間房間的大小不同型型,有些房間最多只能容納一個(gè)人,比如廁所全蝶。里面有人的時(shí)候闹蒜,其他人就不能進(jìn)去了。這代表一個(gè)線程使用某些共享內(nèi)存時(shí)抑淫,其他線程必須等它結(jié)束绷落,才能使用這一塊內(nèi)存。
一個(gè)防止他人進(jìn)入的簡(jiǎn)單方法丈冬,就是門口加一把鎖嘱函。先到的人鎖上門,后到的人看到上鎖埂蕊,就在門口排隊(duì)往弓,等鎖打開再進(jìn)去。這就叫”互斥鎖”(Mutual exclusion蓄氧,縮寫 Mutex)函似,防止多個(gè)線程同時(shí)讀寫某一塊內(nèi)存區(qū)域。
還有些房間喉童,可以同時(shí)容納n個(gè)人撇寞,比如廚房。也就是說,如果人數(shù)大于n蔑担,多出來的人只能在外面等著牌废。這好比某些內(nèi)存區(qū)域,只能供給固定數(shù)目的線程使用啤握。
這時(shí)的解決方法鸟缕,就是在門口掛n把鑰匙。進(jìn)去的人就取一把鑰匙排抬,出來時(shí)再把鑰匙掛回原處懂从。后到的人發(fā)現(xiàn)鑰匙架空了,就知道必須在門口排隊(duì)等著了蹲蒲。這種做法叫做”信號(hào)量”(Semaphore)番甩,用來保證多個(gè)線程不會(huì)互相沖突。?
不難看出届搁,mutex是semaphore的一種特殊情況(n=1時(shí))缘薛。也就是說,完全可以用后者替代前者卡睦。但是掩宜,因?yàn)閙utex較為簡(jiǎn)單,且效率高么翰,所以在必須保證資源獨(dú)占的情況下,還是采用這種設(shè)計(jì)辽旋。
操作系統(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)程之間和線程之間共享資源。