Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.2. CPU 排程

排程器」(scheduler)負責讓系統中的 CPU 保持忙碌。Linux 排程器有多種「排程政策」(scheduling policy),決定一組執行續何時會在某個特定 CPU 核心上執行多久時間。
排程政策共有兩大類:
  1. 即時政策
    • SCHED_FIFO
    • SCHED_RR
  2. 正常政策
    • SCHED_OTHER
    • SCHED_BATCH
    • SCHED_IDLE

4.2.1. 即時排程政策

即時執行續會先被排程,而正常的執行續會在所有即時執行續被排程後,才會被排程。
即時」(realtime)政策用於極需時間的任務,必須一次完成,不被插斷。
SCHED_FIFO
這政策也稱為「靜態優先順序排程」(static priority scheduling),因為此政策為每個執行續定義了固定的優先順序(介於 1 到 99)。這個排程器會以優先順序掃描 SCHED_FIFO 執行續清單,並排程擁有最高執行順序的執行續以執行之。這個執行續會一直執行,直到被阻絕、退出、或被擁有更高優先順序的執行續所取代為止。
即使是最低權限的即時執行續,也比非即時的執行續擁有更高的權限;如果只有一個即時執行續,那麼 SCHED_FIFO 的優先值就無關緊要。
SCHED_RR
這是源自 SCHED_FIFO 政策的一種輪詢(round-robin)政策。SCHED_RR 執行續也會被賦予固定的權限值,介於 1 到 99。然而,擁有同樣權限值的執行續會以一固定時間量,又稱「時間配量」(time slice),用輪詢方式執行。sched_rr_get_interval(2) 系統呼叫會傳回這時間值,但這時間長度不能由使用者決定。如果您需要多執行續以同樣的優先順序執行時,此政策就非常有用。
欲知更多即時排程政策的已定義語法之資訊,請參閱〈IEEE 1003.1 POSIX 標準〉一節,此節位於「系統政策」—「即時」之下,網址為 http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html
定義執行續優先順序的最好方式,是從賦予低優先順序開始,然後只有在確定優先順序不足時,再予以增加。即時執行續並不像普通執行續一樣,會分配時間配量;SCHED_FIFO 執行續會一直執行,直到被阻絕、退出、或被擁有更高優先順序的執行續所取代為止。因此我們不建議將優先順序設為 99,因為這會讓該執行續的優先順序與轉移或監控執行續的一樣高。如果您的執行續進入運算上的迴圈,那麼後二者就會被阻絕、無法執行。在這情況下,單一處理器就會漸漸被鎖住。
在 Linux kernel 中,SCHED_FIFO 政策包括了限定最大頻寬的機制。這會保護即時應用程式師,避免即時應用任務獨占 CPU。這機制可以透過以下 /proc 檔案系統的參數來調整:
/proc/sys/kernel/sched_rt_period_us
定義多長時間該被視為 100% 的 CPU 頻寬,單位為 ms(「us」相當於「µs」)。預設值為 1000000µs,也就是 1 秒。
/proc/sys/kernel/sched_rt_runtime_us
定義要給執行中的即時執行續之時間,單位為 ms(「us」相當於「µs」)。預設值為 950000µs,也就是 0.95 秒。