FCFS(先來先服務),優先級,時間片輪轉,多級反饋-調度算法。
先來先服務調度算法:是一種最簡單的調度算法,每次調度是從進程隊列中選擇一個最先進入該隊列的進程,為之分配資源投入運行。該進程一直運行完成或發生某事件而阻塞后才繼續處理后面的進程。
優先級調度算法:有短進程優先級、高優先權優先級、高響應比優先級等,按照優先級來執行就緒進程隊列中的調度。 (高響應比:(等待時間+服務運行時間)/服務運行時間)
時間片輪轉調度算法:系統還是按照先來先服務調度就緒進程,但每次調度時,CPU都會為隊首進程分配並執行一個時間片(幾ms~百ms)。執行時間片用完后計時器即產生時鍾中斷,停止該進程並將它送到隊尾,其他依次執行。這樣保證系統能在給定的時間內執行所有用戶進程的請求。
多級反饋調度算法:前面都有局限性,綜合-> 多級反饋調度算法則不必事先知道各進程所需的執行時間,而且還可以滿足各類型進程的需要,因而它是目前被公認的一種較好的進程調度算法。
(1)設置多個就緒隊列,每個隊列優先級依次減小。為各個隊列分配的時間片大小不同,優先級隊列越高,里面進程規定的執行時間片就越小。
(2)隊列中還是按照FCFS原則排隊等待,如果第一隊列隊首進程在規定的時間片內未執行完,則直接調送至第二隊尾,依次向后放一個隊列的隊尾。因此一個長作業進程會分配到n個隊列的時間片執行。
(3)按照隊列先后依次執行,如果新進的待處理進程優先級較高,則新進程將搶占正在運行的進程,被搶占的進程放置正在運行的隊尾。
1.搶占式內核與非搶占式內核
1.1.UNIX采用搶占式內核,Windows、Linux采用多任務非搶占式內核。
搶占式: 內核空間中,有一個更高優先級的任務出現時,則可以將當前任務掛起,執行優先級更高的進程。
非搶占式:高優先級的進程不能中止正在內核中運行的低優先級的進程而搶占CPU運行。 則除非進程自願放棄CPU,否則該進程將一直運行下去,直至完成或退出內核。
多任務系統中, 內核負責管理各個任務, 或者說為每個任務分配CPU時間, 並且負責任務之間的通訊。
1. 2.Linux下CPU搶占分兩種情況:
1)用戶搶占(發生時機:從系統調用返回用戶空間、從中斷(異常)處理程序返回用戶空間時);
2)內核搶占(是指在內核中運行的進程, 可能在執行內核函數期間被另一個進程取代。發生時機:如果內核中的任務堵塞,任務主動放棄CPU使用權時)
1.3.需要內核搶占的原因:
當內核處於相對耗時的操作中, 比如文件系統或者內存管理相關的任務,而其他進程無法執行, 無法調度, 這就造成了系統的延遲增加, 用戶體驗到”緩慢”的響應.
2.優先級翻轉問題:
高優先級任務要訪問共享資源,而此時低優先級任務正在占用,此時中等優先級任務到來先執行完畢后,低優先級任務釋放資源高優先級任務才得以執行,這就發生了優先級翻轉問題。
解決方式:優先級天花板,優先級繼承
優先級天花板:
當任務申請某資源時就將當前任務的優先級提高到可訪問該資源任務的最高優先級。
優先級繼承:
當任務申請某資源時,此資源已被占用,那么判斷當前任務是否比占用資源的任務優先級高,若高,則將占用資源任務的優先級提高到當前任務的優先級,等釋放資源后再恢復其本身的優先級。