進程調度概述
定義
進程存在的核心目的:虛擬化CPU,從而支持多個進程在少量的物理CPU上運行(每個進程以為它獨享一個CPU)。
進程調度就是選擇一個可用的進程(可能從多個可用進程集合中選擇)到CPU上執行。單處理器系統從來不會有超過一個進程在運行。如果有多個進程,那么余下的則需要等待CPU空閑並重新調度。
調度隊列
進程進入系統時被加入到作業隊列中,該隊列包含系統中所有進程。
駐留在內存中等待運行的程序保存在就緒隊列中,該隊列常用鏈表來實現,其頭節點指向鏈表的第一個和最后一個PCB塊的指針。
操作系統也有其他隊列。等待特定IO設備的進程列表稱為設備隊列。每個設備都有自己的設備隊列。

就緒隊列中進程在就緒隊列中等待直到被選中執行或被派遣。當進程分配到CPU執行時,可能發生:
- 進程發出一個IO請求,並放到IO隊列中。
- 進程創建新的子進程,並等待其結束。
- 進程由於中斷而強制釋放CPU(被搶占),並被放回到就緒隊列中。
即如下圖:

調度的分類 & 調度程序
調度有以下幾種:
- 長程調度(作業調度):決定加入待執行進程池
- 中程調度:決定加入部分/全部位於內存中的進程集合(換入/換出)
- 短程調度(進程調度):決定處理器執行哪個可運行進程(執行)
- I/O調度:決定可用I/O設備處理哪個進程掛起的I/O請求
除I/O調度外,對應到隊列如下圖所示:

進程會在各種調度隊列之間遷移,為了調度,操作系統必須按某種方式從這些隊列中選擇進程。進程的選擇是由相應的調度程序(scheduler)來執行的。
-
短程調度程序 從准備執行的進程中選擇進程,並為之分配CPU。
-
短程調度程序通常100ms至少執行一次,由於每次執行之間的時間較短,短程調度程序必須要快。
-
導致當前進程阻塞或搶占當前運行進程的事件(時鍾中斷、I/O 中斷、操作系統調用、信號)發生時,會調用短程調度程序。
-
-
長程調度程序 批處理系統中,進程更多的是被提交,而不是馬上執行。這些進程通常放到磁盤的緩沖池里,以便以后執行。長程(作業)調度程序從該池中選擇進程,並裝入內存以准備執行。
-
長程調度程序執行的並不頻繁,所以長程調度程序能使用更多的時間來選擇執行進程。長程調度程序控制多道程序設計的程度(內存中進程的數量)。長程調度程序必須仔細選擇執行進程。
-
絕大多數進程可分為:I/O密集和計算(CPU)密集。為使系統達到平衡和更好的性能,長程調度程序應當選擇一個合理的包含I/O為主的和CPU為主的組合進程以充分使用設備和短程調度程序。
-
Linux和Windows系統通常沒有長程調度程序,這些系統的穩定性依賴於物理限制,如果系統性能下降很多,會有用戶的退出。
-
-
中程調度程序 分時系統中可能引入中程調度程序,其核心思想是能夠將進程從內存中移出,從而降低多道程序設計的程度,之后進程可以被換入。
三者在執行頻繁程度上有較大差別,執行頻繁程度:短程調度 > 中程調度 > 長程調度
調度算法
● 非搶占:在這種情況下,一且進程處於運行狀態,就會不斷執行直到終止,進程要么因為等待I/O,要么因為請求某些操作系統服務而阻塞自己。
● 搶占:當前正運行進程可能被操作系統中斷,並轉換為就緒態。一個新進程到達時,或中斷發生后把一個阻塞態進程置為就緒態時,或出現周期性的時間中斷時,需要進行搶占決策。
經典調度
先來先服務 FCFS
算法描述:非搶占、先請求CPU的進程先分配CPU。
缺點:在長短任務混合的場景下對短任務不友好
最短作業優先 SJF(SPN)
算法描述:非搶占、下次選擇預計時間最短的進程。
缺點:
- 必須預知任務運行時間
- 表現嚴重依賴於任務到達時間點
- 不公平,有飢餓風險
在SJF中加入搶占即是最短剩余時間優先。
搶占:
最短剩余時間有限 SRT
算法描述:搶占、選擇預期剩余時間最短的進程。
缺點:
- 必須預知任務運行時間
- 長任務有飢餓風險
時間片輪轉(Round Robin ,RR)
算法描述:搶占、以一個周期(q)產生中斷,當中斷發生時,當前運行的程序置於就緒隊列(隊尾)中,然后基於FCFS選擇下一個就緒作業運行。
缺點:在任務運行時間相似的場景下平均周轉時間高
經典調度算法對比:
實時調度
每個任務都有截止時間(Deadline)。
軟實時(Soft Real Time):允許超過截止時間、視頻播放,每一幀的渲染
硬實時(Hard Real Time):不允許超過截止時間、自動駕駛汽車的剎車任務
最早截止時間優先 (Earliest Deadline First, EDA )
算法描述:每次調度截止時間最近的任務
缺點:在任務不可調度時,會造成多數任務都錯過截止時間(多米諾效應)
優先級調度
算法描述:設置許多獨立的隊列(queue),每個隊列有不同的優先級(priority level)。任何時刻,一個工作只能存在於一個隊列中。優先級調度總是優先執行較高優先級的工作(即在較高級隊列中的工作)。具有同樣的優先級的作業采用輪轉調度。
做法:多級反饋隊列(Multi-level Feedback Queu, MLFQ)
公平共享調度
- 每個用戶占用的資源是成比例的,而非被任務的數量決定
- 每個用戶占用的資源是可以被計算的
- 設定"權重值"以確定相對比例(絕對值不重要)
- 例:權重為4的用戶使用資源,是權重為2的用戶的2倍
做法:彩票調度
reference
[1] 操作系統概念
[2] 操作系統-精髓與設計原理
[3] 上海交通大學並行與分布式系統研究所-進程/線程調度
[4] 操作系統導論(ostep)
[5] 現代操作系統