Linux進程狀態切換
volatile long stage在進程控制塊中描述進程狀態
在Linux下,一個進程可以有5種不同的狀態。
-
運行狀態(TASK_RUNNING):
指正在被CPU運行或者就緒的狀態。這樣的進程被成為runnning進程。運行態的進程可以分為3種情況:內核運行態、用戶運行態、就緒態。 -
可中斷睡眠狀態(TASK_INTERRUPTIBLE):
處於等待狀態中的進程,一旦被該進程等待的資源被釋放,那么該進程就會進入運行狀態。 -
不可中斷睡眠狀態(TASK_UNINTERRUPTIBLE):
該狀態的進程只能用wake_up()函數喚醒。 -
暫停狀態(TASK_STOPPED):
當進程收到信號SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU時就會進入暫停狀態。可向其發送SIGCONT信號讓進程轉換到可運行狀態。 -
僵死狀態(TASK_ZOMBIE):
當進程已經終止運行,但是父進程還沒有詢問其狀態的情況。
注意:
只有當進程從“內核運行態”轉移到“睡眠狀態”時,內核才會進行進程切換操作。在內核態下運行的進程不能被其它進程搶占,而且一個進程不能改變另一個進程的狀態。為了避免進程切換時造成內核數據錯誤,內核在執行臨界區代碼時會禁止一切中斷。
Liunx進程控制塊:task_struct
task_struct里面包含了文件管理和內存管理相關的數據結構