CPU 排程

CPU-I/O 爆發週期(CPU-I/O burst cycle)

觀察一個典型程式隨時間真正在做什麼,你會看到它在兩個階段間交替,就像一位作家先思考一陣子(在紙上動筆),然後走去圖書館借書(等待)。思考的階段是一段 CPU 爆發(CPU burst)——程式正在運算,需要處理器。跑圖書館那一趟則是 I/O 爆發(I/O burst)——程式提出了讀檔、等網路或列印的要求,在那段時間它根本不需要 CPU。

具體來說:一個行程執行,做了些算術與比較(一段 CPU 爆發),接著發出像 read(fd, buf, n) 這樣的要求。相較於 CPU,從磁碟或網路讀取慢得驚人——一次磁碟讀取完成的期間,可能流逝數百萬個 CPU 週期。作業系統不會讓 CPU 空轉浪費這些週期,而是把該行程標記為等待,把 CPU 交給另一個就緒行程。當 I/O 完成時,一個中斷會喚醒第一個行程,它最終會再得到一段 CPU 爆發。一個行程的一生就是這個週期不斷重複:CPU 爆發、I/O 爆發、CPU 爆發、I/O 爆發,直到它結束。

這個模式正是排程划算的全部原因。程式分成兩類:CPU 密集型工作有很長的 CPU 爆發、很少 I/O(想想算圖一段影片);I/O 密集型工作則有很短的 CPU 爆發、不斷在等待(想想文字編輯器)。好的排程器會利用這些空檔——當一個 I/O 密集行程離席去等待時,CPU 密集行程就能用那段閒置的 CPU,於是整台機器做得更多。實測的爆發長度通常也呈現一條短爆發很多、長爆發很少的曲線,好幾個演算法都悄悄仰賴這一點。

一個複製檔案的程式不斷循環:讀一塊(發出 I/O,然後等待)、對它算個檢查碼(一段很短的 CPU 爆發)、再讀下一塊(又等待)。它的 CPU 爆發很小、I/O 爆發佔了大半——它是 I/O 密集型的,CPU 大部分時間都空著可做別的工作。

一個 I/O 密集型行程一生大半在等待,讓 CPU 得以空出——這正是多元程式規劃發明出來要利用的重疊。

一個行程很少永遠是純 CPU 密集或純 I/O 密集;同一個程式可能在不同階段切換行為,這正是多層回饋佇列這類能適應的排程器存在的理由之一。

又称
burst cycleCPU 爆發與 I/O 爆發