系統維護的時候難免會遇到進程的狀態的查詢和管理,到底什么是R,有的是S,有的還是S+呢?一直有些混沌的問題,今天細細的來總結一下: ps是用來報告系統中程序執行狀況的命令這個是無可厚非的,linux進程的狀態: D 不可中斷睡眠 (通常是在IO操作) 收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生 R 正在運行或可運行(在運行隊列排隊中) S 可中斷睡眠 (休眠中, 受阻, 在等待某個條件的形成或接受到信號) T 已停止的 進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號后停止運行 W 正在換頁(2.6.內核之前有效) X 死進程 (未開啟) Z 僵屍進程 進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用后釋放BSD風格的 < 高優先級(not nice to other users) N 低優先級(nice to other users) L 頁面鎖定在內存(實時和定制的IO) s 一個信息頭 l 多線程(使用 CLONE_THREAD,像NPTL的pthreads的那樣) + 在前台進程組
◆運行狀態(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)。
只有當進程從“內核運行態”轉移到“睡眠狀態”時,內核才會進行進程切換操作。在內核態下運行的進程不能被其它進程搶占,而且一個進程不能改變另一個進程的狀態。為了避免進程切換時造成內核數據錯誤,內核在執行臨界區代碼時會禁止一切中斷。