程序狀態 筆記

2021-07-09 21:59:32 字數 2105 閱讀 8168

程序有如下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.獲取程序的堆分配資訊,包括程序的堆,在堆上分配的記憶...