CPU 排程
先佔式與非先佔式排程(preemptive vs non-preemptive scheduling)
想像在會議上共用一支麥克風的兩種方式。一種是:誰在講話就一直握著,直到自願交回——這是合作式的,而一個長篇大論的講者就能擋住所有人。另一種是:主持人可以在某人講到一半時打斷,好讓緊急的意見插進來——這是先佔式的。CPU 排程恰好就有這兩種風格,而其差別塑造了一個系統能有多公平、多靈敏。
確切地說:在非先佔式(也稱合作式)排程下,行程一旦拿到 CPU 就一直保有它,直到它做完、或因 I/O 阻塞而自願讓出為止。作業系統無法強行收回 CPU。在先佔式排程下,作業系統可在任何時刻停下一個正在執行的行程——通常是當計時器中斷觸發、或一個更高優先權的行程變為就緒時——存下它的狀態,把 CPU 交給另一個行程。先佔需要硬體支援(一個計時器),也需要小心處理共享的核心資料,因為現在一個行程可能在更新資料的途中被打斷,若不加保護就可能造成競爭條件。
為什麼重要:先佔正是讓分時系統與良好互動反應成為可能的關鍵——沒有任何單一行程能凍結整台機器。代價是額外開銷(更多環境切換)與核心內需要同步。非先佔式排程比較簡單、切換成本低,在某些嵌入式或批次場合沒問題,但它很脆弱:一個有錯或貪心、永不讓出的行程能餓死其他所有人。如今幾乎所有通用桌面與伺服器作業系統都是先佔式的。
非先佔式的先到先服務:一個 1000 毫秒的工作開始後,一個剛好稍晚抵達、只需 1 毫秒的工作必須整整等一秒。先佔式、配量 10 毫秒的輪轉:10 毫秒後計時器中斷,長工作暫停,短工作執行並幾乎立刻完成,然後長工作再接續。
先佔讓一個短而較晚抵達的工作能插隊進來,而不必排在一個長工作後面乾等。
先佔並非免費的安全:因為一個行程可能在修改共享核心資料時被打斷,先佔式核心必須用同步機制(鎖、在臨界區間內停用先佔)來避免競爭條件。
又称
另见