第二章 進程管理
2.1 進程的基本概念
在傳統的操作系統中,程序并不能獨立運行,作為資源分配和獨立運行的基本單位都是進程。
2.1.1 程序的順序執行及其特征
1、程序的順序執行
把一個應用程序分成若干個程序段,在各程序段之間,必須按照某種先后次序順序執行,僅當前一操作(程序段)執行完后,才能執行后及操作。
2、程序順序執行時的特征
1)順序性
處理機的操作嚴格按照程序所規定的順序執行,即每一操作必須在上一個操作結束之后開始
2)封閉性
程序是在封閉環境下執行的,即程序運行時獨占全機資源,資源的狀態(除初始狀態外)只有本程序才能改變它。程序一旦執行,其執行結果不受外界因素影響。
3)可再現性
只要程序執行是的環境和初始條件相同,當程序重復執行時,不論它是從頭到尾不停頓的執行,還是斷續執行,都將獲得相同的結果
2.1.2 前趨圖
前趨圖(Precedence Graph)是一個有向無循環圖,記為DAG(Directed Acyclic Graph),用于描述進程之間之行的前后關系。如圖:
圖中的每個節點可用于描述一個程序段或進程,乃至一條語句;節點間的有向邊表示兩個節點之間存在的偏序關系(Partial Order)或者前趨關系(Precedence Relation)“→”。
→={(Pi,Pj)|Pi must complete before Pj may start},如果(Pi,Pj)∈→,可寫成Pi→Pj,稱Pi是Pj的直接前趨,而稱Pj是Pi的直接后繼。在前趨圖中,把沒有前趨的結點稱為初始結點(Initial Node),把沒有后繼的結點稱為終止結點(Final Node)。此外,每個結點還具有一個重量(Weight),用于表示該結點所含有的程序量或結點的執行時間。在圖2-1(a)和2-1(b)中分別存在著這樣的前趨關系:
Ii→Ci→Pi? 和? S1→S2→S3
對于圖2-2(a) 所示的前趨圖,存在下述前趨關系:
?????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)}
應當注意,前趨圖中必須不存在循環,但在圖2-2(b)中卻有這下述的前趨關系:
S2→S3,S3→S2
顯然,這種前趨關系是不可能滿足的。
2.1.3 程序的并發執行及其特征
1、程序的并發執行
輸入程序在輸入第一個程序后,在計算程序對該程序進行計算的同時,可由輸入程序再輸入第二個程序,從而使第一個程序的計算操作可與第二個程序的輸入操作并發執行。一般來說,輸入程序在輸入第 i+1個程序時,計算程序可能正在對第 i 個程序進行計算,而答應程序正在打印第 i-1個程序的計算結果。
2、程序并發執行時的特征
1)間斷性
程序在并發執行時,由于它們共享系統資源,以及為完成同一項任務而相互合作,致使在這些并發執行的程序之間,形成了相互制約的關系。相互制約將導致并發程序具有“執行——暫停——執行”這種間斷性的活動規律。
2)失去封閉性
程序在并發執行時,是多個程序共享系統中的各種資源。因而這些資源的狀態將有多個程序來改變,致使程序的運行失去了封閉性。這樣,某程序在執行時,必然會受到其他程序的影響。
3)不可再現性
程序在并發執行時,失去了封閉性,計算結果已與并發程序的執行速度有關,從而使程序的執行失去了可再現性,亦即,程序經過多次執行后,雖然它們執行時的環境和初始條件相同,但得到的結果卻各不相同。
2.1.4 進程的特征與狀態
1、進程的特征和定義
1)結構特征
通常的程序是不能并發執行的。為使程序(含數據)能獨立運行,應為之配置一進程控制塊,即 PCB(Process Control Block):而由程序段、相關的數據段和 PCB 三部分便構成了進程實體。在早期的 UNIX 版本中,把這三部分總稱為“進程映像”。在許多情況下所說的進程,實際上是指進程實體,如,所謂創建進程,實質上是創建進程實體中的 PCB;而撤銷進程,實質上是撤銷進程的 PCB。
2)動態性
進程的實質是進程實體的一次執行過程,因此,動態性是進程的最基本特征。進程實體有一定的生命期,而程序則只是一組有序指令的集合,并存放區某種介質上,其本身并不具有運動的含義,因而是靜態的。
3)并發性
并發性是指多個進程實體同存于內存中,且能在一段時間內同時運行。并發性是進程的重要特征,同時也成為 OS 的重要特征。引入進程的目的也正是為了使其進程實體能和其它進程實體并發執行;而程序(沒有建立 PCB)是不能進行并發執行的。
4)獨立性
在傳統的 OS 中,獨立性是指進程實體是一個能獨立運行、獨立分配資源和獨立接受調度的基本單位。凡未建立 PCB 的程序都不能作為一個獨立的單位參與運行
5)異步性
這是指進程按各自獨立、不可預知的速度向前推進,或說進程實體按異步方式運行。
①進程是程序的一次執行
②進程是一個程序及其數據在處理機上順序執行時所發生的活動
③進程是程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位
在引入了進程實體的概念后,我們可以把傳統的 OS 中的進程定義為:“進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位”。
2、進程的三種基本狀態
1)就緒狀態
當進程已分配到除 CPU 以外的所有必要資源后,只要再獲得 CPU,便可立即執行,進程這時的狀態稱為就緒狀態。在一個系統中處于就緒狀態的進程可能有多個,通常將它們排成一個隊列,稱為就緒隊列。
2)執行狀態
進程已獲得 CPU,其程序正在執行。在單處理機系統中,只有一個進程處于執行狀態;在多處理機系統中,則有多個進程處于執行狀態。
3)阻塞狀態
正在執行的進程由于發生某事件而暫時無法繼續執行時,便放棄處理機而處于暫停狀態,亦即進程的執行收到阻塞,把這種暫停狀態成為阻塞狀態,有時也稱為等待狀態或封鎖狀態。
致使進程阻塞的典型事件有:請求 I/O,申請緩沖空間等。
3、掛起狀態
1)引入掛起狀態的原因
①終端用戶的請求
②父進程請求
③負荷調節的需要
④操作系統的需要
2)進程狀態的轉換
①活動就緒→靜止就緒
②活動阻塞→靜止阻塞
③靜止就緒→活動就緒
④靜止阻塞→活動阻塞
4、創建狀態和終止狀態
1)創建狀態
創建一個進程一般要通過兩個步驟:首先,為一個新進程創建 PCB,并填寫必要的管理信息;其次,把該進程轉入就緒狀態并插入就緒隊列中,當一個新進程被創建時,系統已為其分配了 PCB,填寫了進程標識等信息,但由于該進程所必須的資源或其他信息,如主存資源尚未分配時等,一般而言,此時的進程已擁有了自己的 PCB,但進程自身還未進入主存,即創建工作尚未完成,進程還不能被調度運行,其所處的狀態就是創建狀態。
引入創建狀態,是為了保證進程的調度必須在創建工作完成后進行,以確保對進程控制塊操作的完整性。同時,創建狀態的引入,也增加了管理的靈活性,操作系統可以根據系統性能或主存容量的限制,推遲創建狀態進程的提交。對于處于創建狀態的進程,獲得了其所必須的資源,以及對其 PCB 初始化工作完成后,進程狀態便可由創建狀態轉入就緒狀態。
2)終止狀態
進程的終止也要通過兩個步驟:首先等待操作系統進行善后處理,然后將其 PCB 清零,并將 PCB 空間返還系統。當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,它將進入終止狀態。進入終止狀態的進程以后不能再執行,但在操作系統中依然保留一個記錄,其中保存狀態碼和一些計時統計數據,供其他進程收集。一旦其他進程完成了對終止狀態進程的信息提取之后,操作系統將刪除該進程。
如圖2-8所示,引進創建和終止狀態后,在進程狀態轉換時,相比較2-7所示的進程五狀態而言,需要增加考慮下面的幾種情況。
①NULL→創建:一個新進程產生時,該進程處于創建狀態。
②創建→活動就緒:在當前系統的性能和內存的容量均允許的情況下,完成對進程創建的必要操作后,相應的系統進程將進程的狀態轉換為活動就緒狀態。
③創建→靜止就緒:考慮到系統當前資源狀況和性能要求,并不分配給新建進程所需資源,主要是主存資源,相應的系統進程將進程狀態轉換為靜止就緒狀態,對換到外存,不再參與調度,此時進程創建工作尚未完成。
④執行→終止:當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,進程即進入終止狀態。
2.1.5 進程控制塊
1、進程控制塊的作用
為了描述和控制進程的運行,系統為每個進程定義了一個數據結構——進程控制塊 PCB(Process Control Block),它是進程實體的一部分,是操作系統中最重要的記錄數據結構。PCB 中記錄了操作系統所需的、用于描述進程的當前情況以及控制進程運行的全部信息。
進程控制塊的作用是使一個在多道程序環境下不能獨立運行的程序(含數據),成為一個能獨立運行的基本單位,一個能與其他進程并發執行的進程。或者說,OS 是根據 PCB 來對并發執行的進程進行控制和管理的。
在進程的整個生命期中,系統總是通過 PCB 對進程進行控制的,亦即,系統時根據進程的 PCB 而不是任何別的什么而感知到該進程的存在的,所以說,PCB 是進程存在的唯一標志。
2、進程控制塊中的信息
1)進程標識符
①內部標識符:在所有的操作系統中,都為了每一個進程賦予了一個唯一的數字標識符,它通常是一個進程的序號。設置內部標識符主要是為了方便系統使用。
②外部標識符:它由創建者提供,通常是由字母、數字組成,往往是由用戶(進程)在訪問該進程時使用。為了描述進程的家族關系,還應設置父進程標識及子進程標識。此外,還可以設置用戶標識,以指示擁有該進程的用戶。
2)處理及狀態
處理機狀態信息主要是由處理機的各種寄存器中的內容組成的。處理機在運行時,許多信息都放在寄存器中,當處理機被中斷時,所有這些信息都必須保存在 PCB 中,以便在該進程重新執行時,能從斷點繼續執行。這些寄存器包括:①通用寄存器,又稱為用戶可視寄存器,它們是用戶程序可以訪問的,用于暫存信息,在大多數處理機中,有8~32個通用寄存器,在 RISC 結構的計算機中可超過100個;②指令計數器,其中存放了要訪問的下一條指令的地址;③程序狀態字 PSW,其中含有狀態信息,如條件碼、執行方式、中斷屏蔽標志等;④用戶棧指針,指每個用戶進程都有一個或若干個與之相關的系統棧,用于存放過程和系統調用參數及調用地址,棧指針指向該棧的棧頂。
3)進程調度信息
在 PCB 中還存放一些與進程調度和進程對換有關的信息,包括:①進程狀態,指明進程的當前狀態,作為進程調度和對換時的依據;②進程優先級,用于描述進程使用處理機的優先級別的一個整數,優先級高德進程優先獲得處理機;③進程調度所需的其他信息,它們與所采用的進程調度算法有關,比如,進程已等待 CPU 的時間總和、進程已執行的時間總和等;④事件,指進程由執行狀態轉變為阻塞狀態所等待發生的事件,即阻塞原因。
4)進程控制信息
進程控制信息包括:①程序和數據的地址,指進程的程序和數據所在的內存或外存地址,以便再調度到該進程執行時,能從 PCB 中找到其程序和數據;②進程同步和通信機制,指實現進程同步和進程通信時必須的機制,如消息隊列指針,信號量等,它們可能全部或部分地放在 PCB 中;③資源清單,即一張列出了出 CPU 以外的、進程所需的全部資源及已經分配到該進程的資源的清單;④鏈接指針,它給出了本進程(PCB)所在隊列中的下一個進程的 PCB 的首地址。
3、進程控制塊的組織方式
1)鏈接方式
把具有同一狀態的 PCB,用其中的鏈接字鏈接成一個隊列。可以形成就緒隊列、若干個阻塞隊列和空白隊列等。對其中的就緒隊列常按進程優先級的高低排列,把優先級高的進程的 PCB 排在隊列前面。此外,也可根據阻塞原因的不同把處于阻塞狀態的進程的 PCB 排成等待 I/O 操作完成的隊列和等待分配內存的隊列等。如圖:
2)索引方式
系統根據所有進程的狀態建立幾張索引表。例如,就緒索引表、阻塞索引表等,并把各索引表在內的首地址記錄在內存的一些專用單元中。在每個索引表的表目中,記錄具有相應狀態的某個 PCB 在 PCB 表中的地址。如圖:示出了索引方式的 PCB 組織。