首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

進程調度時機與阻塞機制深度解析

     編輯:關於C語言

引發進程調度的七大核心場景

進程調度發生的時機取決於調度原因與調度方式(可剝奪/不可剝奪)。以下為可剝奪模式下的典型觸發條件:

  1. 進程正常終止:釋放 CPU,必須選新就緒進程否則浪費資源。
  2. 主動阻塞:執行中進程調用阻塞原語(如 sleep)進入睡眠態。
  3. 同步原語操作:P 操作因資源不足阻塞;V 操作喚醒等待隊列進程。
  4. I/O 請求阻塞:發起 I/O 後等待完成。
  5. 時間片耗盡:分時系統中時間片用完強制讓出 CPU。
  6. 系統調用返回:內核態執行完畢返回用戶態,可視為系統進程結束,觸發調度。
  7. 優先級反轉:就緒隊列有更高優先級進程出現,立即搶佔。

兩種 CPU 佔用模式對比

模式特徵調度觸發點
可剝奪式(Preemptive)高優先級就緒進程立即搶佔 CPU優先級變化、中斷返回、時間片結束等
不可剝奪式(Non-preemptive)當前進程主動放棄前持續佔用 CPU阻塞、睡眠、時間片用完、主動調用調度器

內核線程與用戶線程的調度差異

  • 內核線程:內核直接調度對象,一個線程阻塞不影響其他內核線程(Linux 稱內核進程)。
  • 用戶線程:內核不知其存在,調度單位為進程。進程內任一用戶線程阻塞,整個進程掛起休眠。

阻塞與自旋鎖的本質區別

阻塞:資源不可用時掛起進程,釋放 CPU,條件滿足再喚醒。
自旋鎖:獲取失敗進入死循環檢查,不釋放 CPU,屬於「忙等待」,不屬於阻塞狀態。

總結

理解調度時機與阻塞機制,是掌握作業系統併發控制、優化多線程程序性能的基石。區分內核/用戶線程調度模型、阻塞與自旋的適用場景,能避免常見的死鎖、活鎖與優先級反轉問題。

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