計算機操作系統第二章 進程的描述與控制

計算機操作系統第二章 進程的描述與控制

2.1 前趨圖和程序執行

前趨圖

所謂前趨圖(Precedence Graph),是指一個有向無循環圖,可記爲DAG(Directed Acyclic Graph),它用於描述進程之間執行的先後順序。圖中的每個結點可用來表示一個進程或程序段,乃至一條語句,結點間的有向邊則表示兩個結點之間存在的偏序(Partial Order)或前趨關係(Precedence Relation)。進程(或程序)之間的前趨關係用“→”來表示,如果進程Pi和Pj存在着前趨關係,可表示爲(Pi,Pj)∈→,也可寫成Pi→Pj,表示在Pj開始執行之前Pi 必須完成。此時稱Pi是Pj的直接前趨,而稱Pj是Pi的直接後繼。在前趨圖中,把沒有前趨的結點稱爲初始結點(Initial Node),把沒有後繼的結點稱爲終止結點(Final Node)。此外,每個結點還具有一個重量(Weight),用於表示該結點所含有的程序量或程序的執行時間。

在圖2-1(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-1(b)所示的前趨關係中就存在着循環。它一方面要求在S3開始執行之前,S2必須完成,另一方面又要求在S2開始執行之前,S3必須完成。顯然,這種關係是不可能實現的。         S2→S3,S3→S2

程序順序執行

程序的順序執行

通常,一個應用程序由若干個程序段組成,每一個程序段完成特定的功能,它們在執行時,都需要按照某種先後次序順序執行,僅當前一程序段執行完後,才運行後一程序段。例如,在進行計算時,應先運行輸入程序,用於輸入用戶的程序和數據;然後運行計算程序,對所輸入的數據進行計算;最後纔是運行打印程序,打印計算結果。我們用結點(Node)代表各程序段的操作,其中I代表輸入操作,C代表計算操作,P爲打印操作,用箭頭指示操作的先後次序。這樣,上述的三個程序段間就存在着這樣的前趨關係:Ii→Ci→Pi

即使是一個程序段,也可能存在着執行順序問題,下面示出了一個包含了三條語句的程序段:
 S1: a :=x+y;
 S2: b :=a-5;
 S3: c :=b+1;
其中,語句S2必須在語句S1後(即a被賦值)才能執行,語句S3也只能在b被賦值後才能執行,因此,三條語句存在着這樣的前趨關係:S1→S2→S3

程序順序執行時的特徵

在程序順序執行時,具有這樣三個特徵:①順序性:指處理機嚴格地按照程序所規定的順序執行,即每一操作必須在下一個操作開始之前結束;② 封閉性:指程序在封閉的環境下運行,即程序運行時獨佔全機資源,資源的狀態(除初始狀態外)只有本程序才能改變它,程序一旦開始執行,其執行結果不受外界因素影響;③ 可再現性:指只要程序執行時的環境和初始條件相同,當程序重複執行時,不論它是從頭到尾不停頓地執行,還是“停停走走”地執行,都可獲得相同的結果。程序順序執行時的這種特性,爲程序員檢測和校正程序的錯誤帶來了很大的方便。

程序併發執行

程序的併發執行

我們通過一個常見的例子來說明程序的順序執行和併發執行。在上圖中的輸入程序、計算程序和打印程序三者之間,存在着Ii→Ci→Pi這樣的前趨關係,以至對一個作業的輸入、計算和打印三個程序段必須順序執行。但若是對一批作業進行處理時,每道作業的輸入、計算和打印程序段的執行情況如下圖所示。

由圖可以看出,存在前趨關係Ii→Ci,Ii→Ii+1,Ci→Pi,Ci→Ci+1,Pi→Pi+1,而Ii+1和Ci及Pi-1是重疊的,即在Pi-1和Ci以及Ii+1之間,不存在前趨關係,可以併發執行。

對於具有下述四條語句的程序段:
 S1: a :=x+2
 S2: b :=y+4
 S3: c :=a+b
 S4: d :=c+b

可以看出:S3必須在a和b被賦值後方能執行;S4必須在S3之後執行;但S1和S2則可以併發執行,因爲它們彼此互不依賴。

程序併發執行時的特徵

在引入了程序間的併發執行功能後,雖然提高了系統的吞吐量和資源利用率,但由於它們共享系統資源,以及它們爲完成同一項任務而相互合作,致使在這些併發執行的程序之間必將形成相互制約的關係,由此會給程序併發執行帶來新的特徵。

(1) 間斷性
(2) 失去封閉性
(3) 不可再現性

在多道程序環境下,程序的執行屬於併發執行,此時它們將失去其封閉性,並具有間斷性,以及其運行結果不可再現性的特徵。

2.2 進程的描述

進程的定義和特徵

進程的定義

對於進程的定義,從不同的角度可以有不同的定義,其中較典型的定義有:
 (1) 進程是程序的一次執行。
 (2) 進程是一個程序及其數據在處理機上順序執行時所發生的活動。
 (3) 進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位。

進程的特徵

進程和程序是兩個截然不同的概念,除了進程具有程序所沒有的PCB結構外,還具有下面一些特徵:
 (1) 動態性。
 (2) 併發性。
 (3) 獨立性。
 (4) 異步性。

進程的基本狀態及轉換

進程的三種基本狀態

由於多個進程在併發執行時共享系統資源,致使它們在運行過程中呈現間斷性的運行規律,所以進程在其生命週期內可能具有多種狀態。一般而言,每一個進程至少應處於以下三種基本狀態之一:
 (1) 就緒(Ready)狀態。
 (2) 執行(Running)狀態。
 (3) 阻塞(Block)狀態。

三種基本狀態的轉換

進程在運行過程中會經常發生狀態的轉換。例如,處於就緒狀態的進程,在調度程序爲之分配了處理機之後便可執行,相應地,其狀態就由就緒態轉變爲執行態;正在執行的進程(當前進程)如果因分配給它的時間片已完而被剝奪處理機暫停執行時,其狀態便由執行轉爲就緒;如果因發生某事件,致使當前進程的執行受阻(例如進程訪問某臨界資源,而該資源正被其它進程訪問時),使之無法繼續執行,則該進程狀態將由執行轉變爲阻塞。

創建狀態和終止狀態

創建狀態

如前所述,進程是由創建而產生。創建一個進程是個很複雜的過程,一般要通過多個步驟才能完成:如首先由進程申請一個空白PCB,並向PCB中填寫用於控制和管理進程的信息;然後爲該進程分配運行時所必須的資源;最後,把該進程轉入就緒狀態並插入就緒隊列之中。但如果進程所需的資源尚不能得到滿足,比如系統尚無足夠的內存使進程無法裝入其中,此時創建工作尚未完成,進程不能被調度運行,於是把此時進程所處的狀態稱爲創建狀態。

終止狀態

進程的終止也要通過兩個步驟:首先,是等待操作系統進行善後處理,最後將其PCB清零,並將PCB空間返還系統。當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,它將進入終止狀態。進入終止態的進程以後不能再執行,但在操作系統中依然保留一個記錄,其中保存狀態碼和一些計時統計數據,供其他進程收集。一旦其他進程完成了對其信息的提取之後,操作系統將刪除該進程,即將其PCB清零,並將該空白PCB返還系統。

掛起操作和進程狀態的轉換

掛起操作的引入

引入掛起操作的原因,是基於系統和用戶的如下需要:
 (1) 終端用戶的需要。
 (2) 父進程請求。
 (3) 負荷調節的需要。
 (4) 操作系統的需要。

引入掛起原語操作後三個進程狀態的轉換

在引入掛起原語Suspend和激活原語Active後,在它們的作用下,進程將可能發生以下幾種狀態的轉換:
 (1) 活動就緒→靜止就緒。
 (2) 活動阻塞→靜止阻塞。
 (3) 靜止就緒→活動就緒。
 (4) 靜止阻塞→活動阻塞。

引入掛起操作後五個進程狀態的轉換

(1) NULL→創建:
(2) 創建→活動就緒:
(3) 創建→靜止就緒:
(4) 執行→終止:

具有創建、終止和掛起狀態的進程狀態圖

進程管理中的數據結構

操作系統中用於管理控制的數據結構

在計算機系統中,對於每個資源和每個進程都設置了一個數據結構,用於表徵其實體,我們稱之爲資源信息表或進程信息表,其中包含了資源或進程的標識、描述、狀態等信息以及一批指針。通過這些指針,可以將同類資源或進程的信息表,或者同一進程所佔用的資源信息表分類鏈接成不同的隊列,便於操作系統進行查找。

OS管理的這些數據結構一般分爲以下四類:內存表、設備表、文件表和用於進程管理的進程表,通常進程表又被稱爲進程控制塊PCB

進程控制塊PCB的作用

(1) 作爲獨立運行基本單位的標誌。
(2) 能實現間斷性運行方式。
(3) 提供進程管理所需要的信息。
(4) 提供進程調度所需要的信息。
(5) 實現與其它進程的同步與通信。

進程控制塊中的信息

在進程控制塊中,主要包括下述四個方面的信息。

  1. 進程標識符
     進程標識符用於唯一地標識一個進程。一個進程通常有兩種標識符:外部表示符和內部表示符

  2. 處理機狀態
     處理機狀態信息也稱爲處理機的上下文,主要是由處理機的各種寄存器中的內容組成的

  3. 進程調度信息
     在OS進行調度時,必須瞭解進程的狀態及有關進程調度的信息,這些信息包括:①進程狀態,指明進程的當前狀態,它是作爲進程調度和對換時的依據;② 進程優先級,是用於描述進程使用處理機的優先級別的一個整數,優先級高的進程應優先獲得處理機;③ 進程調度所需的其它信息,它們與所採用的進程調度算法有關,比如,進程已等待CPU的時間總和、進程已執行的時間總和等;④ 事件,是指進程由執行狀態轉變爲阻塞狀態所等待發生的事件,即阻塞原因。

  4. 進程控制信息
     是指用於進程控制所必須的信息,它包括:① 程序和數據的地址,進程實體中的程序和數據的內存或外存地(首)址,以便再調度到該進程執行時,能從PCB中找到其程序和數據;② 進程同步和通信機制,這是實現進程同步和進程通信時必需的機制,如消息隊列指針、信號量等,它們可能全部或部分地放在PCB中;③ 資源清單,在該清單中列出了進程在運行期間所需的全部資源(除CPU以外),另外還有一張已分配到該進程的資源的清單;④ 鏈接指針,它給出了本進程(PCB)所在隊列中的下一個進程的PCB的首地址。

進程控制塊的組織方式

在一個系統中,通常可擁有數十個、數百個乃至數千個PCB。爲了能對它們加以有效的管理,應該用適當的方式將這些PCB組織起來。目前常用的組織方式有以下三種。

(1) 線性方式,即將系統中所有的PCB都組織在一張線性表中,將該表的首址存放在內存的一個專用區域中。該方式實現簡單、開銷小,但每次查找時都需要掃描整張表,因此適合進程數目不多的系統。

(2) 鏈接方式,即把具有相同狀態進程的PCB分別通過PCB中的鏈接字鏈接成一個隊列。這樣,可以形成就緒隊列、若干個阻塞隊列和空白隊列等。對就緒隊列而言,往往按進程的優先級將PCB從高到低進行排列,將優先級高的進程PCB排在隊列的前面。同樣,也可把處於阻塞狀態進程的PCB根據其阻塞原因的不同,排成多個阻塞隊列,如等待I/O操作完成的隊列和等待分配內存的隊列等。

(3) 索引方式,即系統根據所有進程狀態的不同,建立幾張索引表,例如,就緒索引表、阻塞索引表等,並把各索引表在內存的首地址記錄在內存的一些專用單元中。在每個索引表的表目中,記錄具有相應狀態的某個PCB在PCB表中的地址。

2.3 進程控制

操作系統內核

支撐功能

(1) 中斷處理。
(2) 時鐘管理。
(3) 原語操作。

資源管理功能

(1) 進程管理。
(2) 存儲器管理。
(3) 設備管理。

進程的創建

進程的層次結構

在OS中,允許一個進程創建另一個進程,通常把創建進程的進程稱爲父進程,而把被創建的進程稱爲子進程。子進程可繼續創建更多的孫進程,由此便形成了一個進程的層次結構。如在UNIX中,進程與其子孫進程共同組成一個進程家族(組)。

進程圖

爲了形象地描述一個進程的家族關係而引入了進程圖(Process Graph)。所謂進程圖就是用於描述進程間關係的一棵有向樹

引起創建進程的事件

爲使程序之間能併發運行,應先爲它們分別創建進程。導致一個進程去創建另一個進程的典型事件有四類:
 (1) 用戶登錄。
 (2) 作業調度。
 (3) 提供服務。
 (4) 應用請求。

進程的創建

在系統中每當出現了創建新進程的請求後,OS便調用進程創建原語Creat按下述步驟創建一個新進程:
 (1) 申請空白PCB,爲新進程申請獲得唯一的數字標識符,並從PCB集合中索取一個空白PCB。
 (2) 爲新進程分配其運行所需的資源,包括各種物理和邏輯資源,如內存、文件、I/O設備和CPU時間等。
 (3) 初始化進程控制塊(PCB)。
 (4) 如果進程就緒隊列能夠接納新進程,便將新進程插入就緒隊列。

進程的終止

引起進程終止(Termination of Process)的事件

(1) 正常結束
(2) 異常結束
(3) 外界干預

進程的終止過程

如果系統中發生了要求終止進程的某事件,OS便調用進程終止原語,按下述過程去終止指定的進程:

(1) 根據被終止進程的標識符,從PCB集合中檢索出該進程的PCB,從中讀出該進程的狀態;

(2) 若被終止進程正處於執行狀態,應立即終止該進程的執行,並置調度標誌爲真,用於指示該進程被終止後應重新進行調度;

(3) 若該進程還有子孫進程,還應將其所有子孫進程也都予以終止,以防它們成爲不可控的進程;

(4) 將被終止進程所擁有的全部資源或者歸還給其父進程,或者歸還給系統;

(5) 將被終止進程(PCB)從所在隊列(或鏈表)中移出,等待其它程序來蒐集信息。

進程的阻塞與喚醒

引起進程阻塞和喚醒的事件

有下述幾類事件會引起進程阻塞或被喚醒:
 (1) 向系統請求共享資源失敗。
 (2) 等待某種操作的完成。
 (3) 新數據尚未到達。
 (4) 等待新任務的到達。

進程阻塞過程

正在執行的進程,如果發生了上述某事件,進程便通過調用阻塞原語block將自己阻塞。可見,阻塞是進程自身的一種主動行爲。進入block過程後,由於該進程還處於執行狀態,所以應先立即停止執行,把進程控制塊中的現行狀態由“執行”改爲阻塞,並將PCB插入阻塞隊列。如果系統中設置了因不同事件而阻塞的多個阻塞隊列,則應將本進程插入到具有相同事件的阻塞隊列。最後,轉調度程序進行重新調度,將處理機分配給另一就緒進程,並進行切換,亦即,保留被阻塞進程的處理機狀態,按新進程的PCB中的處理機狀態設置CPU的環境。

進程喚醒過程

當被阻塞進程所期待的事件發生時,比如它所啓動的I/O操作已完成,或其所期待的數據已經到達,則由有關進程(比如提供數據的進程)調用喚醒原語wakeup,將等待該事件的進程喚醒。wakeup執行的過程是:首先把被阻塞的進程從等待該事件的阻塞隊列中移出,將其PCB中的現行狀態由阻塞改爲就緒,然後再將該PCB插入到就緒隊列中。

進程的掛起與激活

  1. 進程的掛起

2. 進程的激活過程

2.4 進程同步

在OS中引入進程後,一方面可以使系統中的多道程序併發執行,這不僅能有效地改善資源利用率,還可顯著地提高系統的吞吐量,但另一方面卻使系統變得更加複雜。如果不能採取有效的措施,對多個進程的運行進行妥善的管理,必然會因爲這些進程對系統資源的無序爭奪給系統造成混亂。致使每次處理的結果存在着不確定性,即顯現出其不可再現性。

進程同步的基本概念

兩種形式的制約關係

1.間接相互制約關係

2.直接相互制約關係

臨界資源

許多硬件資源如打印機、 磁帶機等,都屬於臨界資源,諸進程間應採取互斥方式,實現對這種資源的共享。

臨界區

不論是硬件臨界資源還是軟件臨界資源,多個進程必須互斥地對它進行訪問。人們把在每個進程中訪問臨界資源的那段代碼稱爲臨界區(critical section)。

同步機制應遵循的規則

爲實現進程互斥地進入自己的臨界區,可用軟件方法,更多的是在系統中設置專門的同步機構來協調各進程間的運行。所有同步機制都應遵循下述四條準則:
 

硬件同步機制

關中斷

關中斷是實現互斥的最簡單的方法之一。在進入鎖測試之前關閉中斷,直到完成鎖測試並上鎖之後才能打開中斷。這樣,進程在臨界區執行期間,計算機系統不響應中斷,從而不會引發調度,也就不會發生進程或線程切換。由此,保證了對鎖的測試和關鎖操作的連續性和完整性,有效地保證了互斥。

關中斷的方法存在許多缺點:① 濫用關中斷權力可能導致嚴重後果;② 關中斷時間過長,會影響系統效率,限制了處理器交叉執行程序的能力;③ 關中斷方法也不適用於多CPU 系統,因爲在一個處理器上關中斷並不能防止進程在其它處理器上執行相同的臨界段代碼。

利用Test-and-Set指令實現互斥

這是一種藉助一條硬件指令——“測試並建立”指令TS(Test-and-Set)以實現互斥的方法。

利用Swap指令實現進程互斥

該指令稱爲對換指令,在Intel 80x86中又稱爲XCHG指令,用於交換兩個字的內容

信號量機制

整型信號量

最初由Dijkstra把整型信號量定義爲一個用於表示資源數目的整型量S,它與一般整型量不同,除初始化外,僅能通過兩個標準的原子操作(Atomic Operation) wait(S)和signal(S)來訪問。很長時間以來,這兩個操作一直被分別稱爲P、V操作。

記錄型信號量

在整型信號量機制中的wait操作,只要是信號量S≤0,就會不斷地測試。因此,該機制並未遵循“讓權等待”的準則,而是使進程處於“忙等”的狀態。記錄型信號量機制則是一種不存在“忙等”現象的進程同步機制。但在採取了“讓權等待”的策略後,又會出現多個進程等待訪問同一臨界資源的情況。爲此,在信號量機制中,除了需要一個用於代表資源數目的整型變量value外,還應增加一個進程鏈表指針list,用於鏈接上述的所有等待進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章