目的
為了對程序從産生到消亡的整個過程進行跟蹤和描述,就需要定義各種程序的各種狀态并制定相應的狀态轉換政策,以此來控制程序的運作。
粗略分類運作态:程序占用CPU,并在CPU上運作;
就緒态:程序已經具備運作條件,但是CPU還沒有配置設定過來;
阻塞态:程序因等待某件事發生而暫時不能運作;
當然理論上上述三種狀态之間轉換分為六種情況;運作 → 就緒:這是有排程引起的,主要是程序占用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
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
程序的退出狀态
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
我了解為程序的喚醒狀态
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
#define TASK_STATE_MAX 512
#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"
LINUX程序間狀态轉換和核心調用圖
(SAW:Game Over!)