首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

操作系統進程三態轉換圖解:以編譯器運行為例

     編輯:程式設計綜合問答

進程三態(運行、就緒、阻塞)是 OS 課程核心考點。本文結合 GCC 編譯器處理 C 文件 的具體生命周期,逐幀拆解狀態流轉,並補充四態模型(增加睡眠態)的工程意義。

三態定義回顧

  • 運行態:佔用 CPU 執行指令。
  • 就緒態:具備一切條件,僅等待調度器分派 CPU。
  • 阻塞態:等待外部事件(I/O、信號量、鎖),主動放棄 CPU。

場景:gcc main.c -o main

階段進程動作狀態觸發轉換的事件
1. Shell fork/exec創建 gcc 進程,載入代碼段就緒 → 運行調度器分派 CPU
2. 預處理 (cpp)讀取 .h/.c 文件,展開宏運行 → 阻塞發起磁盤 I/O 讀取頭文件
3. 磁盤完成中斷數據已在內存緩衝區阻塞 → 就緒I/O 完成中斷,內核喚醒進程
4. 等待 CPU在就緒隊列排隊就緒更高優先級進程搶佔、時間片用盡
5. 編譯 (cc1)語法分析、優化、生成汇编就緒 → 運行調度器再次分派
6. 寫入 .s 文件調用 write() 系統調用運行 → 阻塞磁盤寫入 I/O
7. 汇編 (as)生成 .o 目標文件阻塞 → 就緒 → 運行同 3→4→5
8. 鏈接 (ld)解析符號、合併段、生成可執行文件運行(長時間計算密集)若內存不足觸發換頁 → 阻塞
9. 退出exit() 釋放資源運行 → 終止進程正常結束

狀態轉換圖(文本版)

      +-----------------+
      |   新建/就緒     |
      +--------+--------+
               | 調度分派
               v
      +--------+--------+      I/O 請求/等待事件      +--------+--------+
      |     運行態      | ----------------------------> |     阻塞態      |
      +--------+--------+                               +--------+--------+
               ^                                               |
               | 時間片用盡/搶佔                               | 事件發生/中斷喚醒
               |                                               v
      +--------+--------+ <------------------------------ +--------+--------+
      |     就緒態      |           就緒喚醒                |     (同阻塞)   |
      +-----------------+                                   +-----------------+

四態模型補充:睡眠態

Linux 內核將「可中斷等待」細分為 TASK_INTERRUPTIBLE (睡眠) 與 TASK_UNINTERRUPTIBLE (深度阻塞):

  • 睡眠態:等待條件變量、定時器、信號;可被信號喚醒轉就緒(如 sleep(1)、pthread_cond_wait)。
  • 深度阻塞:磁盤 I/O、頁面換入;不可被信號打斷,必須等硬件完成。

工程上:ps -eo stat 中 S=睡眠、D=深度阻塞、R=運行/就緒。排查卡頓時關注 D 狀態進程堆棧。

面試/考試高頻考點

  1. 就緒→運行:僅由調度器發起,進程無法主動觸發。
  2. 運行→阻塞:進程主動發起(系統調用),非外部強制。
  3. 阻塞→就緒:由外部事件(中斷處理程序/其他進程)喚醒,非進程自主。
  4. 無法直接阻塞→運行:必須經過就緒隊列排隊,保證調度公平性。

掌握「誰發起、經過哪個隊列、由誰喚醒」三要素,即可應對所有狀態轉換題目。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved