第二章 進(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)程)在訪問該進(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í)行。這些寄存器包括:①通用寄存器栅盲,又稱為用戶可視寄存器汪诉,它們是用戶程序可以訪問的,用于暫存信息谈秫,在大多數(shù)處理機(jī)中摩瞎,有8~32個(gè)通用寄存器拴签,在 RISC 結(jié)構(gòu)的計(jì)算機(jī)中可超過(guò)100個(gè)孝常;②指令計(jì)數(shù)器旗们,其中存放了要訪問的下一條指令的地址;③程序狀態(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 組織激涤。