排程器的任務就是使程式之間共享cpu時間,創造並行執行的假象。其可分為兩個方面:一是排程策略;二是上下文切換。
1.總覽
一般原理:按所能分配的計算能力,向系統中每個程序提供最大的公正性。
排程器對於程序等待時間的記錄如下圖所示。所有的可執行程式都按時間在紅黑樹中排序。就緒佇列裝備了虛擬時鐘,其精確速度依賴於當前等待排程器挑選的程序的數目,約為實時時鐘速度的1/4。
2.資料結構
排程器子系統各元件概觀如下圖所示
啟用排程方法:
.h>
struct task_struct
prio、normal_prio:程序動態優先順序
static_prio:程序靜態優先順序,在程序啟動時就被分配,可通過nice和sched_setscheduler函式進行修改。
rt_priority:表示實時程序優先順序。最高優先順序99,最低優先順序0。
sched_class:表示該程序所屬的排程類。
policy:儲存程序排程策略,linux可取值為:sched_normal用於普通程序,sched_batch用於非互動、cpu使用密集的批處理程序,sched_idle權重相對較小,sched_fifo使用先進先出機制,sched_rr使用迴圈方法,兩個都用於軟實時程序。
cpus_allow:位域,用來限制執行程序的cpu。
run_list:用於維護包含各程序的乙個執行表
time_slice::指定程序可使用cpu的剩餘時間段。
排程器類其結構如下:
1.
struct sched_class ;
50./* 用於負載均衡* /
51.struct load_weight ;
就緒佇列核心排程器用於管理活動程序的主要資料結構稱之為就緒佇列。每個cpu都有自己的就緒佇列,乙個程序不可能出現在多個就緒佇列,即不能多個cpu不能執行乙個程序。
就緒佇列的結構如下所示。
kernel/sched.c
struct rq ;
nr_running:制定了佇列上可執行程序的數目。
load:提供了就緒佇列當前負荷的度量。
cpu_load:跟蹤當前的負荷狀態。
cfs和rt:嵌入的子就緒佇列,分別用於完全公平排程器和實時排程器。
curr:指向當前執行的程序例項。
idle:指向idle程序的task_struct例項。
clock和pre_raw_clock:用於實現就緒佇列自身的時鐘。
排程實體排程器的操作實體結構如下:
struct sched_entity
load:指定了權重,決定了各個實體佔佇列總負荷的比例。
run_node:標準的樹結點,使得實體可以在紅黑樹上排序。
on_rq:表示該實體當前是否在就緒佇列上接受排程。
exec_start:每次呼叫時,會計算當前時間和exec_start之間的差值,exec則更新到當前時間,差值則被加到sun_exec_time上。
vruntime:統計在程序執行期間虛擬時鐘上流逝的時間數量。
pre_sun_exec_runtime:儲存程序被撤銷時的值。
核心原始碼閱讀(一)程序
1.程序分為實時程序和非實時程序。硬實時程序有嚴格的時間限制,某些任務必須在指定的時限內完成。軟實時程序是硬實時程序的一種弱化形式。大多數程序沒有特定時間約束的普通程序。cpu時間分配簡圖如2.1所示。圖2.1時間片分配cpu時間 搶占式多工處理 各個程序都分配到一定時間段可以移植,當時間到期後,核...
核心原始碼閱讀(五)程序ID
接著上一節我們繼續學習程序id。在上一節中我們提到了node是乙個雜湊表元素,對於這個雜湊表並未做過多解釋,在這裡我們給出更加詳細的描述。這個雜湊表是為了在給定的命名空間中查詢對應與指定pid數值的pid陣列的pid結構例項。static struct hlist head pid hash 上面的...
位元幣原始碼分析 任務排程器的使用
bitcoin 程序啟動後,有乙個專門的執行緒做任務排程,這些任務根據指定的時刻,執行對應的函式 排程器類主要是實現了乙個生產者消費者的任務佇列,只是這個任務佇列是用 std multimap 實現的,map 的key表達某一時刻,map的值表達 那一時刻要執行的函式,內部使用條件變數和鎖來保護mu...