進程的幾種狀態


版權聲明:本文為博主原創文章,未經博主允許不得轉載。

進程:進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位。

進程狀態:一個進程的生命周期可以划分為一組狀態,這些狀態刻畫了整個進程。進程狀態即體現一個進程的生命狀態。

進程狀態:

一般來說,進程有三個狀態,即就緒狀態,運行狀態,阻塞狀態。

運行態:進程占用CPU,並在CPU上運行;
       就緒態:進程已經具備運行條件,但是CPU還沒有分配過來;
       阻塞態:進程因等待某件事發生而暫時不能運行;

下面是3種狀態轉換圖

 

 

當然理論上上述三種狀態之間轉換分為六種情況;

       運行——>就緒:1,主要是進程占用CPU的時間過長,而系統分配給該進程占用CPU的時間是有限的;2,在采用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行時,該進程就被迫讓出CPU,該進程便由執行狀態轉變為就緒狀態。

       就緒——>運行:運行的進程的時間片用完,調度就轉到就緒隊列中選擇合適的進程分配CPU

      運行——>阻塞:正在執行的進程因發生某等待事件而無法執行,則進程由執行狀態變為阻塞狀態,如發生了I/O請求

      阻塞——>就緒:進程所等待的事件已經發生,就進入就緒隊列

 

      以下兩種狀態是不可能發生的:

        阻塞——>運行:即使給阻塞進程分配CPU,也無法執行,操作系統在進行調度時不會從阻塞隊列進行挑選,而是從就緒隊列中選取

       就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態。

 

在一些系統中,又增加了一些新狀態,如掛起狀態,可運行狀態,深度睡眠狀態,淺度睡眠狀態,暫停狀態,僵死狀態。

可運行狀態:運行狀態和就緒狀態的合並,表示進程正在運行或准備運行,Linux 中使用TASK_RUNNING 宏表示可運行狀態。

      淺度睡眠狀態:進程正在睡眠(被阻塞),等待資源的到來是喚醒,也可以通過其他進程信號或時鍾中斷喚醒,進入運行隊列。Linux 中使用TASK_INTERRUPTIBLE 宏表示此狀態。

      深度睡眠狀態:其和淺度睡眠基本類似,但不可被其他進程信號或時鍾中斷喚醒。Linux 中使用TASK_UNINTERRUPTIBLE 宏表示此狀態。

      暫停狀態:進程暫停執行接受某種處理。Linux 使用TASK_STOPPED 宏表示此狀態。

      僵死狀態:進程已經結束但未釋放進程控制塊(PCB),Linux 使用TASK_ZOMBIE 宏表示此狀態。

掛起狀態:在執行狀態的進程通過掛起即可進入就緒狀態,如圖所示,就緒狀態和阻塞狀態都分為活動態和靜止態。由活動態向靜止態轉換就是通過掛起實現的。

引入掛起狀態的原因有:

(1) 終端用戶的請求。當終端用戶在自己的程序運行期間發現有可疑問題時,希望暫時使自己的程序靜止下來。亦即,使正在執行的進程暫停執行;若此時用戶進程正處於就緒狀態而未執行,則該進程暫不接受調度,以便用戶研究其執行情況或對程序進行修改。我們把這種靜止狀態稱為掛起狀態。 

(2) 父進程請求。有時父進程希望掛起自己的某個子進程,以便考查和修改該子進程,或者協調各子進程間的活動。

(3) 負荷調節的需要。當實時系統中的工作負荷較重,已可能影響到對實時任務的控制時,可由系統把一些不重要的進程掛起,以保證系統能正常運行。

(4) 操作系統的需要。操作系統有時希望掛起某些進程,以便檢查運行中的資源使用情況或進行記賬。

具有掛起狀態的進程狀態轉換圖為:

 

有關參考文章有:http://www.2cto.com/os/201412/358908.html  

                      http://blog.chinaunix.net/uid-26126915-id-2948970.html

                      http://blog.csdn.net/u012824097/article/details/52058395


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM