日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux进程调度策略和优先,linux进程调度之FIFO和RR调度策略

發(fā)布時間:2024/1/1 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux进程调度策略和优先,linux进程调度之FIFO和RR调度策略 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

嚴(yán)格地說,對于優(yōu)先級對于實時進(jìn)程和普通進(jìn)程的意義是不一樣的。

1、在一定程度上,實時進(jìn)程優(yōu)先級高,實時進(jìn)程存在,就沒有普通進(jìn)程占用CPU的機會,(但是前一篇博文也講過了,實時組調(diào)度出現(xiàn)在內(nèi)核以后,允許普通進(jìn)程占用少量的CPU時間,取決于配置)。

2、對于實時進(jìn)程而言,高優(yōu)先級的進(jìn)程存在,低優(yōu)先級的進(jìn)程是輪不上的,沒機會跑在CPU上,所謂實時進(jìn)程的調(diào)度策略,指的是相同優(yōu)先級之間的調(diào)度策略。如果是FIFO實時進(jìn)程在占用CPU,除非出現(xiàn)以下事情,否則FIFO一條道跑到黑。

a)FIFO進(jìn)程良心發(fā)現(xiàn),調(diào)用了系統(tǒng)調(diào)用sched_yield 自愿讓出CPU

b) 更高優(yōu)先級的進(jìn)程橫空出世,搶占FIFO進(jìn)程的CPU。有些人覺得很奇怪,怎么FIFO占著CPU,為啥還能有更高優(yōu)先級的進(jìn)程出現(xiàn)呢。別忘記,我們是多核多CPU ,如果其他CPU上出現(xiàn)了一個比FIFO優(yōu)先級高的進(jìn)程,可能會push到FIFO進(jìn)程所在的CPU上。

c) FIFO進(jìn)程停止(TASK_STOPPED or TASK_TRACED狀態(tài))或者被殺死(EXIT_ZOMBIE or EXIT_DEAD狀態(tài))

d) FIFO進(jìn)程執(zhí)行了阻塞調(diào)用并進(jìn)入睡眠(TASK_INTERRUPTIBLE OR TASK_UNINTERRUPTIBLE)。

如果是進(jìn)程的調(diào)度策略是時間片輪轉(zhuǎn)RR,那么,除了前面提到的abcd,RR實時進(jìn)程耗盡自己的時間片后,自動退到對應(yīng)優(yōu)先級實時隊列的隊尾,重新調(diào)度。

struct sched_param {/* ... */int sched_priority;/* ... */};int sched_setscheduler (pid_t pid,int policy,const struct sched_param *sp);

sched_setscheduler函數(shù)的第二個參數(shù)調(diào)度方法 :

#define SCHED_OTHER 0#define SCHED_FIFO 1#define SCHED_RR 2#ifdef __USE_GNU# define SCHED_BATCH 3#endif

SCHED_OTHER表示普通進(jìn)程,對于普通進(jìn)程,第三個參數(shù)sp->sched_priority只能是0

SCHED_FIFO 和SCHED_RR表示實時進(jìn)程的調(diào)度策略,第三個參數(shù)的取值范圍為[1,99]。

如果sched_setscheduler 優(yōu)先級設(shè)置的值和調(diào)度策略不符合的話,會返回失敗的。

應(yīng)用層和內(nèi)核層的優(yōu)先級含義是不同的:

首先說實時進(jìn)程:實時進(jìn)程的優(yōu)先級設(shè)置可以通過sched_setsheduler設(shè)置,也可以通過sched_setparam設(shè)置優(yōu)先級的大小。

int sched_setparam (pid_t pid, const struct sched_param *sp);

在用戶層或者應(yīng)用層,1表示優(yōu)先級最低,99表示優(yōu)先級最高。但是在內(nèi)核中,[0,99]表示的實時進(jìn)程的優(yōu)先級,0最高,99最低。[100,139]是普通進(jìn)程折騰的范圍。應(yīng)用層比較天真率直,就看大小,數(shù)字大,則優(yōu)先級高。ps查看進(jìn)程的優(yōu)先級也是如此。有意思的是,應(yīng)用層實時進(jìn)程最高優(yōu)先級的99,在ps看進(jìn)程優(yōu)先級的時候,輸出的是139.

