根據(jù)進(jìn)程的定義,我們知道進(jìn)程是代碼運(yùn)行的實(shí)體,而進(jìn)程有可能是正在運(yùn)行的,也可能是已經(jīng)停止的,這就是進(jìn)程的狀態(tài)。
網(wǎng)上有人總結(jié)進(jìn)程一共5種狀態(tài),也有總結(jié)是8種,究竟應(yīng)該怎么算呢,最好的方法還是看Linux源碼。進(jìn)程狀態(tài)的定義在fs/proc/array.c文件中。
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
這真的是Linux的源碼,可以看出進(jìn)程一共7種狀態(tài),含義也比較清晰,注意其中D(disk sleep)稱為不可中斷睡眠狀態(tài)(uninterruptible sleep)。
知道進(jìn)程狀態(tài)本身沒什么
http://wiki.jikexueyuan.com/project/linux-process/images/status_transform.svg" alt="" />
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
void *stack;
atomic_t usage;
unsigned int flags; /* per process flags, defined below */
unsigned int ptrace;
通過ps aux可以看到進(jìn)程的狀態(tài)。
O:進(jìn)程正在處理器運(yùn)行,這個(gè)狀態(tài)從來沒有見過.
S:休眠狀態(tài)(sleeping)
R:等待運(yùn)行(runable)R Running or runnable (on run queue) 進(jìn)程處于運(yùn)行或就緒狀態(tài)
I:空閑狀態(tài)(idle)
Z:僵尸狀態(tài)(zombie)
T:跟蹤狀態(tài)(Traced)
B:進(jìn)程正在等待更多的內(nèi)存頁
D: 不可中斷的深度睡眠,一般由IO引起,同步IO在做讀或?qū)懖僮鲿r(shí),cpu不能做其它事情,只能等待,這時(shí)進(jìn)程處于這種狀態(tài),如果程序采用異步IO,這種狀態(tài)應(yīng)該就很少見到了
其中就緒狀態(tài)表示進(jìn)程已經(jīng)分配到除CPU以外的資源,等CPU調(diào)度它時(shí)就可以馬上執(zhí)行了。運(yùn)行狀態(tài)就是正在運(yùn)行了,獲得包括CPU在內(nèi)的所有資源。等待狀態(tài)表示因等待某個(gè)事件而沒有被執(zhí)行,這時(shí)候不耗CPU時(shí)間,而這個(gè)時(shí)間有可能是等待IO、申請(qǐng)不到足夠的緩沖區(qū)或者在等待信號(hào)。
進(jìn)程的運(yùn)行過程也就是進(jìn)程狀態(tài)轉(zhuǎn)換的過程。
例如就緒狀態(tài)的進(jìn)程只要等到CPU調(diào)度它時(shí)就馬上轉(zhuǎn)為運(yùn)行狀態(tài),一旦它需要的IO操作還沒有返回時(shí),進(jìn)程狀態(tài)也就轉(zhuǎn)換成等待狀態(tài)。
進(jìn)程狀態(tài)間轉(zhuǎn)換還有很多,這里不一一細(xì)敘,馬上去學(xué)習(xí)進(jìn)程退出碼吧。