課程內容#
進程調度#
- 進程調度是一個內核子系統,用戶管不了
- 進程調度的主要任務是決定哪一個就緒狀態的進程先運行
- 就緒進程是非阻塞進程,已具備運行條件,不需要阻塞等待了
- 阻塞進程就是正在睡眠 [不佔用 CPU] 的進程,需要內核喚醒的進程
三態模型#
- 阻塞、就緒、運行
- 阻塞,不佔用系統資源;就緒,需要等內核調度;運行,在 IO 請求或等待某事件時阻塞
👉 五態模型
- 加入新建態、終止態
從單任務到多任務#
- DOS 是單任務操作系統,每次只運行一個進程
- 進程交錯運行,如同多任務運行
- 多處理器可以做到真正的並行
- 並發 VS 並行
- 並發:一個時間段內有很多任務進行
- 並行:有多少個 CPU,就可以有多少個任務同時運行
- 調度的核心:運行哪個進程,運行多久
時間片#
強影響著系統的全局行為和性能
- 過長
- 👍:提升系統吞吐率和全局性能
- × :降低了並發運行;用戶感到明顯的延遲[響應能力下降,應用過多也會導致調度間隔長]
- 過短
- 👍:提升互動性能
- × :大量時間花在調度大;時間局部性帶來的性能提升大打折扣
- 時間局部性:緩存,記憶 [高速緩存是隨著時間慢慢建立起來的]
- 空間局部性:預先多準備部分臨近空間的數據
- 有學習、預測的意味
- 所以,時間片長短難以確定,解決方案是幹脆不用時間片,取而代之的是完全公平調度算法
- 系統根據就緒隊列和優先級調整策略
- 調度時間和優先級的分配,本質上是為了更好地服務於用戶,並沒有不公平
- 詳見下文 —— 完全公平調度器
處理器約束型和 IO 約束型進程#
根據進程使用 CPU 的特點劃分,取決於處理器還是 IO 用得多
- 處理器約束型
- 【一直消耗完可用時間片的進程】
- 需要獲取大量的 CPU 資源,會消耗調度器分配的全部 CPU
- 如:while (1);,很容易將 CPU 使用率達到 100%
- 對時間片的要求
- 期待更長的時間片,從而最大化緩存命中,儘快完成任務 [不會浪費資源]
- IO 約束型
- 【多數時間處於阻塞狀態或者等待資源的進程】
- 經常阻塞在文件 IO 操作上:文件,網絡,鍵盤,鼠標 [如聽音樂、打字];或者除了請求內核執行 I/O 操作之外什麼也不做 [如 cp]
- 對時間片的要求
- 需要更短的時間片,被調度的越快,越有無縫銜接的感覺
- 進程只會運行極短的時間,然後阻塞在內核資源;會用到中斷
調度器分類#
協同式調度器#
[不干預型,實用性不高]
- 進程會一直運行直到它自己結束
- 操作系統不做任何干預
搶佔式調度器#
[時間片型]
- 內核給進程分配時間片,時間片用完,掛起該進程 [不佔用任何資源],執行其他進程
- 沒有其他就緒的進程時,內核給已經執行過的進程重新劃分時間片
- 調度器安排進程的運行順序、時長
- [PS]
- 新建態進入就緒隊列,終止態退出就緒隊列 [五態模型]
- 考慮優先級,所有進程都有機會被運行
完全公平調度器#
[非時間片型]
CFS:Completely Fair Scheduler
- 給 N 個進程,每個進程分別分配 1 / N 的處理器時間
- 優先級和權值
- 優先級越高,值越小,權值越大
- 默認優先級為 0,權值為 1
- 目標延遲:調度的固定周期
- 最小粒度:避免目標延遲過小導致每個進程運行的時間過短
👉公平配額
提示#
- 我是一個 CPU:這個世界慢!死!了!—— 微信公眾號
- 有趣的文章,了解 CPU 和硬盤、網絡之間的速度鴻溝