對于普通進(jìn)程,是通過nice系統(tǒng)調(diào)用來調(diào)整優(yōu)先級的。從內(nèi)核角度講[100,139]是普通進(jìn)程的優(yōu)先級的范圍,100最高,139最低,默認(rèn)是120。普通進(jìn)程的優(yōu)先級的作用和實時進(jìn)程不同,普通進(jìn)程優(yōu)先級表示的是占的CPU時間。深入linux內(nèi)核架構(gòu)中提到,普通優(yōu)先級越高(100最高,139最低),享受的CPU time越多,相鄰的兩個優(yōu)先級,高一級的進(jìn)程比低一級的進(jìn)程多占用10%的CPU,比如內(nèi)核優(yōu)先級數(shù)值為120的進(jìn)程要比數(shù)值是121的進(jìn)程多占用10%的CPU。

內(nèi)核中有一個數(shù)組:prio_to_weight[20]表示的是默認(rèn)優(yōu)先級120的權(quán)重,數(shù)值為1024,prio_to_weight[21]表示nice值為1,優(yōu)先級為121的進(jìn)程的權(quán)重,數(shù)值為820。這就到了CFS的原理了

static const int prio_to_weight[40] = {/* -20 */ 88761, 71755, 56483, 46273, 36291,/* -15 */ 29154, 23254, 18705, 14949, 11916,/* -10 */ 9548, 7620, 6100, 4904, 3906,/* -5 */ 3121, 2501, 1991, 1586, 1277,/* 0 */ 1024, 820, 655, 526, 423,/* 5 */ 335, 272, 215, 172, 137,/* 10 */ 110, 87, 70, 56, 45,/* 15 */ 36, 29, 23, 18, 15,};

假如有1臺電腦,10個人玩,怎么才公平。

1 約定好時間片,每人玩1小時,玩完后記賬,張XX 1小時,誰玩的時間短,誰去玩

2 引入優(yōu)先級的概念,李四有緊急情況,需要提高他玩電腦的時間,怎么辦,玩1個小時,記賬半小時,那么同等情況下,李四會比其他人被選中玩電腦的頻率要高,就體現(xiàn)了這個優(yōu)先級的概念。

3 王五也有緊急情況,但是以考察,不如李四的緊急,好吧,玩1個小時,記賬45分鐘。

4 情況有變化,聽說這里有電腦,突然又來了10個人,如果按照每人玩1小時的時間片,排在最后的那哥們早就開始罵人了,怎么辦?時間片動態(tài)變化,根據(jù)人數(shù)來確定時間片。人越多,每個人玩的時間越少,防止哥們老撈不著玩,耐心耗盡,開始罵人。

這個記賬就是我們prio_to_weight的作用。我就不多說了,prio_to_weight[20]就是基準(zhǔn),玩一小時,記賬一小時,數(shù)組20以前的值是特權(quán)一級,玩1小時記賬20分鐘之類的享有特權(quán)的,數(shù)組20之后是倒霉蛋,玩1小時,記賬1.5小時之類的倒霉蛋。 CFS這種調(diào)度好在大家都能撈著玩。

對于FIFO而言,一旦sleep過后,高優(yōu)先級運行,低優(yōu)先級是沒戲運行的,同等優(yōu)先級的進(jìn)程,先運行的不運行完,后運行的也沒戲。

對于RR而言,高優(yōu)先級的先運行,同等優(yōu)先級的進(jìn)程過家家,你玩完,我玩,我玩完你再玩,每個進(jìn)程耗費一個時間片的時間。對于Linux,RR時間片是100ms:

#define DEF_TIMESLICE (100 * HZ / 1000)

總結(jié)

以上是生活随笔為你收集整理的linux进程调度策略和优先,linux进程调度之FIFO和RR调度策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。