天天看點

linux 程序 status,Linux 程序狀态詳解

目的

為了對程序從産生到消亡的整個過程進行跟蹤和描述,就需要定義各種程序的各種狀态并制定相應的狀态轉換政策,以此來控制程序的運作。

粗略分類運作态:程序占用CPU,并在CPU上運作;

就緒态:程序已經具備運作條件,但是CPU還沒有配置設定過來;

阻塞态:程序因等待某件事發生而暫時不能運作;

linux 程式 status,Linux 程式狀态詳解

當然理論上上述三種狀态之間轉換分為六種情況;運作 → 就緒:這是有排程引起的,主要是程序占用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程序間狀态轉換和核心調用圖

linux 程式 status,Linux 程式狀态詳解

(SAW:Game Over!)

繼續閱讀