優先順序 欄位 | 描述 | static_prio | 用於保存靜態優先順序,可以通過nice系統調用來進行修改 rt_priority | 用於保存實時優先順序 normal_prio | 它的值取決於靜態優先順序和調度策略 prio | 用於保存動態優先順序 實時優先順序範圍是0到MAX_RT_PRIO ...
優先順序
int prio, static_prio, normal_prio;
unsigned int rt_priority;
欄位 | 描述 |
---|---|
static_prio | 用於保存靜態優先順序,可以通過nice系統調用來進行修改 |
rt_priority | 用於保存實時優先順序 |
normal_prio | 它的值取決於靜態優先順序和調度策略 |
prio | 用於保存動態優先順序 |
實時優先順序範圍是0到MAX_RT_PRIO-1(即99),而普通進程的靜態優先順序範圍是從MAX_RT_PRIO到MAX_PRIO-1(即100到139)。值越大靜態優先順序越低。
/* http://lxr.free-electrons.com/source/include/linux/sched/prio.h#L21 */
#define MAX_USER_RT_PRIO 100
#define MAX_RT_PRIO MAX_USER_RT_PRIO
/* http://lxr.free-electrons.com/source/include/linux/sched/prio.h#L24 */
#define MAX_PRIO (MAX_RT_PRIO + 40)
#define DEFAULT_PRIO (MAX_RT_PRIO + 20)
調度策略相關欄位
/* http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.5#L1426 */
unsigned int policy;
/* http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.5#L1409 */
const struct sched_class *sched_class;
struct sched_entity se;
struct sched_rt_entity rt;
cpumask_t cpus_allowed;
欄位 | 描述 |
---|---|
policy | 調度策略 |
sched_class | 調度類 |
se | 普通進程的調用實體,每個進程都有其中之一的實體 |
rt | 實時進程的調用實體,每個進程都有其中之一的實體 |
cpus_allowed | 用於控制進程可以在哪裡處理器上運行 |
調度策略
policy表示進程的調度策略,目前主要有以下五種:
/*
* Scheduling policies
*/
#define SCHED_NORMAL 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#define SCHED_BATCH 3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE 5
#define SCHED_DEADLINE 6
欄位 | 描述 | 所在調度器類 |
---|---|---|
SCHED_NORMAL | (也叫SCHED_OTHER)用於普通進程,通過CFS調度器實現。SCHED_BATCH用於非交互的處理器消耗型進程。SCHED_IDLE是在系統負載很低時使用 | CFS |
SCHED_BATCH | SCHED_NORMAL普通進程策略的分化版本。採用分時策略,根據動態優先順序(可用nice()API設置),分配 CPU 運算資源。註意:這類進程比上述兩類實時進程優先順序低,換言之,在有實時進程存在時,實時進程優先調度。但針對吞吐量優化 | |
SCHED_IDLE | 優先順序最低,在系統空閑時才跑這類進程(如利用閑散電腦資源跑地外文明搜索,蛋白質結構分析等任務,是此調度策略的適用者) | CFS |
SCHED_FIFO | 先入先出調度演算法(實時調度策略),相同優先順序的任務先到先服務,高優先順序的任務可以搶占低優先順序的任務 | RT |
SCHED_RR | 輪流調度演算法(實時調度策略),後 者提供 Roound-Robin 語義,採用時間片,相同優先順序的任務當用完時間片會被放到隊列尾部,以保證公平性,同樣,高優先順序的任務可以搶占低優先順序的任務。不同要求的實時任務可以根據需要用sched_setscheduler()API 設置策略 | RT |
SCHED_DEADLINE | 新支持的實時進程調度策略,針對突髮型計算,且對延遲和完成時間高度敏感的任務適用。基於Earliest Deadline First (EDF) 調度演算法 |
調度類
sched_class結構體表示調度類,目前內核中有實現以下四種:
extern const struct sched_class stop_sched_class;
extern const struct sched_class dl_sched_class;
extern const struct sched_class rt_sched_class;
extern const struct sched_class fair_sched_class;
extern const struct sched_class idle_sched_class;
調度器類 | 描述 |
---|---|
idle_sched_class | 每個cup的第一個pid=0線程:swapper,是一個靜態線程。調度類屬於:idel_sched_class,所以在ps裡面是看不到的。一般運行在開機過程和cpu異常的時候做dump |
stop_sched_class | 優先順序最高的線程,會中斷所有其他線程,且不會被其他任務打斷。作用:1.發生在cpu_stop_cpu_callback 進行cpu之間任務migration;2.HOTPLUG_CPU的情況下關閉任務。 |
rt_sched_class | RT,作用:實時線程 |
fair_sched_class | CFS(公平),作用:一般常規線程 |
目前系統中,Scheduling Class的優先順序順序為StopTask > RealTime > Fair > IdleTask
開發者可以根據己的設計需求,來把所屬的Task配置到不同的Scheduling Class中.