天天看點

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的時候接受到任何信号,也會立即進入該狀态。