了解進(jìn)程和線程的基本原理
1、進(jìn)程的生命周期
1)五狀態(tài)模型:包括新建態(tài)、就緒態(tài)、運(yùn)行態(tài)、阻塞態(tài)和退出態(tài)。

空—>新建態(tài):創(chuàng)建一個(gè)新的進(jìn)程。
新建態(tài)—>就緒態(tài):進(jìn)程被放入內(nèi)存中后,就可以變成就緒態(tài)。
就緒態(tài)—>運(yùn)行態(tài):進(jìn)程被cpu調(diào)度執(zhí)行。
運(yùn)行態(tài)—>就緒態(tài):分給該進(jìn)程的時(shí)間片被耗盡,或者更高優(yōu)先級(jí)的進(jìn)程搶占了cpu。
運(yùn)行態(tài)—>退出態(tài):進(jìn)程已運(yùn)行完成或取消。
運(yùn)行態(tài)—>阻塞態(tài):進(jìn)程等待某些事件的發(fā)送,如I/O操作。
阻塞態(tài)—>就緒態(tài):進(jìn)程等待的事件已發(fā)生。
就緒態(tài)—>退出態(tài):子進(jìn)程被父進(jìn)程終止,此時(shí)處于就緒態(tài)的子進(jìn)程將退出。如果父進(jìn)程終止,則其所有子進(jìn)程也將終止。
阻塞態(tài)—>退出態(tài):與上一項(xiàng)一樣。
2)包含掛起態(tài)的進(jìn)程生命模型
在五狀態(tài)模型的基礎(chǔ)上,新增了掛起態(tài)。
增加掛起態(tài)的原因是,IO操作的速度遠(yuǎn)慢于處理器的運(yùn)行速度。當(dāng)cpu調(diào)度完了所有進(jìn)程后,如果這些進(jìn)程全部處于阻塞狀態(tài),則cpu將處于空閑狀態(tài),這是一種資源的浪費(fèi)。
解決辦法是,讓可運(yùn)行的進(jìn)程再多一點(diǎn),就可以緩解這種尷尬的場(chǎng)面。操作系統(tǒng)采用交換進(jìn)程的操作,來(lái)讓處于空閑狀態(tài)的cpu可以繼續(xù)工作。當(dāng)內(nèi)存中沒有就緒狀態(tài)的進(jìn)程時(shí),操作系統(tǒng)就將被阻塞的進(jìn)程換出到磁盤上的掛起隊(duì)列上。這樣內(nèi)存中就有空間來(lái)接受一個(gè)新的進(jìn)程了。被換出的進(jìn)程處于掛起態(tài)。
并且,掛起態(tài)是與另外兩種狀態(tài)組合存在的。
就緒態(tài):進(jìn)程已在內(nèi)存中,等待被cpu調(diào)度。
就緒/掛起態(tài):進(jìn)程在磁盤中,但只要加載到內(nèi)存中,就可以等待被cpu調(diào)度。
阻塞態(tài):進(jìn)程已經(jīng)在內(nèi)存中,并且在等待某些事件的發(fā)生。
阻塞/掛起態(tài):進(jìn)程在磁盤中,并且在等待某些事件的發(fā)生。

2、進(jìn)程控制塊
進(jìn)程映像表示了一個(gè)進(jìn)程在虛擬內(nèi)存中的結(jié)構(gòu),包括程序代碼、用戶數(shù)據(jù)、棧(保存參數(shù)、局部變量、調(diào)用地址等)和屬性。共享地址空間是每個(gè)進(jìn)程所共享的一塊區(qū)域,比如操作系統(tǒng)的內(nèi)核代碼。

