linux进程调度策略和优先,linux进程调度之FIFO和RR调度策略
嚴(yán)格地說,對(duì)于優(yōu)先級(jí)對(duì)于實(shí)時(shí)進(jìn)程和普通進(jìn)程的意義是不一樣的。
1、在一定程度上,實(shí)時(shí)進(jìn)程優(yōu)先級(jí)高,實(shí)時(shí)進(jìn)程存在,就沒有普通進(jìn)程占用CPU的機(jī)會(huì),(但是前一篇博文也講過了,實(shí)時(shí)組調(diào)度出現(xiàn)在內(nèi)核以后,允許普通進(jìn)程占用少量的CPU時(shí)間,取決于配置)。
2、對(duì)于實(shí)時(shí)進(jìn)程而言,高優(yōu)先級(jí)的進(jìn)程存在,低優(yōu)先級(jí)的進(jìn)程是輪不上的,沒機(jī)會(huì)跑在CPU上,所謂實(shí)時(shí)進(jìn)程的調(diào)度策略,指的是相同優(yōu)先級(jí)之間的調(diào)度策略。如果是FIFO實(shí)時(shí)進(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í)的進(jìn)程橫空出世,搶占FIFO進(jìn)程的CPU。有些人覺得很奇怪,怎么FIFO占著CPU,為啥還能有更高優(yōu)先級(jí)的進(jìn)程出現(xiàn)呢。別忘記,我們是多核多CPU ,如果其他CPU上出現(xiàn)了一個(gè)比FIFO優(yōu)先級(jí)高的進(jìn)程,可能會(huì)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)度策略是時(shí)間片輪轉(zhuǎn)RR,那么,除了前面提到的abcd,RR實(shí)時(shí)進(jìn)程耗盡自己的時(shí)間片后,自動(dòng)退到對(duì)應(yīng)優(yōu)先級(jí)實(shí)時(shí)隊(duì)列的隊(duì)尾,重新調(diào)度。
struct sched_param {/* ... */int sched_priority;/* ... */};int sched_setscheduler (pid_t pid,int policy,const struct sched_param *sp);
sched_setscheduler函數(shù)的第二個(gè)參數(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)程,對(duì)于普通進(jìn)程,第三個(gè)參數(shù)sp->sched_priority只能是0
SCHED_FIFO 和SCHED_RR表示實(shí)時(shí)進(jìn)程的調(diào)度策略,第三個(gè)參數(shù)的取值范圍為[1,99]。
如果sched_setscheduler 優(yōu)先級(jí)設(shè)置的值和調(diào)度策略不符合的話,會(huì)返回失敗的。
應(yīng)用層和內(nèi)核層的優(yōu)先級(jí)含義是不同的:
首先說實(shí)時(shí)進(jìn)程:實(shí)時(shí)進(jìn)程的優(yōu)先級(jí)設(shè)置可以通過sched_setsheduler設(shè)置,也可以通過sched_setparam設(shè)置優(yōu)先級(jí)的大小。
int sched_setparam (pid_t pid, const struct sched_param *sp);
在用戶層或者應(yīng)用層,1表示優(yōu)先級(jí)最低,99表示優(yōu)先級(jí)最高。但是在內(nèi)核中,[0,99]表示的實(shí)時(shí)進(jìn)程的優(yōu)先級(jí),0最高,99最低。[100,139]是普通進(jìn)程折騰的范圍。應(yīng)用層比較天真率直,就看大小,數(shù)字大,則優(yōu)先級(jí)高。ps查看進(jìn)程的優(yōu)先級(jí)也是如此。有意思的是,應(yīng)用層實(shí)時(shí)進(jìn)程最高優(yōu)先級(jí)的99,在ps看進(jìn)程優(yōu)先級(jí)的時(shí)候,輸出的是139.
對(duì)于普通進(jìn)程,是通過nice系統(tǒng)調(diào)用來調(diào)整優(yōu)先級(jí)的。從內(nèi)核角度講[100,139]是普通進(jìn)程的優(yōu)先級(jí)的范圍,100最高,139最低,默認(rèn)是120。普通進(jìn)程的優(yōu)先級(jí)的作用和實(shí)時(shí)進(jìn)程不同,普通進(jìn)程優(yōu)先級(jí)表示的是占的CPU時(shí)間。深入linux內(nèi)核架構(gòu)中提到,普通優(yōu)先級(jí)越高(100最高,139最低),享受的CPU time越多,相鄰的兩個(gè)優(yōu)先級(jí),高一級(jí)的進(jìn)程比低一級(jí)的進(jìn)程多占用10%的CPU,比如內(nèi)核優(yōu)先級(jí)數(shù)值為120的進(jìn)程要比數(shù)值是121的進(jìn)程多占用10%的CPU。
內(nèi)核中有一個(gè)數(shù)組:prio_to_weight[20]表示的是默認(rèn)優(yōu)先級(jí)120的權(quán)重,數(shù)值為1024,prio_to_weight[21]表示nice值為1,優(yōu)先級(jí)為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臺(tái)電腦,10個(gè)人玩,怎么才公平。
1 約定好時(shí)間片,每人玩1小時(shí),玩完后記賬,張XX 1小時(shí),誰玩的時(shí)間短,誰去玩
2 引入優(yōu)先級(jí)的概念,李四有緊急情況,需要提高他玩電腦的時(shí)間,怎么辦,玩1個(gè)小時(shí),記賬半小時(shí),那么同等情況下,李四會(huì)比其他人被選中玩電腦的頻率要高,就體現(xiàn)了這個(gè)優(yōu)先級(jí)的概念。
3 王五也有緊急情況,但是以考察,不如李四的緊急,好吧,玩1個(gè)小時(shí),記賬45分鐘。
4 情況有變化,聽說這里有電腦,突然又來了10個(gè)人,如果按照每人玩1小時(shí)的時(shí)間片,排在最后的那哥們?cè)缇烷_始罵人了,怎么辦?時(shí)間片動(dòng)態(tài)變化,根據(jù)人數(shù)來確定時(shí)間片。人越多,每個(gè)人玩的時(shí)間越少,防止哥們老撈不著玩,耐心耗盡,開始罵人。
這個(gè)記賬就是我們prio_to_weight的作用。我就不多說了,prio_to_weight[20]就是基準(zhǔn),玩一小時(shí),記賬一小時(shí),數(shù)組20以前的值是特權(quán)一級(jí),玩1小時(shí)記賬20分鐘之類的享有特權(quán)的,數(shù)組20之后是倒霉蛋,玩1小時(shí),記賬1.5小時(shí)之類的倒霉蛋。 CFS這種調(diào)度好在大家都能撈著玩。
對(duì)于FIFO而言,一旦sleep過后,高優(yōu)先級(jí)運(yùn)行,低優(yōu)先級(jí)是沒戲運(yùn)行的,同等優(yōu)先級(jí)的進(jìn)程,先運(yùn)行的不運(yùn)行完,后運(yùn)行的也沒戲。
對(duì)于RR而言,高優(yōu)先級(jí)的先運(yùn)行,同等優(yōu)先級(jí)的進(jìn)程過家家,你玩完,我玩,我玩完你再玩,每個(gè)進(jìn)程耗費(fèi)一個(gè)時(shí)間片的時(shí)間。對(duì)于Linux,RR時(shí)間片是100ms:
#define DEF_TIMESLICE (100 * HZ / 1000)
總結(jié)
以上是生活随笔為你收集整理的linux进程调度策略和优先,linux进程调度之FIFO和RR调度策略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios系统元素悬浮滑动错乱,和ios页面
- 下一篇: 物联网技术再升级,雄迈安防布线技术首推X