1. 程式人生 > >Linux程序的狀態轉換圖

Linux程序的狀態轉換圖

http://blog.csdn.net/mu0206mu/article/details/7348618



◆執行狀態(TASK_RUNNING)
當程序正在被CPU執行,或已經準備就緒隨時可由排程程式執行,則稱該程序為處於執行狀態(running)。程序可以在核心態執行,也可以在使用者態執行。當系統資源已經可用時,程序就被喚醒而進入準備執行狀態,該狀態稱為就緒態。這些狀態(圖中中間一列)在核心中表示方法相同,都被成為處於TASK_RUNNING狀態。
◆可中斷睡眠狀態(TASK_INTERRUPTIBLE)
當程序處於可中斷等待狀態時,系統不會排程該程序執行。當系統產生一箇中斷或者釋放了程序正在等待的資源,或者程序收到一個訊號,都可以喚醒程序轉換到就緒狀態(執行狀態)。


◆不可中斷睡眠狀態(TASK_UNINTERRUPTIBLE)
與可中斷睡眠狀態類似。但處於該狀態的程序只有被使用wake_up()函式明確喚醒時才能轉換到可執行的就緒狀態。
◆暫停狀態(TASK_STOPPED)
當程序收到訊號SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時就會進入暫停狀態。可向其傳送SIGCONT訊號讓程序轉換到可執行狀態。在Linux 0.11中,還未實現對該狀態的轉換處理。處於該狀態的程序將被作為程序終止來處理。
◆僵死狀態(TASK_ZOMBIE)
當程序已停止執行,但其父程序還沒有詢問其狀態時,則稱該程序處於僵死狀態。
當一個程序的執行時間片用完,系統就會使用排程程式強制切換到其它的程序去執行。另外,如果程序在核心態執行時需要等待系統的某個資源,此時該程序就會呼叫sleep_on()或sleep_on_interruptible()自願地放棄CPU的使用權,而讓排程程式去執行其它程序。程序則進入睡眠狀態(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。

只有當程序從“核心執行態”轉移到“睡眠狀態”時,核心才會進行程序切換操作。在核心態下執行的程序不能被其它程序搶佔,而且一個程序不能改變另一個程序的狀態。為了避免程序切換時造成核心資料錯誤,核心在執行臨界區程式碼時會禁止一切中斷。



◆執行狀態(TASK_RUNNING)
當程序正在被CPU執行,或已經準備就緒隨時可由排程程式執行,則稱該程序為處於執行狀態(running)。程序可以在核心態執行,也可以在使用者態執行。當系統資源已經可用時,程序就被喚醒而進入準備執行狀態,該狀態稱為就緒態。這些狀態(圖中中間一列)在核心中表示方法相同,都被成為處於TASK_RUNNING狀態。
◆可中斷睡眠狀態(TASK_INTERRUPTIBLE)


當程序處於可中斷等待狀態時,系統不會排程該程序執行。當系統產生一箇中斷或者釋放了程序正在等待的資源,或者程序收到一個訊號,都可以喚醒程序轉換到就緒狀態(執行狀態)。
◆不可中斷睡眠狀態(TASK_UNINTERRUPTIBLE)
與可中斷睡眠狀態類似。但處於該狀態的程序只有被使用wake_up()函式明確喚醒時才能轉換到可執行的就緒狀態。
◆暫停狀態(TASK_STOPPED)
當程序收到訊號SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時就會進入暫停狀態。可向其傳送SIGCONT訊號讓程序轉換到可執行狀態。在Linux 0.11中,還未實現對該狀態的轉換處理。處於該狀態的程序將被作為程序終止來處理。
◆僵死狀態(TASK_ZOMBIE)
當程序已停止執行,但其父程序還沒有詢問其狀態時,則稱該程序處於僵死狀態。
當一個程序的執行時間片用完,系統就會使用排程程式強制切換到其它的程序去執行。另外,如果程序在核心態執行時需要等待系統的某個資源,此時該程序就會呼叫sleep_on()或sleep_on_interruptible()自願地放棄CPU的使用權,而讓排程程式去執行其它程序。程序則進入睡眠狀態(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。
只有當程序從“核心執行態”轉移到“睡眠狀態”時,核心才會進行程序切換操作。在核心態下執行的程序不能被其它程序搶佔,而且一個程序不能改變另一個程序的狀態。為了避免程序切換時造成核心資料錯誤,核心在執行臨界區程式碼時會禁止一切中斷。