進(jìn)程的屬性是由一種稱為進(jìn)程控制塊的數(shù)據(jù)結(jié)構(gòu)來(lái)表示的。
進(jìn)程控制塊的信息可以分為3類:
進(jìn)程標(biāo)識(shí)信息。包括進(jìn)程的標(biāo)識(shí)符pid,該進(jìn)程的父進(jìn)程標(biāo)識(shí)符,用戶標(biāo)識(shí)符uid。
處理器狀態(tài)信息。包括用戶可見寄存器(用戶模式下可以使用的寄存器),控制和狀態(tài)寄存器(程序計(jì)數(shù)器、模式信息),棧指針(棧用于保存參數(shù)或過程調(diào)用的地址,棧指針指向棧頂)。
進(jìn)程控制信息。包括調(diào)度狀態(tài)信息(進(jìn)程狀態(tài)、優(yōu)先級(jí)、等待事件的標(biāo)識(shí)等),資源使用情況(進(jìn)程所控制的物理資源),存儲(chǔ)管理(描述分配給進(jìn)程的虛擬內(nèi)存的頁(yè)表指針)。
3、進(jìn)程執(zhí)行模式
處理器一般支持兩種執(zhí)行模式:用戶模式和內(nèi)核模式。某些級(jí)別較高的指令只能在內(nèi)核模式這種特權(quán)模式下運(yùn)行,包括讀寫控制寄存器、原始IO操作等。
處理器如何知道執(zhí)行什么模式?
當(dāng)由于例如系統(tǒng)調(diào)用這樣的操作被執(zhí)行時(shí),此時(shí)程序狀態(tài)字中某個(gè)指示執(zhí)行模式的位,就會(huì)發(fā)生改變,比如處理器狀態(tài)寄存器的CPL(當(dāng)前特權(quán)級(jí)別)字段會(huì)被置為0,級(jí)別0表示最高特權(quán)級(jí)別。
4、進(jìn)程創(chuàng)建
1)為新進(jìn)程分配一個(gè)唯一的進(jìn)程標(biāo)識(shí)符pid;
2)為新進(jìn)程分配空間,包括進(jìn)程映像中的所有元素;
3)初始化進(jìn)程控制塊。對(duì)進(jìn)程控制塊中的各字段值設(shè)置初始值,注意子進(jìn)程會(huì)繼承父進(jìn)程的資源;
4)設(shè)置進(jìn)程的鏈接,比如將一個(gè)新進(jìn)程放入就緒鏈表中;
5、進(jìn)程切換
1)保存處理器的上下文信息,包括程序計(jì)數(shù)器和其他寄存器的值;
2)更新當(dāng)前進(jìn)程的進(jìn)程控制塊,包括更改進(jìn)程狀態(tài);
3)根據(jù)進(jìn)程的狀態(tài),將該進(jìn)程的進(jìn)程控制塊加入到相應(yīng)的隊(duì)列,比如就緒隊(duì)列,事件i的阻塞隊(duì)列等;
4)處理器根據(jù)調(diào)度算法,選中另一個(gè)就緒進(jìn)程;
5)更改新進(jìn)程的進(jìn)程控制塊,包括更改進(jìn)程狀態(tài)為運(yùn)行態(tài);
6)更新內(nèi)存管理數(shù)據(jù)結(jié)構(gòu),是否需要更新取決于管理地址轉(zhuǎn)換的方式;
7)將處理器的上下文恢復(fù)為新進(jìn)程上次退出運(yùn)行時(shí)保存的上下文信息。
6、進(jìn)程與線程的區(qū)別
簡(jiǎn)單來(lái)說,進(jìn)程與資源所有權(quán)有關(guān),線程與執(zhí)行有關(guān)。
進(jìn)程:每個(gè)進(jìn)程擁有一塊獨(dú)立的虛擬地址空間,用于容納進(jìn)程映像;進(jìn)程是資源分配的基本單位,比如內(nèi)存、IO設(shè)備和文件等,并且這些資源是受操作系統(tǒng)保護(hù)的。
線程:一個(gè)進(jìn)程中可能有一個(gè)或多個(gè)線程,同一進(jìn)程內(nèi)的所有線程駐留在同一塊地址空間,每個(gè)線程擁有獨(dú)立的執(zhí)行狀態(tài)(運(yùn)行或就緒)、獨(dú)立的線程上下文、程序計(jì)數(shù)器、執(zhí)行棧。此外,每個(gè)線程與同一進(jìn)程內(nèi)的其他線程共享所在進(jìn)程所擁有的資源。
與進(jìn)程相比,線程的優(yōu)點(diǎn):
在某一進(jìn)程中創(chuàng)建一個(gè)新線程所花費(fèi)的時(shí)間,遠(yuǎn)少于創(chuàng)建一個(gè)新進(jìn)程的時(shí)間。
終止線程所花費(fèi)的時(shí)間,少于終止進(jìn)程所花費(fèi)的時(shí)間。
同一進(jìn)程內(nèi)切換線程所花費(fèi)的時(shí)間,少于切換進(jìn)程的時(shí)間。
同一進(jìn)程的多個(gè)線程共享內(nèi)存和文件,它們無(wú)需調(diào)用內(nèi)核就可以相互通信,而進(jìn)程間的通信需要內(nèi)核介入,以提供保護(hù)和通信所需的機(jī)制,所以線程間通信效率更高。
7、用戶級(jí)線程與內(nèi)核級(jí)線程
在多線程環(huán)境中,一個(gè)進(jìn)程可以定義多個(gè)并發(fā)線程,方法是使用用戶級(jí)線程或內(nèi)核級(jí)線程。
用戶級(jí)線程:由進(jìn)程用戶空間中運(yùn)行的線程庫(kù)來(lái)創(chuàng)建并管理,線程庫(kù)調(diào)度線程,類似于內(nèi)核調(diào)度進(jìn)程,而內(nèi)核是感知不到線程存在的。優(yōu)點(diǎn):切換用戶級(jí)線程時(shí),進(jìn)程不需要為了管理線程而切換到內(nèi)核模式,節(jié)省了兩次狀態(tài)轉(zhuǎn)換(即用戶模式到內(nèi)核模式,內(nèi)核模式到用戶模式)的開銷。缺點(diǎn):①由于內(nèi)核不知道線程的存在,內(nèi)核是以進(jìn)程為單位進(jìn)行調(diào)度的,所以當(dāng)進(jìn)程中的某一個(gè)線程阻塞時(shí),就會(huì)認(rèn)為整個(gè)進(jìn)程就阻塞了。②并且,內(nèi)核每次只把一個(gè)進(jìn)程分配給一個(gè)處理器,那么一個(gè)進(jìn)程內(nèi)就無(wú)法使用多處理器處理技術(shù)。
內(nèi)核級(jí)線程:由內(nèi)核維護(hù),所以內(nèi)核可以感知到線程的存在。那么,用戶級(jí)線程中的缺點(diǎn)可以得到解決,即同一進(jìn)程的多個(gè)進(jìn)程可以在多處理器上并行執(zhí)行,且一個(gè)線程的阻塞不會(huì)阻塞整個(gè)進(jìn)程。但是,用戶級(jí)線程的優(yōu)點(diǎn)也變成了內(nèi)核級(jí)線程的缺點(diǎn),即線程間切換需要進(jìn)行模式轉(zhuǎn)換。
