昨天講了process 怎麼來的,今天來講講process 的生命週期。
上圖來自Operating System Concepts
在作業系統的聖經上,關於作業系統的行程的各種狀態,細講各個state以及state 轉移的
new: 創立新的新行程
ready: 行程所需的資料已經移入記憶體,等待獲得CPU資源
waiting: 行程因為等待某個資源暫時移出CPU
running: 行程正在CPU運行中
terminated: 行程結束
但是linux 又來了,linux 跟教科書寫的資訊又不一樣了! 實作與理論總是有一些落差的!在linux中沒有所謂的 ready state,而是將ready state跟 running state合併,統一變成 Running state ,示意圖如下。
TASK_RUNNING: linux 中將理論裏的 ready 與 running混合成為單獨的 TASK_RUNNING state,上圖中右邊的 TASK_RUNNING代表實際正在運行的行程,左邊則是正在等待被指定CPU的行程,只是對linux來說這兩種狀態並沒有特別區分,而是統一用 TASK_RUNNING 標記。
TASK_INTERRUPTIBLE/TASK_UNINTERRUPTIBLE: 當行程需要執行IO或是需要等待條件滿足時,此時的等待時間是無法預估的,因此行程的狀態會轉移成TASK_INTERRUPTIBLE / TASK_UNINTERRUPTIBLE,這兩個狀態的差別就跟他的名字一樣, TASK_INTERRUPTIBLE在條件滿足/收到未被屏蔽的訊號時能夠返回等待隊列中,反之TASK_UNINTERRUPTIBLE並不能被訊號喚醒,只能夠在條件滿足時返回運行狀態。
_TASK_STOPPED: SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOUT等信號會將行程暫時停止,進入_TASK_STOPPER的狀態。
EXIT_ZOMBIE:行程已經不在運行隊列中,只是記憶體仍然保有該行程的資料,尚未處理。
以上的定義出現在 /include/linux/sched.h
中
reference: linxu中進程的狀態