一、簡述
排程程式負責決定將哪個程序投入執行,何時執行以及執行多長時間,進度排程可看做在可執行程序之間分配有限的處理器時間資源的核心子系統。
二、排程器介紹
(1)排程器概念
排程器的乙個重要目標是有效的分配cpu時間片,同時提供很好的使用者體驗。排程器的一般原理是按需分配的計算能力,向系統中每個程序提供最大的公正性。
(2)排程器分類
> cfs排程器(completely fair scheduler 完全公平排程)
同乙個排程週期內每個程序的虛擬執行時間一致,虛擬執行時間 = 實際執行時間 / 比重值(後續補充);
> 實時排程器
(3)排程器框架
當前linux排程程式由兩個排程器組成:主排程器和週期性排程器。
> 主排程器schedule
1. 完成必要檢查,設定程序狀態,處理程序所在的就緒佇列;
2. 排程全域性的pick_next_task選擇搶占的程序:
> 如果當前cpu上所有程序都是cfs排程的普通非實時程序,則直接用cfs排程,如果無程式排程則排程idle程序;
> 否則從優先順序最高的排程器類sched_class_highest開始依次遍歷所有的排程器類的pick_next_task函式,選擇最優程序執行;
3. context_switch完成程序上下文切換:
> 排程switch_mm,把虛擬記憶體從乙個程序對映切換到新程序中;
> 排程switch_to,從上乙個程序處理器狀態切換到新程序的處理器狀態,包括儲存、恢復棧資訊和暫存器資訊;
> 週期性排程器scheduler_tick
三、程序排程相關
(1)程序分類
傳統上把程序分為「i/o受限」和「cpu受限」
另外也有把程序分為三類:
(2)排程策略
linux核心目前實現了6種排程策略:
(3)5個排程器類
優先順序順序為:
(4)3個排程實體
排程器不限於排程程序,還可以排程更大的實體,比如實現組排程。
四、schedule排程流程核心分析
核心版本:3.10.11 (/kernel/sched/core.c)的__schedule函式:
static void __sched __schedule(void)
else
}switch_count = &prev->nvcsw;
};pre_schedule(rq, prev);
/* 排程前處理:設定優先順序等操作 */
if (unlikely(!rq->nr_running))
idle_balance(cpu, rq);
put_prev_task(rq, prev);
/* 將先前程序任務放入佇列 */
next = pick_next_task(rq);
/* 從佇列中選取下乙個程序任務 */
clear_tsk_need_resched(prev);
rq->skip_clock_update = 0;
if (likely(prev != next)) else
raw_spin_unlock_irq(&rq->lock);
post_schedule(rq);
sched_preempt_enable_no_resched();
if (need_resched())
goto need_resched;
後續補充排程過程。
參考:
Linux核心程序管理之程序ID
乙個程序實體對應乙個task struct結構體,關於這個結構體後續的文章會有介紹,這裡我們只需要知道通過該結構體我們可以獲得該程序使用的所有資源資訊。程序id顧名思義就是程序的id,乙個程序有四種型別的id,分別是 乙個程序可能包含多個執行緒,組成乙個執行緒組,執行緒組內所有的執行緒的tgid都等...
Linux核心之程序管理
linux核心之程序管理 支援執行緒的計算機系統裡面,程序作為資源分配的基本單位而存在,執行緒作為排程的基本單位而存在.執行緒僅擁有必不可少的一些資源,如 一組暫存器,堆疊資訊等等和其他執行緒共享同乙個程序的所有資源.所以,在同乙個程序的執行緒切換時不需要大量的儲存和恢復工作,同時由於共享同乙個儲存...
Linux學習之程序二(程序檢視)
一 程序檢視 靜態檢視命令 ps ps aux 檢視系統所有的程序資料 ps la 也是檢視所有系統的程序資料 ps axjf 連同部分程序數狀態 引數 a 所有的程序均顯示出來,與 e有相同的作用 a 與terminal無關的所有程序 x 通常與a一起使用,可以列出較為完整的資訊 輸出格式 l 較...