圖解經典的進程調度算法

文中的不少圖片來源我考研時看的網課,B 站上應該還能找到,王道考研出品的操做系統系列,各位能夠去看看,適用於考試,不太適用於春招秋招,由於知識點講的太細,邊邊角角都會講到,各位能夠挑幾個章節去看。全文脈絡思惟導圖以下:git

1. 調度的概念

當 CPU 有一堆任務要處理時,因爲其資源有限,這些事情就無法同時處理。這就須要肯定某種規則來決定處理這些任務的順序,這就是 「調度」 研究的問題。除了接下來將要說的進程調度,還有做業調度、內存調度等。web

回顧一下進程的三態模型:面試

  • 「運行態」(running):進程佔有 CPU 正在運行。
  • 「就緒態」(ready):進程具有運行條件,等待系統分配 CPU 以便運行。
  • 「阻塞態」 / 等待態(wait):進程不具有運行條件,正在等待某個事件的完成。

所謂進程調度,就是「從進程的就緒隊列(阻塞)中按照必定的算法選擇一個進程並將 CPU 分配給它運行」,以實現進程的併發執行。這是操做系統中最基本(最低級)的一種調度,在通常的操做系統中都必須配置進程調度。進程調度的頻率很高,通常幾十毫秒一次。算法

2. 非搶佔式進程調度算法

所謂非搶佔式的意思就是,當進程正在運行時,它就會一直運行,直到該進程完成或發生某個事件發生而被阻塞時,纔會把 CPU 讓給其餘進程。後端

對應的,搶佔式的意思就是,當進程正在運行的時,能夠被打斷,把 CPU 讓給其餘進程。微信

① 先到先服務 FCFS

先來先服務調度算法(First Come First Serve,FCFS):按照進程到達的前後順序進行調度,「先到的進程就先被調度」,也就是說,等待時間越久的越優先獲得服務。併發

優勢:公平、算法實現簡單編輯器

缺點:對短進程不利。排在長進程後面的短進程須要等待很長時間,短進程的響應時間太長了,用戶交互體驗會變差。學習

② 最短做業優先 SJF

最短做業/進程優先調度算法(Shortest Job First,SJF):「每次調度時選擇當前已到達的、且運行時間最短的進程」flex

最短做業優先算法和先到先服務剛好相反,先到先服務對短進程不利,而最短做業優先算法對長程不利。由於若是一直有短進程到來,那麼長進程永遠得不到調度,長進程有可能會餓死,處於一直等待短做業執行完畢的狀態。

③ 高響應比優先 HRRN

高響應比優先算法(Highest Response Ratio Next,HRRN):只有當前運行的進程主動放棄 CPU 時(正常/異常完成,或主動阻塞),才須要進行調度,「調度時計算全部就緒進程的響應比,爲響應比最高的進程分配 CPU」響應比 = (進程的等待時間 + 進程須要的運行時間) / 進程須要的運行時間

3. 搶佔式進程調度算法

搶佔就是指當進程正在運行的時,能夠被打斷,把 CPU 讓給其餘進程。搶佔的原則通常有三種,分別是時間片原則、優先權原則、短做業優先原則。

① 最短剩餘時間優先 SRTN

最短剩餘時間優先(Shortest Remaining Time Next,SRTN)算法是「最短做業優先的搶佔式版本」

「當一個新的進程到達時,把它所須要的整個運行時間與當前進程的剩餘運行時間做比較。若是新的進程須要的時間更少,則掛起當前進程,運行新的進程,不然新的進程等待。」

② 輪轉調度算法 RR

輪轉調度算法(Round Robin,RR)也稱時間片調度算法:調度程序每次把 CPU 分配給就緒隊列首進程使用規定的時間間隔,稱爲時間片,一般爲 10ms ~ 200ms,「就緒隊列中的每一個進程輪流地運行一個時間片,當時間片耗盡時就強迫當前運行進程讓出 CPU 資源,轉而排到就緒隊列尾部,等待下一輪調度」。因此,一個進程通常都須要屢次輪轉才能完成。

輪轉調度算法對每一個進程都一視同仁,就比如你們都排好隊,一個一個來,每一個人都運行一下子再接着從新排隊等待運行。

須要注意的是:時間片的長度是一個很關鍵的因素:

  • 若是時間片設置得過短,就會致使頻繁的進程上下文切換,下降了 CPU 效率;
  • 若是時間片設置得太長,那麼隨着就緒隊列中進程數目的增長,輪轉一次消耗的總時間加長,即每隔進程的相應速度放慢。甚至時間片大到讓進程足以完成其全部任務,RR 調度算法便退化成 FCFS 算法。

4. 最高優先級調度算法 HPF

RR 調度算法對全部的進程都是相同的策略,若是用戶進程太多,可能會致使內核的服務進程響應跟不上。而在操做系統中,內核進程是比用戶進程重要的多的,畢竟它關乎整個系統的穩定性。

最高優先級調度算法(Highest Priority First,HPF)就是「從就緒隊列中選擇最高優先級的進程進行運行」。進程的優先級是怎麼規定的呢?分爲靜態優先級或動態優先級:

  • 「靜態優先級」:建立進程時候,就預先規定優先級,而且整個運行過程當中該進程的優先級都不會發生變化。通常來講,內核進程的優先級都是高於用戶進程的。
  • 「動態優先級」:根據進程的動態變化調整優先級。好比隨着進程的運行時間增長,適當的下降其優先級;隨着就緒隊列中進程的等待時間增長,適當的升高其優先級。

另外,須要注意的是,最高優先級算法並不是是固定的搶佔式策略或非搶佔式,「系統可預先規定使用哪一種策略」

  • 非搶佔式:當就緒隊列中出現優先級高的進程,則運行完當前進程後,再選擇該優先級高的進程。
  • 搶佔式:當就緒隊列中出現優先級高的進程,則當即強制剝奪當前運行進程的 CPU 資源,分配給優先級更高的進程運行。



😁 點擊下方卡片關注公衆號「飛天小牛肉」(專一於分享計算機基礎、Java 基礎和麪試指南的相關原創技術好文,幫助讀者快速掌握高頻重點知識,有的放矢),與小牛肉一塊兒成長、共同進步 

🎉 並向你們強烈推薦我維護的 Gitee 倉庫 「CS-Wiki」(Gitee 推薦項目,目前已 1.0k+ star。致力打造完善的後端知識體系,在技術的路上少走彎路。相比公衆號,該倉庫擁有更健全的知識體系,歡迎給位小夥伴前來交流學習,倉庫地址 https://gitee.com/veal98/CS-Wiki。也可直接下方掃碼訪問


原創不易,讀完有收穫不妨點贊|分享|在看支持

本文分享自微信公衆號 - 飛天小牛肉(CS-Wiki)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索