# 調度,第 2 部分:調度過程:算法
> 原文:<https://github.com/angrave/SystemProgramming/wiki/Scheduling%2C-Part-2%3A-Scheduling-Processes%3A-Algorithms>
## 什么是眾所周知的調度算法?
對于所有的例子,
過程 1:運行時 1000ms
過程 2:運行時 2000ms
過程 3:運行時 3000ms
過程 4:運行時 4000ms
過程 5:運行時 5000ms
## 最短的工作優先(SJF)

* P1 到達:0ms
* P2 到達:0ms
* P3 到達:0ms
* P4 到達:0ms
* P5 到貨:0ms
這些進程都在開始時到達,并且調度程序以最短的總 CPU 時間調度作業。明顯的問題是這個調度程序需要知道該程序在運行程序之前將持續運行多長時間。
技術說明:實際的 SJF 實現不會使用進程的總執行時間,而是使用突發時間(包括將來計算執行之前的總 CPU 時間將不再準備好運行)。可以通過使用基于先前突發時間的指數衰減加權滾動平均來估計預期突發時間,但是對于該展示,我們將簡化該討論以使用該過程的總運行時間作為突發時間的代理。
**優勢**
* 較短的工作往往先運行
**缺點**
* 需要算法是無所不知的
## 搶先最短的工作優先(PSJF)
先搶先最短的作業首先是最短的作業,但是如果新作業的運行時間短于過程的剩余運行時間,則運行該作業。 (如果它與我們的算法相同,我們的算法可以選擇)。調度程序使用進程的總運行時間,如果你想剩下最短 _ 剩余 _ 時間,那就是 PSJF 的變體,稱為 Shortest Remaining Time First。

* P2 在 0ms
* P1 在 1000ms
* P5 在 3000ms
* P4 在 4000ms
* P3 在 5000ms
這是我們的算法所做的。它運行 P2 因為它是唯一運行的東西。然后 P1 進入 1000ms,P2 運行 2000ms,所以我們的調度程序先發制人地停止 P2,讓 P1 一直運行(這完全取決于算法因為時間相等)。然后,P5 進入 - 由于沒有進程正在運行,調度程序將運行進程 5.P4 進入,并且由于運行時間等于 P5,調度程序停止 P5 并運行 P4。最后 P3 進入,搶占 P4,并運行完成。然后 P4 運行,然后 P5 運行。
**Advantages**
* 確保較短的工作首先運行
**Disadvantages**
* 需要再次了解運行時
**注意:**此算法因歷史原因比較總運行時間 _ 而非 _ 剩余運行時間。如果您想考慮剩余時間,您將使用搶先最短剩余時間優先(PSRTF)。
## 先到先得(FCFS)

* P2 在 0ms
* P1 在 1000ms
* P5 在 3000ms
* P4 在 4000ms
* P3 在 5000ms
進程按到達順序安排。 FCFS 的一個優點是調度算法很簡單:就緒隊列只是一個 FIFO(先進先出)隊列。 FCFS 遭遇康宏效應。
在這里 P2 到達,然后 P1 到達,然后是 P5,然后是 P4,然后是 P3。你可以看到 P5 的護航效果。
**Advantages**
* 簡單的實施
**Disadvantages**
* 長時間運行的進程可以阻止所有其他進程
## Round Robin(RR)
進程按其到達就緒隊列的順序進行安排。但是,經過一小段時間后,將強制從運行狀態中刪除正在運行的進程并將其放回就緒隊列。這可確保長時間運行的進程不會使所有其他進程無法運行。進程在返回就緒隊列之前可以執行的最長時間稱為時間量。在大時間量子點(時間量子長于所有過程的運行時間)的限制下,循環將等同于 FCFS。

