程序的優先順序有2種度量方法,一種是nice值,一種是實時優先順序(rtprio)。
nice值的範圍是-20~+19,值越大優先順序越低,也就是說nice值為-20的程序優先順序最大。
實時優先順序(rtprio)的範圍是0~99,與nice值的定義相反,實時優先順序是值越大優先順序越高。
實時程序都是一些對響應時間要求比較高的程序,因此系統中有實時優先順序高的程序處於執行佇列的話,它們會搶占一般的程序的執行時間。
程序的2種優先順序會讓人不好理解,到底哪個優先順序更優先?乙個程序同時有2種優先順序怎麼辦?對於第乙個問題,到底哪個優先順序更優先?答案是實時優先順序高於nice值,在核心中,實時優先順序的範圍是 0~max_rt_prio-1。第二個但是程序不會同時擁有兩個優先順序。
max_rt_prio的定義參見include/linux/sched.h
#define max_user_rt_prio 100
#define max_rt_prio max_user_rt_prio
#define max_prio (max_rt_prio + 40)
nice值在核心中的範圍是 max_rt_prio~max_rt_prio+40 即 max_rt_prio~max_prio
實現原理確定每個程序能占用多少cpu時間(這裡確定cpu時間的演算法有很多,根據不同的需求會不一樣)
占用cpu時間多的先執行
執行完後,扣除執行程序的cpu時間,再回到 1
例子假設系統中只有3個程序processa(ni=+10),processb(ni=0),processc(ni=-10),ni表示程序的nice值,時間片=10ms
排程前,把程序優先順序按一定的權重對映成時間片(這裡假設優先順序高一級相當於多5mscpu時間)。
假設processa分配了乙個時間片10ms,那麼processb的優先順序比processa高10(nice值越小優先順序越高),processb應該分配10*5+10=60ms,以此類推,processc分配20*5+10=110ms
開始排程時,優先排程分配cpu時間多的程序。
由於processa(10ms),processb(60ms),processc(110ms)。顯然先排程processc
10ms(乙個時間片)後,再次排程時,processa(10ms),processb(60ms),processc(100ms)。processc剛執行了10ms,所
以變成100ms。此時仍然先排程processc
再排程4次後(4個時間片),processa(10ms),processb(60ms),processc(60ms)。
此時processb和processc的cpu時間一樣,這時得看processb和processc誰在cpu執行佇列的前面,假設processb在前面,則排程processb
10ms(乙個時間片)後,processa(10ms),processb(50ms),processc(60ms)。再次排程processc
processb和processc交替執行,直至processa(10ms),processb(10ms) ,processc(10ms)。
這時得看processa,processb,processc誰在cpu執行佇列的前面就先排程誰。這裡假設排程processa
10ms(乙個時間片)後,processa(時間片用完後退出),processb(10ms),processc(10ms)。
再過2個時間片,processb和processc也執行完退出。
2.6.23核心以後,採用了「完全公平排程演算法」,簡稱cfs。cfs演算法在分配每個程序的cpu時間時,不是分配給它們乙個絕對的cpu時間,而是根據程序的優先順序分配給它們乙個占用cpu時間的百分比ubuntu linux查詢核心方式
uname -a
//查詢結果
linux ubuntu 5.4.0-
40-generic #44
-ubuntu smp tue jun 2300:
01:04 utc 2020 x86_64 x86_64 x86_64 gnu/linux
cat /proc/version
//結果
linux version 5.4.0-
40-generic (buildd@lcy01-amd64-
011)
(gcc version 9.3
.0(ubuntu 9.3.0-
10ubuntu2)
) #44
-ubuntu smp tue jun 2300:
01:04 utc 2020
比如:processa(ni=1),processb(ni=3),processc(ni=6),在cfs演算法中,分別占用cpu的百分比為:processa(10%),processb(30%),processc(60%)。因為總共是100%,processb的優先順序是processa的3倍,processc的優先順序是processa的6倍。
計算每個程序的vruntime,通過update_curr()函式更新程序的vruntime。
選擇具有最小vruntime的程序投入執行。
程序執行完後,更新程序的vruntime,轉入步驟2.
系統呼叫
描述nice()
設定程序的nice值
sched_setscheduler()
設定程序的排程策略,即設定程序採取何種排程演算法
sched_getscheduler()
與排程策略和程序優先順序相關 (各種引數,優先順序,時間片)獲取程序的排程演算法
sched_setparam()
設定程序的實時優先順序
sched_getparam()
獲取程序的實時優先順序
sched_get_priority_max()
獲取實時優先順序的最大值,由於使用者許可權的問題,非root使用者並不能設定實時優先順序為99
sched_get_priority_min()
獲取實時優先順序的最小值,理由與上面類似
sched_rr_get_interval()
獲取程序的時間片
系統呼叫
描述sched_setaffinity()
設定程序的處理親和力,其實就是儲存在task_struct中的cpu_allowed這個掩碼標誌。該掩碼的每一位對應乙個系統中可用的處理器,預設所有位都被設定,即該程序可以再系統中所有處理器上執行。使用者可以通過此函式設定不同的掩碼,使得程序只能在系統中某乙個或某幾個處理器上執行。
sched_getaffinity()
獲取程序的對處理機的附著度
sched_yield()
暫時讓出處理器
排程演算法(時間片輪轉 優先順序排程 多級反饋佇列)
排程演算法 1 時間片輪轉排程演算法 rr 2 優先順序排程演算法 3 多級反饋佇列排程演算法 tips 各種排程演算法的學習思路 1.演算法思想 2.演算法規則 3.這種排程演算法是用於作業排程還是程序排程?4.搶占式?非搶占式?5.優點和缺點 6.是否會導致飢餓 1 演算法思想 公平地 輪流地為...
cpu優先順序排程演算法和時間片演算法模擬程式
system shedule algorithm include the priority first algorithm and the time slice algorithm version 2.0 author chillycreator include include include us...
時間片輪轉演算法和優先順序排程演算法 C語言模擬實現
一 目的和要求 程序排程是處理機管理的核心內容。本實驗要求用高階語言編寫模擬程序排程程式,以便加深理解有關程序控制快 程序佇列等概念,並體會和了解優先數演算法和時間片輪轉演算法的具體實施辦法。二 實驗內容 1.設計程序控制塊pcb的結構,通常應包括如下資訊 程序名 程序優先數 或輪轉時間片數 程序已...