第二章 進(jìn)程管理
2.1 進(jìn)程的基本概念
在傳統(tǒng)的操作系統(tǒng)中,程序并不能獨(dú)立運(yùn)行,作為資源分配和獨(dú)立運(yùn)行的基本單位都是進(jìn)程。
2.1.1 程序的順序執(zhí)行及其特征
1、程序的順序執(zhí)行
把一個(gè)應(yīng)用程序分成若干個(gè)程序段,在各程序段之間,必須按照某種先后次序順序執(zhí)行,僅當(dāng)前一操作(程序段)執(zhí)行完后,才能執(zhí)行后及操作。
2、程序順序執(zhí)行時(shí)的特征
1)順序性
處理機(jī)的操作嚴(yán)格按照程序所規(guī)定的順序執(zhí)行,即每一操作必須在上一個(gè)操作結(jié)束之后開始
2)封閉性
程序是在封閉環(huán)境下執(zhí)行的,即程序運(yùn)行時(shí)獨(dú)占全機(jī)資源,資源的狀態(tài)(除初始狀態(tài)外)只有本程序才能改變它。程序一旦執(zhí)行,其執(zhí)行結(jié)果不受外界因素影響。
3)可再現(xiàn)性
只要程序執(zhí)行是的環(huán)境和初始條件相同,當(dāng)程序重復(fù)執(zhí)行時(shí),不論它是從頭到尾不停頓的執(zhí)行,還是斷續(xù)執(zhí)行,都將獲得相同的結(jié)果
2.1.2 前趨圖
前趨圖(Precedence Graph)是一個(gè)有向無(wú)循環(huán)圖,記為DAG(Directed Acyclic Graph),用于描述進(jìn)程之間之行的前后關(guān)系。如圖:

