进程状态的转换
?????? 為了對進程從產生到消亡的整個過程進行跟蹤和描述,就需要定義各種進程的各種狀態并制定相應的狀態轉換策略,以此來控制進程的運行。
????? 不同的操作系統對進程的狀態解釋不同,但是最基本的狀態都是一樣的。包括一下三種:
?????? 運行態:進程占用CPU,并在CPU上運行;
?????? 就緒態:進程已經具備運行條件,但是CPU還沒有分配過來;
?????? 阻塞態:進程因等待某件事發生而暫時不能運行;
???? 進程在一生中,都處于上述3中狀態之一。
?????? 下面是3種狀態轉換圖
?????????????
??????? 當然理論上上述三種狀態之間轉換分為六種情況;
????? ? 運行---》就緒:這是有調度引起的,主要是進程占用CPU的時間過長
???? ?? 就緒---》運行:運行的進程的時間片用完,調度就轉到就緒隊列中選擇合適的進程分配CPU
????? ? 運行---》阻塞:發生了I/O請求或等待某件事的發生
??????? 阻塞---》就緒:進程所等待的事件發生,就進入就緒隊列
????? ? 以上4種情況可以相互正常轉換,不是還有兩種情況嗎?
???????
??????? 阻塞--》運行:即使給阻塞進程分配CPU,也無法執行,操作系統載進行調度時不會載阻塞隊列進行挑選,其調度的選擇對象為就緒隊列:
??????? 就緒--》阻塞:因為就緒態根本就沒有執行,何來進入阻塞態?
現在知道了進程的三種基本狀態,但是載操作系統具體現實中,設計者可以根據實際情況設置不同的狀態,這樣以來,就出現了以下幾種狀態:
????? 可運行態:他是運行態和就緒態的合并,表示進程正在運行或準備運行,Linux 中使用TASK_RUNNING 宏表示此狀態。
?????? 淺度睡眠態:進程正在睡眠(被阻塞),等待資源到來是喚醒,也可以通過其他進程信號或時鐘中斷喚醒,進入運行隊列。Linux 使用TASK_INTERRUPTIBLE 宏表示此狀態。
?????? 深度睡眠態:其和淺度睡眠基本類似,但有一點就是不可其他進程信號或時鐘中斷喚醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此狀態。
?????? 暫停狀態:進程暫停執行接受某種處理。如正在接受調試的進程處于這種狀態,Linux 使用TASK_STOPPED 宏表示此狀態。
?????? 僵死狀態:進程已經結束但未釋放PCB,Linux 使用TASK_ZOMBIE 宏表示此狀態。
我們可以來看下以上宏在內核中的定義:
??????? #define TASK_RUNNING??????????? 0
?183 #define TASK_INTERRUPTIBLE????? 1
?184 #define TASK_UNINTERRUPTIBLE??? 2
?185 #define __TASK_STOPPED????????? 4
?186 #define __TASK_TRACED?????????? 8
?187 /* in tsk->exit_state */進程的退出狀態
?188 #define EXIT_ZOMBIE???????????? 16
?189 #define EXIT_DEAD?????????????? 32
?190 /* in tsk->state again */我理解為進程的喚醒狀態
?191 #define TASK_DEAD?????????????? 64
?192 #define TASK_WAKEKILL?????????? 128
?193 #define TASK_WAKING???????????? 256
?194 #define TASK_STATE_MAX????????? 512
?195
?196 #define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
? 以下是LINUX進程間狀態轉換和內核調用圖解
總結
- 上一篇: 进程wait()与waitpid()
- 下一篇: deamon守护进程