Linux 進程狀態標識 Process State Definition


**From : http://www.linfo.org/process_state.html ** **譯者:李秋豪**

進程狀態標識是指在進程描述符中狀態位的值。

進程,也可被稱為任務,是指一個程序運行的實例。

一個進程描述符是一個task_struct類型的數據結構,這個數據結構內保存了一個進程的所有相關信息。其中的進程狀態區域描述了當前正在發生什么。

數據結構是一種結構化存儲以期更有效利用數據的方法。task_struct是一種被設計用來為內核提供進程所有信息的數據結構,在32位機器上它大概有1.7KB大小。

進程描述符中進程狀態區域描述了當前該進程在發生些什么。這個區域的值是下列5個標志之一:

TASK_RUNNING:這個進程是可運行的——要么它正在運行,要么在runqueue中等待運行。對於用戶空間 (指內存 上用戶進程運行的空間) 正在運行的進程來說,它只可能是可運行的。對於 內核空間 (內存上內核運行並提供服務的空間)正在運行的進程來說,可運行狀態也是可能的。

可運行進程 (譯者注:這篇文章我已經翻譯了)就是指該進程的進程狀態為TASK_RUNNING。

一個runqueue(運行隊列)是 scheduler(調度器)里面的基本數據結構,它保存了可運行進程的列表,這些列表中的進程隨后會被CPU執行。scheduler (調度器)也被稱為process scheduler (進程調度器),是內核的一部分,它會為不同的可運行進程分配CPU時間。


TASK_INTERRUPTIBLE: 這個進程正在睡眠(例如被鎖了),它在等待某個條件的滿足或者某個信號的到達。當條件滿足或者某一個信號來的時候,內核就會把這個進程的狀態位設置為TASK_RUNNING。

信號是一種在進程中或者進程組中傳遞的短小消息,每一個信號對應一個整數(譯者注:1~30左右)。 用戶模式 下的進程可以通過它進行交互,內核亦可以通過信號告知進程發生的事件(用戶模式下的進程是被禁止訪問內存中內核和其他程序的空間的)。除了通知的功能,信號還可以強制進程執行它內部的信號處理函數。


TASK_UNINTERRUPTIBLE: 在進程接收到信號時,不會被喚醒變成可運行的。除了這一點,該標志和TASK_INTERRUPTIBLE其他部分完全一樣。這個狀態通常用於進程必須不間斷等待或者事件發生的頻率很快。該標志並沒有TASK_INTERRUPTIBLE常用,畢竟它不能對信號做出反應。


TASK_ZOMBIE: 該進程已經終止了,但是他的父進程(fork出該進程的進程)並沒有調用wait4() (譯者注:wait3, wait4 - wait for process to change state, BSD style)。進程結束后,進程要保證它的父進程還可以獲得它的進程描述符以便知曉它為什么終止和終止的狀態。如果父進程調用wait4() ,子進程在內存中的進程描述符就會被回收。

系統調用是通過軟件中斷實現的,活動進程通過這種方法要求內核提供相關服務。wait4()系統調用告訴操作系統掛起當前進程知道某一個子進程終止。

中斷是指向內核發送一個信號,告知某一個事件的發生,這通常會導致CPU內的指令執行順序發生改變。軟件中斷,或者稱為異常,是產自於軟件的中斷,通常指用戶模式下的程序。

(譯者注:關於僵屍進程、孤兒進程的詳細信息可以參見我的另一篇文章Linux 進程與信號的概念和操作 linux process and signals中的僵屍進程部分)


TASK_STOPPED: 表示該進程已經停止執行,並且不具有再次執行的條件。通常情況下,(譯者注:進程沒有對一些可以捕捉的信號進行捕捉或者忽略),當進程接收到SIGSTOP, SIGTSTP, SIGTTIN or SIGTTOU這些默認動作是停止進程的信號時,進程就會進入該狀態;或者,當進程正在被debugged的時候接受到任何信號,也會立即進入該狀態。


免責聲明!

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



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