Linux優先順序時間片排程

2021-10-08 06:53:35 字數 3707 閱讀 6322

程序的優先順序有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的結構,通常應包括如下資訊 程序名 程序優先數 或輪轉時間片數 程序已...