Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 核心觀念:阻塞、睡眠與進程調度機制

編輯:Linux 教學

前言

理解「阻塞」是掌握 Linux 核心程式設計與效能調優的基石。本文深入解析阻塞與睡眠的關係、進程的三種執行狀態、調度演算法核心邏輯,幫助建立正確的核心觀念模型。

一、 什麼是阻塞?

當進程呼叫一個阻塞型系統呼叫(如 read() 等待資料、sleep() 等待時間)時,該進程會被核心置於睡眠狀態。此時:

  • 進程不佔用 CPU,核心調度其他可執行進程運行。
  • 進程等待特定事件:網路封包到達、磁碟 I/O 完成、定時器到期、訊號觸發等。
  • 事件發生後,核心將進程標記為就緒狀態,等待調度器下一次排程。

二、 進程的三種核心狀態

狀態子狀態描述
執行中 正在被調度執行 CPU 处于该进程上下文,程式計數器 (eip) 指向其指令,通用暫存器保存中間結果,正在讀寫其位址空間。
就緒 不需等待事件,隨時可執行,但 CPU 暫時執行其他進程,進程在就緒佇列等待調度。
睡眠 — 等待特定事件(I/O、訊號、鎖、時間等),不佔用 CPU,不在就緒佇列中。

三、 調度演算法核心邏輯

Linux 採用基於優先級與時間片的動態調度:

  • 優先級:靜態優先級(nice 值)+ 動態優先級(根據互動性、睡眠時間自動調整)。
  • 時間片:根據優先級分配,高優先級獲較長時間片。
  • 公平性與互動性平衡:CFS (Completely Fair Scheduler) 以虛擬執行時間為依據,確保 CPU 分配公平;同時提升互動型進程(如 GUI、終端)動態優先級,保證使用者體驗不卡頓。

四、 關鍵區別:阻塞 vs 非阻塞 vs 多工

  • 阻塞呼叫:進程睡眠,核心切換上下文,適合單一任務同步等待。
  • 非阻塞呼叫:立即返回錯誤碼(如 EAGAIN),進程需輪詢或配合 select/poll/epoll 事件通知。
  • I/O 多工:單一進程同時監控多個檔案描述符,事件驅動模型核心基石。

五、 實戰啟示

  1. 避免不必要的阻塞:高併發服務採用非阻塞 I/O + epoll/kqueue/IOCP。
  2. 善用睡眠釋放 CPU:輪詢迴圈務必加 usleep() 或 nanosleep(),否則佔滿 CPU。
  3. 理解上下文切換成本:頻繁阻塞/喚醒導致大量切換,影響吞吐量。
  4. 診斷工具:vmstat (r/b 欄位)、pidstat -w、/proc/PID/status (State 欄) 觀察阻塞情況。

結語

阻塞不是「卡住」,而是核心為了公平分配 CPU 資源而設計的主動放權機制。深入理解睡眠-就緒-執行的狀態流轉與調度決策,是寫出高效、穩定 Linux 系統軟體的關鍵。

Copyright © Windows教程網 All Rights Reserved