圖中的每個(gè)節(jié)點(diǎn)可用于描述一個(gè)程序段或進(jìn)程,乃至一條語(yǔ)句;節(jié)點(diǎn)間的有向邊表示兩個(gè)節(jié)點(diǎn)之間存在的偏序關(guān)系(Partial Order)或者前趨關(guān)系(Precedence Relation)“→”。
→={(Pi,Pj)|Pi must complete before Pj may start},如果(Pi,Pj)∈→,可寫成Pi→Pj,稱Pi是Pj的直接前趨,而稱Pj是Pi的直接后繼。在前趨圖中,把沒有前趨的結(jié)點(diǎn)稱為初始結(jié)點(diǎn)(Initial Node),把沒有后繼的結(jié)點(diǎn)稱為終止結(jié)點(diǎn)(Final Node)。此外,每個(gè)結(jié)點(diǎn)還具有一個(gè)重量(Weight),用于表示該結(jié)點(diǎn)所含有的程序量或結(jié)點(diǎn)的執(zhí)行時(shí)間。在圖2-1(a)和2-1(b)中分別存在著這樣的前趨關(guān)系:
Ii→Ci→Pi? 和? S1→S2→S3
對(duì)于圖2-2(a) 所示的前趨圖,存在下述前趨關(guān)系:
?????P1→P2,P1→P3,P1→P4,P2→P5,P3→P5,P4→P6,P4→P7,P5→P8,P6→P8,P7→P9,P8→P9
或表示為:
P={P1,P2,P3,P4,P5,P6,P7,P8,P9}→={(P1,P2),(P1,P3),(P1,P4),(P2,P5),(P3,P5),(P4,P6),(P4,P7),(P5,P8),(P6,P8),(P7,P9),(P8,P9)}
應(yīng)當(dāng)注意,前趨圖中必須不存在循環(huán),但在圖2-2(b)中卻有這下述的前趨關(guān)系:
S2→S3,S3→S2
顯然,這種前趨關(guān)系是不可能滿足的。
2.1.3 程序的并發(fā)執(zhí)行及其特征
1、程序的并發(fā)執(zhí)行
輸入程序在輸入第一個(gè)程序后,在計(jì)算程序?qū)υ摮绦蜻M(jìn)行計(jì)算的同時(shí),可由輸入程序再輸入第二個(gè)程序,從而使第一個(gè)程序的計(jì)算操作可與第二個(gè)程序的輸入操作并發(fā)執(zhí)行。一般來(lái)說(shuō),輸入程序在輸入第 i+1個(gè)程序時(shí),計(jì)算程序可能正在對(duì)第 i 個(gè)程序進(jìn)行計(jì)算,而答應(yīng)程序正在打印第 i-1個(gè)程序的計(jì)算結(jié)果。
2、程序并發(fā)執(zhí)行時(shí)的特征
1)間斷性
程序在并發(fā)執(zhí)行時(shí),由于它們共享系統(tǒng)資源,以及為完成同一項(xiàng)任務(wù)而相互合作,致使在這些并發(fā)執(zhí)行的程序之間,形成了相互制約的關(guān)系。相互制約將導(dǎo)致并發(fā)程序具有“執(zhí)行——暫?!獔?zhí)行”這種間斷性的活動(dòng)規(guī)律。
2)失去封閉性
程序在并發(fā)執(zhí)行時(shí),是多個(gè)程序共享系統(tǒng)中的各種資源。因而這些資源的狀態(tài)將有多個(gè)程序來(lái)改變,致使程序的運(yùn)行失去了封閉性。這樣,某程序在執(zhí)行時(shí),必然會(huì)受到其他程序的影響。
3)不可再現(xiàn)性
程序在并發(fā)執(zhí)行時(shí),失去了封閉性,計(jì)算結(jié)果已與并發(fā)程序的執(zhí)行速度有關(guān),從而使程序的執(zhí)行失去了可再現(xiàn)性,亦即,程序經(jīng)過(guò)多次執(zhí)行后,雖然它們執(zhí)行時(shí)的環(huán)境和初始條件相同,但得到的結(jié)果卻各不相同。
2.1.4 進(jìn)程的特征與狀態(tài)
1、進(jìn)程的特征和定義
1)結(jié)構(gòu)特征
通常的程序是不能并發(fā)執(zhí)行的。為使程序(含數(shù)據(jù))能獨(dú)立運(yùn)行,應(yīng)為之配置一進(jìn)程控制塊,即 PCB(Process Control Block):而由程序段、相關(guān)的數(shù)據(jù)段和 PCB 三部分便構(gòu)成了進(jìn)程實(shí)體。在早期的 UNIX 版本中,把這三部分總稱為“進(jìn)程映像”。在許多情況下所說(shuō)的進(jìn)程,實(shí)際上是指進(jìn)程實(shí)體,如,所謂創(chuàng)建進(jìn)程,實(shí)質(zhì)上是創(chuàng)建進(jìn)程實(shí)體中的 PCB;而撤銷進(jìn)程,實(shí)質(zhì)上是撤銷進(jìn)程的 PCB。
2)動(dòng)態(tài)性
進(jìn)程的實(shí)質(zhì)是進(jìn)程實(shí)體的一次執(zhí)行過(guò)程,因此,動(dòng)態(tài)性是進(jìn)程的最基本特征。進(jìn)程實(shí)體有一定的生命期,而程序則只是一組有序指令的集合,并存放區(qū)某種介質(zhì)上,其本身并不具有運(yùn)動(dòng)的含義,因而是靜態(tài)的。
3)并發(fā)性
并發(fā)性是指多個(gè)進(jìn)程實(shí)體同存于內(nèi)存中,且能在一段時(shí)間內(nèi)同時(shí)運(yùn)行。并發(fā)性是進(jìn)程的重要特征,同時(shí)也成為 OS 的重要特征。引入進(jìn)程的目的也正是為了使其進(jìn)程實(shí)體能和其它進(jìn)程實(shí)體并發(fā)執(zhí)行;而程序(沒有建立 PCB)是不能進(jìn)行并發(fā)執(zhí)行的。
4)獨(dú)立性
在傳統(tǒng)的 OS 中,獨(dú)立性是指進(jìn)程實(shí)體是一個(gè)能獨(dú)立運(yùn)行、獨(dú)立分配資源和獨(dú)立接受調(diào)度的基本單位。凡未建立 PCB 的程序都不能作為一個(gè)獨(dú)立的單位參與運(yùn)行
5)異步性
這是指進(jìn)程按各自獨(dú)立、不可預(yù)知的速度向前推進(jìn),或說(shuō)進(jìn)程實(shí)體按異步方式運(yùn)行。
①進(jìn)程是程序的一次執(zhí)行
②進(jìn)程是一個(gè)程序及其數(shù)據(jù)在處理機(jī)上順序執(zhí)行時(shí)所發(fā)生的活動(dòng)
③進(jìn)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過(guò)程,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位
在引入了進(jìn)程實(shí)體的概念后,我們可以把傳統(tǒng)的 OS 中的進(jìn)程定義為:“進(jìn)程是進(jìn)程實(shí)體的運(yùn)行過(guò)程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位”。
2、進(jìn)程的三種基本狀態(tài)
1)就緒狀態(tài)
當(dāng)進(jìn)程已分配到除 CPU 以外的所有必要資源后,只要再獲得 CPU,便可立即執(zhí)行,進(jìn)程這時(shí)的狀態(tài)稱為就緒狀態(tài)。在一個(gè)系統(tǒng)中處于就緒狀態(tài)的進(jìn)程可能有多個(gè),通常將它們排成一個(gè)隊(duì)列,稱為就緒隊(duì)列。
2)執(zhí)行狀態(tài)
進(jìn)程已獲得 CPU,其程序正在執(zhí)行。在單處理機(jī)系統(tǒng)中,只有一個(gè)進(jìn)程處于執(zhí)行狀態(tài);在多處理機(jī)系統(tǒng)中,則有多個(gè)進(jìn)程處于執(zhí)行狀態(tài)。
3)阻塞狀態(tài)
正在執(zhí)行的進(jìn)程由于發(fā)生某事件而暫時(shí)無(wú)法繼續(xù)執(zhí)行時(shí),便放棄處理機(jī)而處于暫停狀態(tài),亦即進(jìn)程的執(zhí)行收到阻塞,把這種暫停狀態(tài)成為阻塞狀態(tài),有時(shí)也稱為等待狀態(tài)或封鎖狀態(tài)。
致使進(jìn)程阻塞的典型事件有:請(qǐng)求 I/O,申請(qǐng)緩沖空間等。

3、掛起狀態(tài)
1)引入掛起狀態(tài)的原因
①終端用戶的請(qǐng)求
②父進(jìn)程請(qǐng)求
③負(fù)荷調(diào)節(jié)的需要
④操作系統(tǒng)的需要
2)進(jìn)程狀態(tài)的轉(zhuǎn)換
①活動(dòng)就緒→靜止就緒
②活動(dòng)阻塞→靜止阻塞
③靜止就緒→活動(dòng)就緒
④靜止阻塞→活動(dòng)阻塞

4、創(chuàng)建狀態(tài)和終止?fàn)顟B(tài)
1)創(chuàng)建狀態(tài)
創(chuàng)建一個(gè)進(jìn)程一般要通過(guò)兩個(gè)步驟:首先,為一個(gè)新進(jìn)程創(chuàng)建 PCB,并填寫必要的管理信息;其次,把該進(jìn)程轉(zhuǎn)入就緒狀態(tài)并插入就緒隊(duì)列中,當(dāng)一個(gè)新進(jìn)程被創(chuàng)建時(shí),系統(tǒng)已為其分配了 PCB,填寫了進(jìn)程標(biāo)識(shí)等信息,但由于該進(jìn)程所必須的資源或其他信息,如主存資源尚未分配時(shí)等,一般而言,此時(shí)的進(jìn)程已擁有了自己的 PCB,但進(jìn)程自身還未進(jìn)入主存,即創(chuàng)建工作尚未完成,進(jìn)程還不能被調(diào)度運(yùn)行,其所處的狀態(tài)就是創(chuàng)建狀態(tài)。
引入創(chuàng)建狀態(tài),是為了保證進(jìn)程的調(diào)度必須在創(chuàng)建工作完成后進(jìn)行,以確保對(duì)進(jìn)程控制塊操作的完整性。同時(shí),創(chuàng)建狀態(tài)的引入,也增加了管理的靈活性,操作系統(tǒng)可以根據(jù)系統(tǒng)性能或主存容量的限制,推遲創(chuàng)建狀態(tài)進(jìn)程的提交。對(duì)于處于創(chuàng)建狀態(tài)的進(jìn)程,獲得了其所必須的資源,以及對(duì)其 PCB 初始化工作完成后,進(jìn)程狀態(tài)便可由創(chuàng)建狀態(tài)轉(zhuǎn)入就緒狀態(tài)。
2)終止?fàn)顟B(tài)
進(jìn)程的終止也要通過(guò)兩個(gè)步驟:首先等待操作系統(tǒng)進(jìn)行善后處理,然后將其 PCB 清零,并將 PCB 空間返還系統(tǒng)。當(dāng)一個(gè)進(jìn)程到達(dá)了自然結(jié)束點(diǎn),或是出現(xiàn)了無(wú)法克服的錯(cuò)誤,或是被操作系統(tǒng)所終結(jié),或是被其他有終止權(quán)的進(jìn)程所終結(jié),它將進(jìn)入終止?fàn)顟B(tài)。進(jìn)入終止?fàn)顟B(tài)的進(jìn)程以后不能再執(zhí)行,但在操作系統(tǒng)中依然保留一個(gè)記錄,其中保存狀態(tài)碼和一些計(jì)時(shí)統(tǒng)計(jì)數(shù)據(jù),供其他進(jìn)程收集。一旦其他進(jìn)程完成了對(duì)終止?fàn)顟B(tài)進(jìn)程的信息提取之后,操作系統(tǒng)將刪除該進(jìn)程。


