linux程序排程

2021-09-10 02:47:17 字數 1732 閱讀 7965

一般大部分程序都在阻塞中

非搶占式只能等程序主動讓步,不好,搶占式由排程程式來決定是否搶占,由誰新獲得cpu,時間片。

我們考慮i/o消耗程序大部分時間阻塞,被喚醒應立即執行(互動性),執行時間短

cpu消耗程序執行時間長,但應降低其排程頻率

普通程序 nice(-20 到+19),越小優先順序越大,

實時程序 0到99,越大優先順序越大,實時程序(deadline)優先順序肯定大於普通程序

時間片太長互動性差,太短吞吐量差(cpu時間都耗在程序切換上)

直接nice值對於時間片長度(unix中使用),不好我們這裡不用,例如0分配100ms,19分配5ms,看下面兩問題

1乙個nice為0,乙個為19的105ms乙個週期,兩個19的10ms乙個週期(上下文切換增加)

2 nice為0和1的比例100:95,18和19的比例為10:5

cfs(完全公平排程):針對普通程序

處理器使用比:n可執行程序,每個1/n, 根據nice(優先順序)調整權重,修正使用比。

目標延遲(排程週期):根據使用比動態計算時間片

最小粒度:最小執行時間

時間記賬:task_struct - sched_entity - vruntime

vruntime:虛擬執行時間,程序誕生後不斷累加,vruntime=實際執行時間*(nice為0的權重/權重)

理想情況所有程序的vruntime都一樣,vruntime貌似不需要,但乙個週期內程序排程有先後且有些程序如io程序執行不到給它分配的時間,所以導致各程序實際vruntime不同

選擇vruntime最小程序執行即紅黑樹最左葉子節點

程序被建立或喚醒,加入紅黑樹,可能導致最左葉子節點變化,need_resched,重新排程

程序終止或阻塞,從紅黑樹刪除

排程類:關聯著排程演算法,有著自己的程序佇列,可從中選出優先順序最高程序。

從最高優先順序排程類中選最高優先順序程序(排程實時程序的排程類優先順序肯定高於排程普通程序的排程類cfs),所以肯定會先呼叫實時程序。

上下文切換:虛擬記憶體,處理器狀態(棧,暫存器)的切換

每個程序有need_resched標誌(放在thread_info 內)

使用者搶占:從系統呼叫或中斷返回使用者空間時,檢查need_resched發起搶占

核心搶占:執行核心**(如系統呼叫)也會時間片耗盡(從中斷返回),或變得可以搶占,或主動schedule,或阻塞(呼叫了schedule)等,也會有搶占行為,但必須保證重新排程是安全的(沒有持有鎖,thread_info的preempt_count 為0)

例項分析:程序正系統呼叫,時鐘中斷發生,發現時間片耗盡設定need_resched,中斷返回檢查need_resched和preempt_count ,若count為0,可發起搶占

count不為0,不搶占,繼續系統呼叫中,鎖釋放**檢查這兩個標誌,滿足發起搶占

中斷處理程式不可搶占,都沒有程序這個概念,搶占了怎麼重新排程

實時排程策略

sched_fifo 不基於時間片,一直執行,除非有更高優先順序(直接搶占),同一優先順序也只能幹等

sched_rr 一直執行,同一優先順序按時間片排程,

linux是軟實時:不保證deadline,但一般情況下都能滿足。

linux軟的處理器親和性,也可以強制指定(task_struct - cpu_allowed)cpu_allowed會從父程序繼承,然後你可以顯式改動。

yield放棄處理器時間,可放入過期佇列保證一段時間內不再排程。

linux程序排程

排程 從就緒的程序選出最適合的乙個來執行。知識點 1 排程策略 2 排程時機 3 排程步驟 排程策略 sched normal sched other 普通的分時程序 sched fifo 先入先出的實時程序 sched rr 時間片輪轉的實時程序 sched batch 批處理程序 sched i...

linux程序排程

搶占就是程序排程,使用者程序搶占發生在以下情況 1 從系統呼叫返回使用者空間的時候 2 從中斷處理程式返回使用者空間時。在時鐘中斷中會呼叫scheduler tick 函式,該函式在程序時間片用完的時候會設定need resched標誌,當從時鐘中斷或者其他中斷返回後檢查need resched,核...

linux 程序排程

linux程序優先順序 1.nice值 20 19 預設0 nice值越大,程序優先順序越低 2.實時優先順序 0 99 實時優先順序越高,程序優先順序越高 任何實時程序的優先順序都高於普通的程序,也就是說實時優先順序和nice優先順序處於互補相交的兩個範疇 linux預設的程序排程模型是時間迴圈共...