🌟 概述
Linux 內核以線程(任務)為單位進行調度,支持 SCHED_FIFO 和 SCHED_RR(實時調度)以及 SCHED_OTHER(基于 CFS,非實時調度)。
🔍 調度策略
1. SCHED_FIFO(先進先出)
- 機制:按優先級和到達順序運行,無時間片,直到阻塞、被搶占或終止。
- 特點:優先級 1-99,低延遲,適合硬實時任務。
- 場景:音頻處理、工業控制。
2. SCHED_RR(輪轉法)
- 機制:同優先級線程按時間片輪轉,用盡后重新排隊。
- 特點:優先級 1-99,平衡實時性和公平性。
- 場景:視頻流、實時通信。
3. SCHED_OTHER(CFS)
- 機制:基于 vruntime 公平調度,動態分配 CPU 時間。
- 特點:nice 值 -20 到 19,適合非實時任務。
- 場景:Web 服務器、桌面應用。
📊 調度策略對比
特性 | SCHED_FIFO | SCHED_RR | SCHED_OTHER (CFS) |
---|---|---|---|
類型 | 實時 | 實時 | 非實時 |
調度單位 | 線程 | 線程 | 線程 |
調度方式 | 先進先出 | 時間片輪轉 | vruntime 公平分配 |
時間片 | 無 | 固定(10-100ms) | 動態調整 |
優先級 | 1-99 | 1-99 | nice 值 -20 到 19 |
場景 | 硬實時(如音頻) | 軟實時(如多媒體) | 通用任務(如服務器) |
權限 | 需 root | 需 root | 無需權限 |
風險 | 低優先級線程可能被餓死 | 時間片切換增加延遲 | 不適合實時任務 |
🛠? 主要 API
sched_setscheduler(pid, policy, param)
:設置線程策略和優先級。sched_getscheduler(pid)
:查詢線程策略。sched_setparam(pid, param)
:設置優先級(SCHED_OTHER 忽略)。sched_yield()
:讓出 CPU。- 結構:
struct sched_param { int sched_priority; };
。
?? 注意
- SCHED_FIFO/RR 需 root 權限,優先級高于 SCHED_OTHER。
- SCHED_OTHER 使用 nice 值調整優先級。
- SCHED_FIFO 高優先級線程可能導致低優先級線程被餓死。
? 優點
- SCHED_FIFO:低延遲,硬實時。
- SCHED_RR:實時與公平平衡。
- SCHED_OTHER:公平,適合通用任務。
🚫 局限性
- SCHED_FIFO:可能餓死低優先級線程。
- SCHED_RR:切換開銷。
- SCHED_OTHER:不適合實時。