Linux 的 Real-time 排程支援
POSIX.1b 定義了一系列的系統呼叫,去提供即時(Real-time)需求的支援,實作細節和實際效能則由各作業系統自行負責。當然,Linux 也依循了這標準,讓各個 Process 有能力的在有限度的範圍內,調整自己的在系統上排程。這裡所講,並不只是一般常見的系統優先權機制,而是建構在其之上的進階排程實作。
首先,可以從 sched_getscheduler(pid_t pid) 的回傳值中,取得目前程式的排程方法,有助於了解當前的排程情形,其可能回傳值如下:
SCHED_OTHER
SCHED_FIFO
SCHED_RR
SCHED_BATCH
範例原始碼(sched_policy.c):
#include <stdio.h>
#include <sched.h>
const char *sched_policy[] = {
"SCHED_OTHER",
"SCHED_FIFO",
"SCHED_RR",
"SCHED_BATCH"
};
int main(int argc, char *argv[])
{
printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(0)]);
return 0;
}
Compiling it:
gcc sched_policy.c -o sched_policy
Results:
Scheduler Policy is SCHED_OTHER
標準預設的排程方法是 SCHED_OTHER,意味 Kernel 並不會為這些一般性 Process 做特別的即時排程處理。因為,我們所寫的程式,都沒有被特殊設定,所得到的將都會是使用 SCHED_OTHER。
值得探討的是 SCHED_FIFO 和 SCHED_RR,這是為即時(Real-time)需求所設計的兩種排程類型,在運作規則上,其實兩者是同樣的東西,只是 SCHED_RR 擁有時段分配的制約機制。
SCHED_FIFO(First In-First Out)
SCHED_FIFO 顧名思義就是『先進先出(First In First Out)』,一但 Procees 是 FIFO 模式,在被 Kernel 的排程器設為可運行時,…
首先,可以從 sched_getscheduler(pid_t pid) 的回傳值中,取得目前程式的排程方法,有助於了解當前的排程情形,其可能回傳值如下:
SCHED_OTHER
SCHED_FIFO
SCHED_RR
SCHED_BATCH
範例原始碼(sched_policy.c):
#include <stdio.h>
#include <sched.h>
const char *sched_policy[] = {
"SCHED_OTHER",
"SCHED_FIFO",
"SCHED_RR",
"SCHED_BATCH"
};
int main(int argc, char *argv[])
{
printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(0)]);
return 0;
}
Compiling it:
gcc sched_policy.c -o sched_policy
Results:
Scheduler Policy is SCHED_OTHER
標準預設的排程方法是 SCHED_OTHER,意味 Kernel 並不會為這些一般性 Process 做特別的即時排程處理。因為,我們所寫的程式,都沒有被特殊設定,所得到的將都會是使用 SCHED_OTHER。
值得探討的是 SCHED_FIFO 和 SCHED_RR,這是為即時(Real-time)需求所設計的兩種排程類型,在運作規則上,其實兩者是同樣的東西,只是 SCHED_RR 擁有時段分配的制約機制。
SCHED_FIFO(First In-First Out)
SCHED_FIFO 顧名思義就是『先進先出(First In First Out)』,一但 Procees 是 FIFO 模式,在被 Kernel 的排程器設為可運行時,…