Linux程序狀態解析

2021-08-31 02:42:06 字數 1655 閱讀 5563

linux是乙個多使用者,多工的系統,可以同時執行多個使用者的多個程式,就必然會產生很多的程序,而每個程序會有不同的狀態。

linux程序狀態:r (task_running),可執行狀態。

只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,這些程序的task_struct結構(程序控制塊)被放入對 應cpu的可執行佇列中(乙個程序最多只能出現在乙個cpu的可執行佇列中)。程序排程器的任務就是從各個cpu的可執行佇列中分別選擇乙個程序在該 cpu上執行。

很多作業系統教科書將正在cpu上執行的程序定義為running狀態、而將可執行但是尚未被排程執行的程序定義為ready狀態,這兩種狀態在linux下統一為 task_running狀態。

linux程序狀態:s (task_interruptible),可中斷的睡眠狀態。

處於這個狀態的程序因為等待某某事件的發生(比如等待socket連線、等待訊號量),而被掛起。這些程序的task_struct結構被放入對應事件的等待佇列中。當這些事件發生時(由外部中斷觸發、或由其他程序觸發),對應的等待佇列中的乙個或多個程序將被喚醒。

通過ps命令我們會看到,一般情況下,程序列表中的絕大多數程序都處於task_interruptible狀態(除非機器的負載很高)。畢竟cpu就這麼一兩個,程序動輒幾十上百個,如果不是絕大多數程序都在睡眠,cpu又怎麼響應得過來。

linux程序狀態:d (task_uninterruptible),不可中斷的睡眠狀態。

與task_interruptible狀態類似,程序處於睡眠狀態,但是此刻程序是不可中斷的。不可中斷,指的並不是cpu不響應外部硬體的中斷,而是指程序不響應非同步訊號。

絕 大多數情況下,程序處在睡眠狀態時,總是應該能夠響應非同步訊號的。否則你將驚奇的發現,kill -9竟然殺不死乙個正在睡眠的程序了!於是我們也很好理解,為什麼ps命令看到的程序幾乎不會出現task_uninterruptible狀態,而總是 task_interruptible狀態。

而task_uninterruptible狀態存在的意義就在於,核心的某些處理流程是不能被打斷的。如果響應非同步訊號,程式的執行流程中就會被 插入一段用於處理非同步訊號的流程(這個插入的流程可能只存在於核心態,也可能延伸到使用者態),於是原有的流程就被中斷了。

linux程序狀態:t (task_stopped or task_traced),暫停狀態或跟蹤狀態。

向程序傳送乙個sigstop訊號,它就會因響應該訊號而進入task_stopped狀態(除非該程序本身處於 task_uninterruptible狀態而不響應訊號)。(sigstop與sigkill訊號一樣,是非常強制的。不允許使用者程序通過 signal系列的系統呼叫重新設定對應的訊號處理函式。)

向程序傳送乙個sigcont訊號,可以讓其從task_stopped狀態恢復到task_running狀態。

linux程序狀態:z (task_dead - exit_zombie),退出狀態,程序成為殭屍程序。

程序在退出的過程中,處於task_dead狀態。

在這個退出過程中,程序占有的所有資源將被**,除了task_struct結構(以及少數資源)以外。於是程序就只剩下task_struct這麼個空殼,故稱為殭屍。

linux程序狀態:x (task_dead - exit_dead),退出狀態,程序即將被銷毀。

而程序在退出過程中也可能不會保留它的task_struct。

Linux程序狀態解析之R S D

linux是乙個多使用者,多工的系統,可以同時執行多個使用者的多個程式,就必然會產生很多的程序,而每個程序會有不同的狀態。linux程序狀態 r task running 可執行狀態。只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,這些程序的task struct結構...

linux 程序 狀態

程序在執行過程中會根據環境來改變state。linux程序有以下狀態 running 程序處於執行 它是系統的當前程序 或者準備執行狀態 它在等待系統將cpu分配給它 waiting 程序在等待乙個事件或者資源。linux將等待程序分成兩類 可中斷與不可中斷。可中斷等待程序可以被訊號中斷 不可中斷等...

linux程序狀態

1.r task running,正在執行或者處於就緒狀態 很多作業系統教科書將正在cpu上執行的程序定義為running狀態 而將可執行但是尚未被排程執行的程序定義為ready狀態,這兩種狀態在linux下統一為 task running狀態。例子 ps aux 會看到ps這個程式命令的執行狀態是...