linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)
一、概述
決定何時、如何選擇一個新進程運行的這組規則叫做:調度策略(scheduling policy)。
Linux的調度是基于分時技術(time sharing):多個進程以“時間多路復用”方式運行,因為CPU的時間唄分成“片”(slice),給每個可運行進程分配一片。如果當前運行進程的時間片或時限(quantum)到期時,該進程還沒有運行完畢,進程切換就會發生。
調度策略也是根據進程的優先級對它們進行分類。在Linux中,進程優先級是動態的:在較長時間內沒有運行的進程,會動態提升它們的優先級;相反地,對于在CPU上運行較長時間的進程,會降低它們的優先級來懲罰它們。
所以,實現調度的工具是調度器(scheduler),調度的對象是進程(process),調度的方法是調度策略(包括調度算法)。
二、CPU調度器
這里主要講了cpu調度器的工作內容和目的:
多個task會共享CPU資源
那如何進行任務切換選擇呢?
當前運行的task中止
當前運行的task sleep(wait event)
新task創建,或者sleep的task喚醒了
當前運行的task的時間片用完
那調度器的目標是什么?
公平調度各個task
基于task的優先級來分配時間片
task的respnse時間短
高throughput(task執行成功)
在多個cpu間,負載均衡
低功耗
調度器代碼運行開銷低
調度器會和工作在一些框架、服務器、PC、嵌入式/手機中。
三、O(1)調度器
在2.6.23(2007)以前,Linux調度器使用的是O(1)調度器:
調度器分140個優先級等級:0-99是RT task,100-139是User task
每個cpu的runqueue有2個數組:Active,Expaired
每個數組都有140個entry,對應每個優先級
每個entry是一條FIFO隊列結構的鏈表
140位的bitmap用來檢測每個優先級list
時間片會根據task的優先級進行分配
運行時間expaire的task會從Active數組移動到Expaired數組
當Active數組為空時,就交換2個數組。即,將Expaired數組變為Active;Active(此時為空)變為Expaired
task的入rq和出rq,以及next task的選擇都是在固定時間內完成
最后在O(1)調度器已經被CFS替代。
四、當前調度器架構
在kernel 2.6.23(2007)后,由Ingo Molnar引入
在調度的class中,還存在調度policy
不同的調度class,高優先級的,越早執行
task可以在cpu、調度policy、調度class間進行遷移
4.1? 調度class
由struce sched_class結構體實現:
structsched_class {const struct sched_class *next;void (*enqueue_task) (struct rq *rq, struct task_struct *p, intflags);void (*dequeue_task) (struct rq *rq, struct task_struct *p, intflags);
...struct task_struct * (*pick_next_task) (struct rq *rq, struct task_struct *prev, struct rq_flags *rf);
...
};
內核中一共有5中調度class,優先級從高到低:STOP > DL > RT > CFS > IDLE,他們通過鏈表實現,并鏈接起來的。
4.2? 主調度函數Schedule()
內核中進程調度,最主要的實現是Schedule()函數。它完成如下工作:
選取下一個runnable的task,并將task放在cpu上運行
按class優先級搜索task來運行,最先從STOP class開始
輪詢搜索:for_each_class()
實現方式:pick_next_task():
again:
for_each_class(class) {
p= class->pick_next_task(rq, prev, rf);if(p) {if (unlikely(p ==RETRY_TASK))gotoagain;returnp;
}
}/*The idle class should always have a runnable task:*/BUG();
4.3? 調度class與policy
在不同的調度class下,可能會有不同的調度policy實現:
● Stop
○ No policy
● Deadline
○ SCHED_DEADLINE
● Real Time
○ SCHED_FIFO
○ SCHED_RR
● Fair
○ SCHED_NORMAL
○ SCHED_BATCH
○ SCHED_IDLE
● Idle
○ No policy
不同的class代表不同的調度優先級;不同的policy同樣也意味著不同的調度方式。
4.4? 調度class:STOP
STOP類型的class有如下特點:
是最高優先級的class(但是這個class不開放給系統user使用的)
只能在smp系統上可用(stop_machine()在單核處理器下不可用)------括號內的具體沒怎么理解
可以搶占所有task,并任何事件都不能搶占它
實現方式是:停止運行的其他所有task,而在cpu上運行一個特定的函數
沒有調度policy
屬于stop class的per cpu內核線程:migration/N ------“N”為cpu core number
在以下情況下使用:task遷移、CPU hotplug、RCU、ftrace、cloclevents等
4.5? 調度class:Deadline(DL)
Deadline類型的class有如下特點:
在kernel 3.14(2013),由Dario Faggioli & Juri Lelli引入
在系統中,屬于可以使用的最高優先級的class
調度policy為SCHED_DEADLINE
由紅黑樹結構實現(自平衡樹)
在以下情況下使用:周期性的實時task,例如:視頻編解碼
4.6? 調度Real-time(RT)
Real-time類型的class有如下特點:
符合POSIX標準要求
task優先級范圍:0-99
優先級在kernel和userspace中相反:0在kernel中,代表最高優先級;而在userspace中代表最低優先級
相同優先級下的調度policy:
SCHED_FIFO
SCHED_RR,默認時間片長度為100ms
由鏈表實現
在以下情況下使用:latency敏感的task,例如:IRQ threads
4.7? 調度CFS(Completely Fair Scheduler)
CFS類型的class有如下特點:
由Ingo Molnar引入
調度policy:
SCHED_NORMAL:普通task
SCHED_BATCH:批處理 task(batch task,非交互型)
SCHED_IDLE:低優先級task
由紅黑樹結構實現
跟蹤task的虛擬運行時間(vruntime,task擁有的運行時間)
虛擬運行時間(vruntime)最短的task,最優先運行
task的優先級作為權重,會影響虛擬運行時間的計算(vruntime)
權重越大,虛擬運行時間(vruntime)計算時的增量就越小
task的優先級計算:120+nice值(nice范圍:-20 ~ +19)
用于所有其他類型的task,例如:shell
4.7? 調度Idle
Idle類型的class有如下特點:
最低優先級的調度class
沒有調度policy
屬于idle class的per cpu內核線程(idle):swapper/N ------“N”為cpu core number
idle線程僅會在沒有其他task的情況下,在cpu上運行
idle線程可以讓cpu進入低功耗狀態
五、Runqueue
每個CPU都由一個struct rq的實例
每個”rq“包含了DL、RT、CFS的runqueue
Runnable的task會被壓入上面提到的那些runqueue中
在struct rq中由很多其他的信息和狀態
structrq {
...structcfs_rq cfs;structrt_rq rt;structdl_rq dl;
...
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux 4.1.16 ftrace 进程调度,Linux内核进程调度overview(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle10g启动顺序,oracle
- 下一篇: 王者荣耀游戏名字,王者名字好听的昵称49