http://blog.chinaunix.net/uid-23883288-id-3028968.html
1.進程的三種基本狀態
進程在運行中不斷地改變其運行狀態。通常,一個運行進程必須具有以下三種基本狀態。
就緒(Ready)狀態
當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的進程狀態稱為就緒狀態。
執行(Running)狀態
當進程已獲得處理機,其程序正在處理機上執行,此時的進程狀態稱為執行狀態。
阻塞(Blocked)狀態
正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起進程阻塞的事件可有多種,例如,等待I/O完成、申請緩沖區不能滿足、等待信件(信號)等。
2.進程三種狀態間的轉換
一個進程在運行期間,不斷地從一種狀態轉換到另一種狀態,它可以多次處於就緒狀態和執行狀態,也可以多次處於阻塞狀態。圖3_4描述了進程的三種基本狀態及其轉換。
(1) 就緒→執行
處於就緒狀態的進程,當進程調度程序為之分配了處理機后,該進程便由就緒狀態轉變成執行狀態。
(2) 執行→就緒
處於執行狀態的進程在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理機,於是進程從執行狀態轉變成就緒狀態。
(3) 執行→阻塞
正在執行的進程因等待某種事件發生而無法繼續執行時,便從執行狀態變成阻塞狀態。
(4) 阻塞→就緒
處於阻塞狀態的進程,若其等待的事件已經發生,於是進程由阻塞狀態轉變為就緒狀態。
例:
題目:某系統的狀態轉換圖如圖所示。
(1)分別說明引起狀態轉換1、2、3、4的原因,並各舉一個事件。
(2)為什么在轉換圖中沒有就緒到阻塞和阻塞到運行的轉換方向?
(3)一個進程的狀態變換能夠引起另一個進程的狀態變換,說明下列因果變遷是否可能發生,原因是什么?
(a)3→1(b)2→1(c)3→2(d)3→4(e)4→1
答: (1)
1:就緒->執行, 當前運行進程阻塞,調度程序選一個優先權最高的進程占有處理機;
2:執行->就緒, 當前運行進程時間片用完;
3:執行->阻塞,當前運行進程等待鍵盤輸入,進入了睡眠狀態。
4:阻塞->就緒,I/O操作完成,被中斷處理程序喚醒。
(2)就緒進程沒有占有處理機,也即沒有經過運行,其狀態就不會改變。
阻塞狀態進程喚醒后先要進入就緒隊列,才會被調度程序選中,進入了執行狀態。
(3)
(a) 3→1: 可能,當前運行進程阻塞,調度程序選一個優先級最高的進程占有處理機。
(b)2→1:可能,當前運行進程優先級下降,調度程序選一個優先級最高的進程占有處理機。
(c)3→2: 不可能,占有CPU的一個進程不能同時進入兩個狀態;在單CPU的系統中,狀態3發生后,cpu沒有執行進程,故不會發生狀態轉換2。
(d)3→4:一般不可能,不相干的兩個事件。狀態轉換3是由於運行進程等待資源而發生的,這並不會使得阻塞隊列中的進程得到資源而進入就緒隊列。但在Unix中,當系統的0#進程因runin標志而睡眠時,有(在內存)進程睡眠,就會喚醒0#進程,使其進入就緒狀態,以便將該進程和在盤交換區就緒進程交換位置。
(e)4→1:一般無關,但當就緒隊列為空時,一個進程被喚醒轉入就緒隊列后,調度程序使該進程占有處理機(但是同一個進程)。