如圖2-8所示,引進(jìn)創(chuàng)建和終止?fàn)顟B(tài)后,在進(jìn)程狀態(tài)轉(zhuǎn)換時(shí),相比較2-7所示的進(jìn)程五狀態(tài)而言,需要增加考慮下面的幾種情況。
①NULL→創(chuàng)建:一個(gè)新進(jìn)程產(chǎn)生時(shí),該進(jìn)程處于創(chuàng)建狀態(tài)。
②創(chuàng)建→活動(dòng)就緒:在當(dāng)前系統(tǒng)的性能和內(nèi)存的容量均允許的情況下,完成對(duì)進(jìn)程創(chuàng)建的必要操作后,相應(yīng)的系統(tǒng)進(jìn)程將進(jìn)程的狀態(tài)轉(zhuǎn)換為活動(dòng)就緒狀態(tài)。
③創(chuàng)建→靜止就緒:考慮到系統(tǒng)當(dāng)前資源狀況和性能要求,并不分配給新建進(jìn)程所需資源,主要是主存資源,相應(yīng)的系統(tǒng)進(jìn)程將進(jìn)程狀態(tài)轉(zhuǎn)換為靜止就緒狀態(tài),對(duì)換到外存,不再參與調(diào)度,此時(shí)進(jìn)程創(chuàng)建工作尚未完成。
④執(zhí)行→終止:當(dāng)一個(gè)進(jìn)程到達(dá)了自然結(jié)束點(diǎn),或是出現(xiàn)了無(wú)法克服的錯(cuò)誤,或是被操作系統(tǒng)所終結(jié),或是被其他有終止權(quán)的進(jìn)程所終結(jié),進(jìn)程即進(jìn)入終止?fàn)顟B(tài)。
2.1.5 進(jìn)程控制塊
1、進(jìn)程控制塊的作用
為了描述和控制進(jìn)程的運(yùn)行,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊 PCB(Process Control Block),它是進(jìn)程實(shí)體的一部分,是操作系統(tǒng)中最重要的記錄數(shù)據(jù)結(jié)構(gòu)。PCB 中記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息。
進(jìn)程控制塊的作用是使一個(gè)在多道程序環(huán)境下不能獨(dú)立運(yùn)行的程序(含數(shù)據(jù)),成為一個(gè)能獨(dú)立運(yùn)行的基本單位,一個(gè)能與其他進(jìn)程并發(fā)執(zhí)行的進(jìn)程。或者說(shuō),OS 是根據(jù) PCB 來(lái)對(duì)并發(fā)執(zhí)行的進(jìn)程進(jìn)行控制和管理的。
在進(jìn)程的整個(gè)生命期中,系統(tǒng)總是通過(guò) PCB 對(duì)進(jìn)程進(jìn)行控制的,亦即,系統(tǒng)時(shí)根據(jù)進(jìn)程的 PCB 而不是任何別的什么而感知到該進(jìn)程的存在的,所以說(shuō),PCB 是進(jìn)程存在的唯一標(biāo)志。
2、進(jìn)程控制塊中的信息
1)進(jìn)程標(biāo)識(shí)符
①內(nèi)部標(biāo)識(shí)符:在所有的操作系統(tǒng)中,都為了每一個(gè)進(jìn)程賦予了一個(gè)唯一的數(shù)字標(biāo)識(shí)符,它通常是一個(gè)進(jìn)程的序號(hào)。設(shè)置內(nèi)部標(biāo)識(shí)符主要是為了方便系統(tǒng)使用。
②外部標(biāo)識(shí)符:它由創(chuàng)建者提供,通常是由字母、數(shù)字組成,往往是由用戶(進(jìn)程)在訪問(wèn)該進(jìn)程時(shí)使用。為了描述進(jìn)程的家族關(guān)系,還應(yīng)設(shè)置父進(jìn)程標(biāo)識(shí)及子進(jìn)程標(biāo)識(shí)。此外,還可以設(shè)置用戶標(biāo)識(shí),以指示擁有該進(jìn)程的用戶。
2)處理及狀態(tài)
處理機(jī)狀態(tài)信息主要是由處理機(jī)的各種寄存器中的內(nèi)容組成的。處理機(jī)在運(yùn)行時(shí),許多信息都放在寄存器中,當(dāng)處理機(jī)被中斷時(shí),所有這些信息都必須保存在 PCB 中,以便在該進(jìn)程重新執(zhí)行時(shí),能從斷點(diǎn)繼續(xù)執(zhí)行。這些寄存器包括:①通用寄存器,又稱為用戶可視寄存器,它們是用戶程序可以訪問(wèn)的,用于暫存信息,在大多數(shù)處理機(jī)中,有8~32個(gè)通用寄存器,在 RISC 結(jié)構(gòu)的計(jì)算機(jī)中可超過(guò)100個(gè);②指令計(jì)數(shù)器,其中存放了要訪問(wèn)的下一條指令的地址;③程序狀態(tài)字 PSW,其中含有狀態(tài)信息,如條件碼、執(zhí)行方式、中斷屏蔽標(biāo)志等;④用戶棧指針,指每個(gè)用戶進(jìn)程都有一個(gè)或若干個(gè)與之相關(guān)的系統(tǒng)棧,用于存放過(guò)程和系統(tǒng)調(diào)用參數(shù)及調(diào)用地址,棧指針指向該棧的棧頂。
3)進(jìn)程調(diào)度信息
在 PCB 中還存放一些與進(jìn)程調(diào)度和進(jìn)程對(duì)換有關(guān)的信息,包括:①進(jìn)程狀態(tài),指明進(jìn)程的當(dāng)前狀態(tài),作為進(jìn)程調(diào)度和對(duì)換時(shí)的依據(jù);②進(jìn)程優(yōu)先級(jí),用于描述進(jìn)程使用處理機(jī)的優(yōu)先級(jí)別的一個(gè)整數(shù),優(yōu)先級(jí)高德進(jìn)程優(yōu)先獲得處理機(jī);③進(jìn)程調(diào)度所需的其他信息,它們與所采用的進(jìn)程調(diào)度算法有關(guān),比如,進(jìn)程已等待 CPU 的時(shí)間總和、進(jìn)程已執(zhí)行的時(shí)間總和等;④事件,指進(jìn)程由執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)所等待發(fā)生的事件,即阻塞原因。
4)進(jìn)程控制信息
進(jìn)程控制信息包括:①程序和數(shù)據(jù)的地址,指進(jìn)程的程序和數(shù)據(jù)所在的內(nèi)存或外存地址,以便再調(diào)度到該進(jìn)程執(zhí)行時(shí),能從 PCB 中找到其程序和數(shù)據(jù);②進(jìn)程同步和通信機(jī)制,指實(shí)現(xiàn)進(jìn)程同步和進(jìn)程通信時(shí)必須的機(jī)制,如消息隊(duì)列指針,信號(hào)量等,它們可能全部或部分地放在 PCB 中;③資源清單,即一張列出了出 CPU 以外的、進(jìn)程所需的全部資源及已經(jīng)分配到該進(jìn)程的資源的清單;④鏈接指針,它給出了本進(jìn)程(PCB)所在隊(duì)列中的下一個(gè)進(jìn)程的 PCB 的首地址。
3、進(jìn)程控制塊的組織方式
1)鏈接方式
把具有同一狀態(tài)的 PCB,用其中的鏈接字鏈接成一個(gè)隊(duì)列。可以形成就緒隊(duì)列、若干個(gè)阻塞隊(duì)列和空白隊(duì)列等。對(duì)其中的就緒隊(duì)列常按進(jìn)程優(yōu)先級(jí)的高低排列,把優(yōu)先級(jí)高的進(jìn)程的 PCB 排在隊(duì)列前面。此外,也可根據(jù)阻塞原因的不同把處于阻塞狀態(tài)的進(jìn)程的 PCB 排成等待 I/O 操作完成的隊(duì)列和等待分配內(nèi)存的隊(duì)列等。如圖:

2)索引方式
系統(tǒng)根據(jù)所有進(jìn)程的狀態(tài)建立幾張索引表。例如,就緒索引表、阻塞索引表等,并把各索引表在內(nèi)的首地址記錄在內(nèi)存的一些專用單元中。在每個(gè)索引表的表目中,記錄具有相應(yīng)狀態(tài)的某個(gè) PCB 在 PCB 表中的地址。如圖:示出了索引方式的 PCB 組織。
