程序有如下6種狀態:
r (task_running),可執行狀態。
只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,
這些程序的task_struct結構(程序控制塊)被放入對應cpu的可執行佇列中
(乙個程序最多只能出現在乙個cpu的可執行佇列中)。程序排程器的任務就是從各個cpu的可執行佇列中分別選擇乙個程序在該cpu上執行。
注意:可執行但是尚未被排程執行(ready狀態)、cpu執行(run狀態),這兩種狀態在linux下統一為task_running狀態
s (task_interruptible),可中斷的睡眠狀態
等待事件發生被掛起,
這些程序的task_struct結構被放入對應事件的等待佇列中
。當事件發生時,對應的等待佇列中的乙個或多個程序將被喚醒。
(可中斷)
一般情況下,程序列表中的絕大多數程序都處於task_interruptible狀態(除非機器的負載很高)。
d (task_uninterruptible),不可中斷的睡眠狀態
睡眠狀態不可中斷。
不可中斷,指的並不是cpu不響應外部硬體的中斷,而是指程序不響應非同步訊號。
task_uninterruptible狀態存在的意義就在於,
核心的某些處理流程是不能被打斷的
。如果響應非同步訊號,程式的執行流程中就會被插入一段用於處理非同步訊號的流程(這個插入的流程可能只存在於核心態,也可能延伸到使用者態),於是原有的流程就被中斷了。(參見《linux核心非同步中斷**》)
在程序對某些硬體進行操作時(比如程序呼叫read系統呼叫對某個裝置檔案進行讀操作,而read系統呼叫最終執行到對應裝置驅動的**,並與對應的物理裝置進行互動),可能需要使用task_uninterruptible狀態對程序進行保護,以避免程序與裝置互動的過程被打斷,造成裝置陷入不可控的狀態。
這種情況下的task_uninterruptible狀態總是非常短暫的,通過ps命令基本上不可能捕捉到。
t (task_stopped or task_traced),暫停狀態或跟蹤狀態
1)向程序傳送乙個sigstop訊號,程序響應訊號並進入task_stopped狀態
向程序傳送乙個sigcont訊號,程序從task_stopped狀態恢復到task_running狀態。
2)當程序正在被跟蹤時,它處於task_traced這個特殊的狀態。(比如在gdb斷點,程序在斷點處停下來的時候就處於task_traced狀態)
都屬於暫停狀態。
task_traced狀態相當於在task_stopped之上多了一層保護,處於task_traced狀態的程序不能響應sigcont訊號而被喚醒。只能等到除錯程序通過ptrace系統呼叫執行ptrace_cont、ptrace_detach等操作(通過ptrace系統呼叫的引數指定操作),或除錯程序退出,被除錯的程序才能恢復task_running狀態。
z (task_dead – exit_zombie),退出狀態,程序成為殭屍程序。
程序在退出的過程中,處於task_dead狀態。
在這個退出過程中,程序占有的所有資源將被**,除了task_struct結構(以及少數資源)以外。於是程序就只剩下task_struct這麼個空殼,故稱為殭屍。
父程序可以通過wait系列的系統呼叫來等待某個或某些子程序的退出,並獲取它的退出資訊。然後wait系列的系統呼叫會順便將子程序的屍體(task_struct)也釋放掉。
子程序在退出的過程中,核心會給其父程序傳送乙個訊號,通知父程序來「收屍」。這個訊號預設是sigchld
x (task_dead – exit_dead),退出狀態,程序即將被銷毀
程序將被置於exit_dead退出狀態,這意味著接下來的**立即就會將該程序徹底釋放。所以exit_dead狀態是非常短暫的,幾乎不可能通過ps命令捕捉到。
程序概念和程序狀態
檢視程序 程序狀態 孤兒程序 執行中的程式。對於作業系統來說就是pcb程序控制塊,在linux中就是乙個task struct結構體。是作業系統對程式執行的動態描述,系統通過這個描述實現程式執行的管理和排程。要執行main這個程式,作業系統找到對應main的pcb,在pcb上讀取main執行所需要的...
linux 程序 狀態
程序在執行過程中會根據環境來改變state。linux程序有以下狀態 running 程序處於執行 它是系統的當前程序 或者準備執行狀態 它在等待系統將cpu分配給它 waiting 程序在等待乙個事件或者資源。linux將等待程序分成兩類 可中斷與不可中斷。可中斷等待程序可以被訊號中斷 不可中斷等...
程序狀態 API
1.列舉當前主機中的程序,包括程序pid,控制代碼,程式映像路徑等.2.列舉當前程序的執行緒,包括tid,控制代碼等 3.列舉程序載入的模組,包括模組映像路徑,控制代碼,位置等.4.獲取程序的記憶體使用情況,包括模組映象路徑,控制代碼,位置等.5.獲取程序的堆分配資訊,包括程序的堆,在堆上分配的記憶...