2.1.4 進程的特征與狀態
1. 進程的特征和定義
在多道程序環境下,程序的執行屬於並發執行,此時它們將失去其封閉性,並具有間斷性及不可再現性的特征。這決定了通常的程序是不能參與並發執行的,因為程序執行的結果是不可再現的。這樣,程序的運行也就失去了意義。為使程序能並發執行,且為了對並發執行的程序加以描述和控制,人們引入了“進程”的概念。為了能較深刻地了解什么是進程,我們將先對進程的特征加以描述。
1) 結構特征
通常的程序是不能並發執行的。為使程序(含數據)能獨立運行,應為之配置一進程控制塊,即PCB(Process Control Block);而由程序段、相關的數據段和PCB三部分便構成了進程實體。在早期的UNIX 版本中,把這三部分總稱為“進程映像”。值得指出的是,在許多情況下所說的進程,實際上是指進程實體,例如,所謂創建進程,實質上是創建進程實體中的PCB;而撤消進程,實質上是撤消進程的PCB,本教材中也是如此。
2) 動態性
進程的實質是進程實體的一次執行過程,因此,動態性是進程的最基本的特征。動態性還表現在:“它由創建而產生,由調度而執行,由撤消而消亡”。可見,進程實體有一定的生命期,而程序則只是一組有序指令的集合,並存放於某種介質上,其本身並不具有運動的含義,因而是靜態的。
3) 並發性
這是指多個進程實體同存於內存中,且能在一段時間內同時運行。並發性是進程的重要特征,同時也成為OS的重要特征。引入進程的目的也正是為了使其進程實體能和其它進
程實體並發執行;而程序(沒有建立PCB)是不能並發執行的。
4) 獨立性
在傳統的OS中,獨立性是指進程實體是一個能獨立運行、獨立分配資源和獨立接受調度的基本單位。凡未建立PCB的程序都不能作為一個獨立的單位參與運行。
5) 異步性
這是指進程按各自獨立的、不可預知的速度向前推進,或說進程實體按異步方式運行。現在我們再來討論進程的定義。曾有許多人從不同的角度對進程下過定義,其中較典型的進程定義有:
(1) 進程是程序的一次執行。
(2) 進程是一個程序及其數據在處理機上順序執行時所發生的活動。
(3) 進程是程序在一個數據集合上運行的過程,它是系統進行資源分配和調度的一個獨立單位。
在引入了進程實體的概念后,我們可以把傳統OS 中的進程定義為:“進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位”。
2. 進程的三種基本狀態
進程執行時的間斷性決定了進程可能具有多種狀態。事實上,運行中的進程可能具有以下三種基本狀態。
1) 就緒(Ready)狀態
當進程已分配到除CPU以外的所有必要資源后,只要再獲得CPU,便可立即執行,進程這時的狀態稱為就緒狀態。在一個系統中處於就緒狀態的進程可能有多個,通常將它們排成一個隊列,稱為就緒隊列。
2) 執行狀態
進程已獲得CPU,其程序正在執行。在單處理機系統中,只有一個進程處於執行狀態;在多處理機系統中,則有多個進程處於執行狀態。
3) 阻塞狀態
正在執行的進程由於發生某事件而暫時無法繼續執行時,便放棄處理機而處於暫停狀態,亦即進程的執行受到阻塞,把這種暫停狀態稱為阻塞狀態,有時也稱為等待狀態或封鎖狀態。致使進程阻塞的典型事件有:請求I/O,申請緩沖空間等。通常將這種處於阻塞狀態的進程也排成一個隊列。有的系統則根據阻塞原因的不同而把處於阻塞狀態的進程排成多個隊列。處於就緒狀態的進程,在調度程序為之分配了處理機之后,該進程便可執行,相應地,它就由就緒狀態轉變為執行狀態。正在執行的進程也稱為當前進程,如果因分配給它的時間片已完而被暫停執行時,該進程便由執行狀態又回復到就緒狀態;如果因發生某事件而使進程的執行受阻(例如,進程請求訪問某臨界資源,而該資源正被其它進程訪問時),使之無法繼續執行,該進程將由執行狀態轉變為阻塞狀態。圖2-5示出了進程的三種基本狀態以及各狀態之間的轉換關系。
3. 掛起狀態1) 引入掛起狀在不少系統中進程只有上述三種狀態,但在另一些系統中,又增加了一些新狀態,最重要的是掛起狀態。引入掛起狀態的原因有:
(1) 終端用戶的請求。當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫時使自己的程序靜止下來。亦即,使正在執行的進程暫停執行;若此時用戶進程正處於就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改。我們把這種靜止狀態稱為掛起狀態。
(2) 父進程請求。有時父進程希望掛起自己的某個子進程,以便考查和修改該子進程,或者協調各子進程間的活動。
(3) 負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。
(4) 操作系統的需要。操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。
2) 進程狀態的轉換
在引入掛起狀態后,又將增加從掛起狀態(又稱為靜止狀態)到非掛起狀態(又稱為活動狀態)的轉換;或者相反。可有以下幾種情況:
(1) 活動就緒→靜止就緒。當進程處於未被掛起的就緒狀態時,稱此為活動就緒狀態,表示為Readya。當用掛起原語Suspend 將該進程掛起后,該進程便轉變為靜止就緒狀態,表示為Readys,處於Readys狀態的進程不再被調度執行。
(2) 活動阻塞→靜止阻塞。當進程處於未被掛起的阻塞狀態時,稱它是處於活動阻塞狀態,表示為Blockeda。當用Suspend原語將它掛起后,進程便轉變為靜止阻塞狀態,表示為Blockeds。處於該狀態的進程在其所期待的事件出現后,將從靜止阻塞變為靜止就緒。
(3) 靜止就緒→活動就緒。處於Readys 狀態的進程,若用激活原語Active 激活后,該進程將轉變為Readya 狀態。
(4) 靜止阻塞→活動阻塞。處於Blockeds 狀態的進程,若用激活原語Active 激活后,該進程將轉變為Blockeda 狀態。圖2-6 示出了具有
4.創建狀態和終止狀態
在目前實際的系統中,為了管理的需要,還存在着兩種比較常見的進程狀態,即創建狀態和終止狀態。掛起狀態的進程狀態圖。
1) 創建狀態
創建一個進程一般要通過兩個步驟:首先,為一個新進程創建PCB,並填寫必要的管理信息;其次,把該進程轉入就緒狀態並插入就緒隊列之中。當一個新進程被創建時,系統已為其分配了PCB,填寫了進程標識等信息,但由於該進程所必需的資源或其它信息,如主存資源尚未分配等,一般而言,此時的進程已擁有了自己的PCB,但進程自身還未進入主存,即創建工作尚未完成,進程還不能被調度運行,其所處的狀態就是創建狀態。引入創建狀態,是為了保證進程的調度必須在創建工作完成后進行,以確保對進程控制塊操作的完整性。同時,創建狀態的引入,也增加了管理的靈活性,操作系統可以根據系統性能或主存容量的限制,推遲創建狀態進程的提交。對於處於創建狀態的進程,獲得了其所必需的資源,以及對其PCB初始化工作完成后,進程狀態便可由創建狀態轉入就緒狀態。
2) 終止狀態
進程的終止也要通過兩個步驟:首先等待操作系統進行善后處理,然后將其PCB清零,並將PCB 空間返還系統。當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,它將進入終止狀態。進入終止態的進程以后不能再執行,但在操作系統中依然保留一個記錄,其中保存狀態碼和一些計時統計數據,供其它進程收集。一旦其它進程完成了對終止狀態進程的信息提取之后,操作系統將刪除該進程。圖 2-7示出了增加了創建狀態和終止狀態后,進程的三種基本狀態及轉換圖衍變為五種狀態及轉換關系圖。
圖 2-8示出了增加了創建狀態和終止狀態后,具有掛起狀態的進程狀態及轉換圖
如圖 2-8所示,引進創建和終止狀態后,在進程狀態轉換時,相比較圖2-7所示的進程五狀態轉換而言,需要增加考慮下面的幾種情況。
(1) NULL→創建:一個新進程產生時,該進程處於創建狀態。
(2) 創建→活動就緒:在當前系統的性能和內存的容量均允許的情況下,完成對進程創建的必要操作后,相應的系統進程將進程的狀態轉換為活動就緒狀態。
(3) 創建→靜止就緒:考慮到系統當前資源狀況和性能要求,並不分配給新建進程所需資源,主要是主存資源,相應的系統進程將進程狀態轉為靜止就緒狀態,對換到外存,不再參與調度,此時進程創建工作尚未完成。
(4) 執行→終止:當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,進程即進終止狀態。
2.1.5 進程控制塊
1.進程控制塊的作用
為了描述和控制進程的運行,系統為每個進程定義了一個數據結構——進程控制塊PCB(Process Control Block),它是進程實體的一部分,是操作系統中最重要的記錄型數據結構。PCB 中記錄了操作系統所需的、用於描述進程的當前情況以及控制進程運行的全部信息。進程控制塊的作用是使一個在多道程序環境下不能獨立運行的程序(含數據),成為一個能獨立運行的基本單位,一個能與其它進程並發執行的進程。或者說,OS是根據PCB來對並發執行的進程進行控制和管理的。例如,當OS要調度某進程執行時,要從該進程的PCB中查出其現行狀態及優先級;在調度到某進程后,要根據其PCB 中所保存的處理機狀態信息,設置該進程恢復運行的現場,並根據其PCB 中的程序和數據的內存始址,找到其程序和數據;進程在執行過程中,當需要和與之合作的進程實現同步、通信或訪問文件時,也都需要訪問PCB;當進程由於某種原因而暫停執行時,又須將其斷點的處理機環境保存在PCB中。可見,在進程的整個生命期中,系統總是通過PCB對進程進行控制的,亦即,系統是根據進程的PCB而不是任何別的什么而感知到該進程的存在的。所以說,PCB是進程存在的惟一標志。當系統創建一個新進程時,就為它建立了一個PCB;進程結束時又回收其PCB,進程於是也隨之消亡。PCB 可以被操作系統中的多個模塊讀或修改,如被調度程序、資源分配程序、中斷處理程序以及監督和分析程序等讀或修改。因為PCB 經常被系統訪問,尤其是被運行頻率很高的進程及分派程序訪問,故PCB應常駐內存。系統將所有的PCB組織成若干個鏈表(或隊列),存放在操作系統中專門開辟的PCB 區內。例如在Linux 系統中用task_struct數據結構來描述每個進程的進程控制塊,在Windows操作系統中則使用一個執行體進程塊(EPROCESS)來表示進程對象的基本屬性。
2.進程控制塊中的信息
在進程控制塊中,主要包括下述四方面的信息。
1) 進程標識符
進程標識符用於惟一地標識一個進程。一個進程通常有兩種標識符:
(1) 內部標識符。在所有的操作系統中,都為每一個進程賦予了一個惟一的數字標識符,
它通常是一個進程的序號。設置內部標識符主要是為了方便系統使用。
(2) 外部標識符。它由創建者提供,通常是由字母、數字組成,往往是由用戶(進程)在
訪問該進程時使用。為了描述進程的家族關系,還應設置父進程標識及子進程標識。此外,還可設置用戶標識,以指示擁有該進程的用戶。
2) 處理機狀態
處理機狀態信息主要是由處理機的各種寄存器中的內容組成的。處理機在運行時,許多信息都放在寄存器中。當處理機被中斷時,所有這些信息都必須保存在PCB 中,以便在該進程重新執行時,能從斷點繼續執行。這些寄存器包括:① 通用寄存器,又稱為用戶可視寄存器,它們是用戶程序可以訪問的,用於暫存信息,在大多數處理機中,有 8~32 個通用寄存器,在RISC 結構的計算機中可超過100 個;② 指令計數器,其中存放了要訪問的下一條指令的地址;③ 程序狀態字PSW,其中含有狀態信息,如條件碼、執行方式、中斷屏蔽標志等;④ 用戶棧指針,指每個用戶進程都有一個或若干個與之相關的系統棧,用於存放過程和系統調用參數及調用地址,棧指針指向該棧的棧頂。
3) 進程調度信息
在 PCB中還存放一些與進程調度和進程對換有關的信息,包括:① 進程狀態,指明進程的當前狀態,作為進程調度和對換時的依據;② 進程優先級,用於描述進程使用處理機的優先級別的一個整數,優先級高的進程應優先獲得處理機;③ 進程調度所需的其它信息,它們與所采用的進程調度算法有關,比如,進程已等待CPU的時間總和、進程已執行的時間總和等;④ 事件,指進程由執行狀態轉變為阻塞狀態所等待發生的事件,即阻塞原因。
4) 進程控制信息
進程控制信息包括:① 程序和數據的地址,指進程的程序和數據所在的內存或外存地(首)址,以便再調度到該進程執行時,能從PCB中找到其程序和數據;② 進程同步和通信機制,指實現進程同步和進程通信時必需的機制,如消息隊列指針、信號量等,它們可能全部或部分地放在PCB 中;③ 資源清單,即一張列出了除CPU 以外的、進程所需的全部資源及已經分配到該進程的資源的清單;④ 鏈接指針,它給出了本進程(PCB)所在隊列中的下一個進程的PCB的首地址。
3. 進程控制塊的組織方式
在一個系統中,通常可擁有數十個、數百個乃至數千個PCB。為了能對它們加以有效的管理,應該用適當的方式將這些PCB組織起來。目前常用的組織方式有以下兩種。
1) 鏈接方式
這是把具有同一狀態的PCB,用其中的鏈接字鏈接成一個隊列。這樣,可以形成就緒隊列、若干個阻塞隊列和空白隊列等。對其中的就緒隊列常按進程優先級的高低排列,把優先級高的進程的PCB排在隊列前面。此外,也可根據阻塞原因的不同而把處於阻塞狀態的進程的PCB 排成等待I/O 操作完成的隊列和等待分配內存的隊列等。圖2-9 示出了一種鏈接隊列的組織方式。
2) 索引方式
系統根據所有進程的狀態建立幾張索引表。例如,就緒索引表、阻塞索引表等,並把各索引表在內存的首地址記錄在內存的一些專用單元中。在每個索引表的表目中,記錄具有相應狀態的某個PCB在PCB址。
圖2-10示出了索引方式的PCB組織。