Linux-Kernel

作業系統理論與 Linux 中的程序狀態

  • April 29, 2021

我正在嘗試將 Linux 程序狀態程式碼(如ps)映射到作業系統狀態圖中的狀態,但我似乎無法映射它們。是不是因為 Linux 程序狀態不一定與理論上的 OS 狀態圖相匹配?具體來說,我不確定D/ S/ T/I在圖中的位置。

PROCESS STATE CODES
      Here are the different values that the s, stat and state output
      specifiers (header "STAT" or "S") will display to describe the
      state of a process:

              D    uninterruptible sleep (usually IO)
              I    Idle kernel thread
              R    running or runnable (on run queue)
              S    interruptible sleep (waiting for an event to
                   complete)
              T    stopped by job control signal
              t    stopped by debugger during the tracing
              W    paging (not valid since the 2.6.xx kernel)
              X    dead (should never be seen)
              Z    defunct ("zombie") process, terminated but not
                   reaped by its parent

OS程序狀態圖

類似於“停止”是否屬於“阻塞”狀態?但答案很不完整。

簡短的回答:

州(大致)如下所示:

狀態意義
D被封鎖
I被封鎖
R等待或執行
S被封鎖
T被阻止(或多或少)
t被阻止(或多或少)
W已阻止*(自 Linux 1.1.30 起已過時)*
X終止
Z終止

長答案:

Linux 中的外部可見程序狀態程式碼試圖將系統管理員可能感興趣的資訊打包到一個字元中,因此它們還包括程序被阻塞的原因(以及它是否可以被解除阻塞以及什麼可以解除阻塞)。

“等待”和“正在執行”之間的區別很模糊,因為程序執行在非常小的時間片中,對於坐在電腦前的人來說,準備執行的程序和正在執行的程序之間沒有太大區別。

此外,Linux 不會換出整個程序,而是換出單個記憶體頁面,因此您不會找到映射到“換出並等待”或“換出並阻塞”的狀態。

狀態意義
D程序被阻塞並且該狀態不能被中斷(例如用kill)。通常在這種狀態下,核心代表程序執行 I/O,而相關的核心程式碼無法處理中斷。
I該程序是一個核心執行緒,目前無事可做,被阻塞等待新的工作。這種狀態在技術上是相同的D(因為通常核心執行緒是不可中斷的)。它是出於會計/美容原因而引入的,因為處於狀態的程序D被認為對系統負載有貢獻。
R程序正在等待執行或正在執行。這些都是調度程序可以並且將在可用 CPU 上調度的所有程序。在內部,核心可以區分正在執行和等待的程序,但這不會通過程序狀態程式碼公開。
S程序被阻塞,該狀態可以用 中斷kill。大多數等待某個事件(sleepselectpollwait等)的系統呼叫都會進入此狀態。
T該程序被類似的信號阻止被調度SIGSTOP。此狀態與理論狀態“阻塞”不完全匹配,因為程序本身不會等待事件,但通常會因另一個程序或使用者 ( Ctrl+ Z) 的干預而被阻止進一步執行。
t與上麵類似。該程序被調試器或跟踪程序阻止,而不是其本身等待事件。
W過時的。程序被阻塞,等待記憶體頁從交換區讀入 RAM。此程式碼一直使用到 Linux v1.1.30。從 v2.3.43 開始,無法再將程序置於此狀態,並且從 v2.5.50 開始,對該狀態的所有引用都已刪除。
X該程序已終止,目前正在從程序列表中刪除。您不會經常看到這種狀態,因為它僅ps在核心清理另一個 CPU 核心上的程序條目時恰好在瞬間執行時出現。
Z程序終止,程序列表中的條目只存在,以便父程序可以收集退出狀態資訊。

引用自:https://unix.stackexchange.com/questions/647054