* P1 到達:0ms
* P2 到達:0ms
* P3 到達:0ms
* P4 到達:0ms
* P5 到貨:0ms
量子= 1000ms
這里所有進程都在同一時間到達。 P1 運行 1 個量程并完成。 P2 為一個量子;然后,P3 停止了。在為量子運行所有其他進程之后,我們循環回到 P2,直到完成所有進程。
**Advantages**
* 確保一些公平的概念
**Disadvantages**
* 大量進程=大量切換
## 優先
進程按優先級順序排列。例如,導航過程執行可能比記錄過程更重要。
- UIUC CS241 系統編程中文講義
- 0. 簡介
- #Informal 詞匯表
- #Piazza:何時以及如何尋求幫助
- 編程技巧,第 1 部分
- 系統編程短篇小說和歌曲
- 1.學習 C
- C 編程,第 1 部分:簡介
- C 編程,第 2 部分:文本輸入和輸出
- C 編程,第 3 部分:常見問題
- C 編程,第 4 部分:字符串和結構
- C 編程,第 5 部分:調試
- C 編程,復習題
- 2.進程
- 進程,第 1 部分:簡介
- 分叉,第 1 部分:簡介
- 分叉,第 2 部分:Fork,Exec,等等
- 進程控制,第 1 部分:使用信號等待宏
- 進程復習題
- 3.內存和分配器
- 內存,第 1 部分:堆內存簡介
- 內存,第 2 部分:實現內存分配器
- 內存,第 3 部分:粉碎堆棧示例
- 內存復習題
- 4.介紹 Pthreads
- Pthreads,第 1 部分:簡介
- Pthreads,第 2 部分:實踐中的用法
- Pthreads,第 3 部分:并行問題(獎金)
- Pthread 復習題
- 5.同步
- 同步,第 1 部分:互斥鎖
- 同步,第 2 部分:計算信號量
- 同步,第 3 部分:使用互斥鎖和信號量
- 同步,第 4 部分:臨界區問題
- 同步,第 5 部分:條件變量
- 同步,第 6 部分:實現障礙
- 同步,第 7 部分:讀者編寫器問題
- 同步,第 8 部分:環形緩沖區示例
- 同步復習題
- 6.死鎖
- 死鎖,第 1 部分:資源分配圖
- 死鎖,第 2 部分:死鎖條件
- 死鎖,第 3 部分:餐飲哲學家
- 死鎖復習題
- 7.進程間通信&amp;調度
- 虛擬內存,第 1 部分:虛擬內存簡介
- 管道,第 1 部分:管道介紹
- 管道,第 2 部分:管道編程秘密
- 文件,第 1 部分:使用文件
- 調度,第 1 部分:調度過程
- 調度,第 2 部分:調度過程:算法
- IPC 復習題
- 8.網絡
- POSIX,第 1 部分:錯誤處理
- 網絡,第 1 部分:簡介
- 網絡,第 2 部分:使用 getaddrinfo
- 網絡,第 3 部分:構建一個簡單的 TCP 客戶端
- 網絡,第 4 部分:構建一個簡單的 TCP 服務器
- 網絡,第 5 部分:關閉端口,重用端口和其他技巧
- 網絡,第 6 部分:創建 UDP 服務器
- 網絡,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:遠程過程調用簡介
- 網絡復習題
- 9.文件系統
- 文件系統,第 1 部分:簡介
- 文件系統,第 2 部分:文件是 inode(其他一切只是數據...)
- 文件系統,第 3 部分:權限
- 文件系統,第 4 部分:使用目錄
- 文件系統,第 5 部分:虛擬文件系統
- 文件系統,第 6 部分:內存映射文件和共享內存
- 文件系統,第 7 部分:可擴展且可靠的文件系統
- 文件系統,第 8 部分:從 Android 設備中刪除預裝的惡意軟件
- 文件系統,第 9 部分:磁盤塊示例
- 文件系統復習題
- 10.信號
- 過程控制,第 1 部分:使用信號等待宏
- 信號,第 2 部分:待處理的信號和信號掩碼
- 信號,第 3 部分:提高信號
- 信號,第 4 部分:信號
- 信號復習題
- 考試練習題
- 考試主題
- C 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話