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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux进程调度之 FIFO 和 RR 调度策略

發(fā)布時(shí)間:2025/3/15 linux 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux进程调度之 FIFO 和 RR 调度策略 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載 http://blog.chinaunix.net/uid-24774106-id-3379478.html? linux進(jìn)程調(diào)度之 FIFO 和 RR 調(diào)度策略?2012-10-19 18:16:43

分類:?LINUX

?

? ? 作者:manuscola.bean@gmail.com

? ? 博客地址:bean.blog.chinaunix.net ?最近花了10幾天的時(shí)間,將linux進(jìn)程調(diào)度相關(guān)的內(nèi)核代碼看了兩遍左右,也看了一些講述linux進(jìn)程調(diào)度的一些文章,總想寫個(gè)系列文章,把進(jìn)程調(diào)度全景剖析一遍,但是總是感覺力不逮己,自己都不敢下筆寫文章了。算了,還是不難為自己了,就隨便寫寫自己的心得好了。
? ? 在用戶空間,或者應(yīng)用編程領(lǐng)域 ,Linux提供了一些API或者系統(tǒng)調(diào)用來影響Linux的內(nèi)核調(diào)度器,或者是獲取內(nèi)核調(diào)度器的信息。比如可以獲取或者設(shè)置進(jìn)程的調(diào)度策略、優(yōu)先級(jí),獲取CPU時(shí)間片大小的信息。 ? ? ? 這些接口一旦在應(yīng)用程序中調(diào)用,就像給湖面扔進(jìn)一顆石子,對(duì)內(nèi)核帶來了那些的影響,其實(shí)這是我內(nèi)心很激動(dòng)很想分享的東西,但是內(nèi)容好沒有組織好,所以本文的主題暫不深入涉及這些系統(tǒng)調(diào)用及對(duì)應(yīng)的內(nèi)核層的代碼。 ? ? ? 嚴(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)度。 ? ? ? 下面我們就是來探究FIFO策略和RR策略的特點(diǎn)。為了降低理解的難度,我將我們啟動(dòng)的實(shí)時(shí)進(jìn)程綁定到同一個(gè)核上。
  • #include<stdio.h>
  • #include<stdlib.h>
  • #include<unistd.h>
  • #include<sys/time.h>
  • #include<sys/types.h>
  • #include<sys/sysinfo.h>
  • #include<time.h>
  • #define __USE_GNU
  • #include<sched.h>
  • #include<ctype.h>
  • #include<string.h>
  • #define COUNT 300000
  • #define MILLION 1000000L
  • #define NANOSECOND 1000
  • void test_func()
  • {
  • ????int?i?=?0;
  • ????unsigned long long result?=?0;;
  • ????for(i?=?0;?i<8000?;i++)
  • ????{
  • ????????result?+=?2;
  • ????}
  • }
  • int?main(int?argc,char*?argv[])
  • {
  • ????int?i;
  • ????struct timespec sleeptm;
  • ????long interval;
  • ????struct timeval tend,tstart;
  • ????struct tm lcltime?=?{0};
  • ????struct sched_param param;
  • ????int?ret?=?0;
  • ????if(argc?!=?3)
  • ????{
  • ????????fprintf(stderr,"usage:./test sched_method sched_priority\n");
  • ????????return?-1;
  • ????}
  • ????cpu_set_t mask?;
  • ????CPU_ZERO(&mask);
  • ????CPU_SET(1,&mask);
  • ????if?(sched_setaffinity(0,?sizeof(mask),?&mask)?==?-1)?
  • ????{?
  • ????????printf("warning: could not set CPU affinity, continuing...\n");
  • ????}?
  • ????int?sched_method?=?atoi(argv[1]);
  • ????int?sched_priority?=?atoi(argv[2]);
  • ????/*????if(sched_method?>?2?||?sched_method?<?0)
  • ????????{
  • ????????fprintf(stderr,"sched_method scope [0,2]\n");
  • ????????return?-2;
  • ????????}
  • ????????if(sched_priority?>?99?||?sched_priority?<?1)
  • ????????{
  • ????????fprintf(stderr,"sched_priority scope [1,99]\n");
  • ????????return?-3;
  • ????????}
  • ????????if(sched_method?==?1?||?sched_method?==?2)*/
  • ????{
  • ????????param.sched_priority?=?sched_priority;
  • ????????ret?=?sched_setscheduler(getpid(),sched_method,&param);
  • ????????if(ret)
  • ????????{
  • ????????????fprintf(stderr,"set scheduler to %d %d failed %m\n");
  • ????????????return?-4;
  • ????????}
  • ????}
  • ????int?scheduler?=?sched_getscheduler(getpid());
  • ????fprintf(stderr,"the scheduler of PID(%ld) is %d, priority (%d),BEGIN time is :%ld\n",
  • ????????????getpid(),scheduler,sched_priority,time(NULL));
  • ????sleep(2);
  • ????sleeptm.tv_sec?=?0;
  • ????sleeptm.tv_nsec?=?NANOSECOND;
  • ????for(i?=?0;i<COUNT;i++)
  • ????{
  • ????????test_func();
  • ????}
  • ?
  • ????interval?=?MILLION*(tend.tv_sec?-?tstart.tv_sec)
  • ? ? ? ? ? ? ? ?+(tend.tv_usec-tstart.tv_usec);
  • ????fprintf(stderr," PID = %d\t priority: %d\tEND TIME is %ld\n",getpid(),sched_priority,time(NULL));
  • ????return 0;
  • }
  • ? ??上面這個(gè)程序有幾點(diǎn)需要說明的地方 ? ? 1 為了降低復(fù)雜度,綁定到了同一個(gè)核上,我做實(shí)驗(yàn)的機(jī)器是四核(通過cat /proc/cpuinfo可以看到) ? ? 2 ?sleep(2),是給其他進(jìn)程得到調(diào)度的機(jī)會(huì),否則無法模擬出多個(gè)不同優(yōu)先級(jí)的實(shí)時(shí)進(jìn)程并行的場(chǎng)景。sleep過后,就沒有阻塞性的系統(tǒng)調(diào)用了,高優(yōu)先級(jí)的就會(huì)占據(jù)CPU(FIFO),同等優(yōu)先級(jí)的進(jìn)程輪轉(zhuǎn)(RR)?
  • 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ì)返回失敗的。 ? ? ?內(nèi)核中有這么一段注釋:
  • /*
  • ?????*?Valid priorities?for?SCHED_FIFO?and?SCHED_RR are
  • ?????*?1..MAX_USER_RT_PRIO-1,?valid priority?for?SCHED_NORMAL,
  • ?????*?SCHED_BATCH?and?SCHED_IDLE?is?0.
  • ?????*/
  • ??? LINUX系統(tǒng)提供了其他的系統(tǒng)調(diào)用來獲取不同策略優(yōu)先級(jí)的取值范圍
  • #include?<sched.h>
  • int?sched_get_priority_min?(int?policy);
  • int?sched_get_priority_max?(int?policy);

  • 另外需要指出的一點(diǎn)是,應(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. ? ? ? 下面是ps -C test -o pid,pri,cmd,time,psr 的輸出:
  • PID ? PRI ?CMD ? ? ? ? ? ??TIME? ? ?PSR
  • ?6303 139?./test 1 99 ?00:00:04 ? ? ? 1
  • ? ??雖說本文主要講的是實(shí)時(shí)進(jìn)程,但是需要插句話。對(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)度好在大家都能撈著玩。 ? ? ? 扯到優(yōu)先級(jí)多說了幾句,現(xiàn)在回到正題。我將上面的C程序編譯成可執(zhí)行程序test,然后寫了一個(gè)腳本comp.sh。
  • [root@localhost sched]# cat comp.sh
  • #/bin/sh
  • ./test $1 99 &
  • usleep 1000;
  • ./test $1 70 &
  • usleep 1000;
  • ./test $1 70 &
  • usleep 1000;
  • ./test $1 70 &
  • usleep 1000;
  • ./test $1 50 &
  • usleep 1000;
  • ./test $1 30 &
  • usleep 1000;
  • ./test $1 10 &
  • ? ? ???因?yàn)閠est進(jìn)程有sleep 2秒,所以可以給comp.sh啟動(dòng)其他test的機(jī)會(huì)。可以看到有 99級(jí)(最高優(yōu)先級(jí))的實(shí)時(shí)進(jìn)程,3個(gè)70級(jí)的實(shí)時(shí)進(jìn)程,50級(jí),30級(jí),10級(jí)的各一個(gè)。 ? ? ? 對(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)
  • ?? ? ? 下面我們驗(yàn)證: 我寫了兩個(gè)觀察腳本,來觀察實(shí)時(shí)進(jìn)程的調(diào)度情況: ? ? ? 第一個(gè)腳本比較簡單,觀察進(jìn)程的CPU 占用的time,用ps工具就可以了:
  • [root@localhost sched]# cat getpsinfo.sh
  • #!/bin/sh
  • for((i = 0; i < 40; i++))
  • do
  • ? ? ps -C test -o pid,pri,cmd,time,psr >>psinfo.log 2>&1
  • ? ? sleep 2;
  • done
  • ? ? 第二個(gè)腳本比較復(fù)雜是systemtap腳本,觀察名字為test的進(jìn)程相關(guān)的上下文切換,誰替換了test,或者test替換了誰,同時(shí)記錄下test進(jìn)程的退出:
  • [root@localhost sched]#?cat cswmon_spec.stp?
  • global time_offset
  • probe begin?{?time_offset?=?gettimeofday_us()?}
  • probe scheduler.ctxswitch?{
  • ????if(next_task_name?==?"test"?||prev_task_name?==?"test")
  • ????{
  • ? ? ? ? ?t?=?gettimeofday_us()
  • ? ? ? ? ?printf(" time_off (%8d )%20s(%6d)(pri=%4d)(state=%d)->%20s(%6d)(pri=%4d)(state=%d)\n",
  • ? ? ? ? ? ? ? ? ? t-time_offset,
  • ? ? ? ? ? ? ? ? ? prev_task_name,
  • ? ? ? ? ? ? ? ? ? prev_pid,
  • ? ? ? ? ? ? ? ? ? prev_priority,
  • ? ? ? ? ? ? ? ? ??(prevtsk_state),
  • ? ? ? ? ? ? ? ? ? next_task_name,
  • ? ? ? ? ? ? ? ? ? next_pid,
  • ? ? ? ? ? ? ? ? ? next_priority,
  • ? ? ? ? ? ? ? ? ??(nexttsk_state))
  • ????}
  • }
  • probe scheduler.process_exit
  • {
  • ????if(execname()?==?"test")
  • ????printf("task :%s PID(%d) PRI(%d) EXIT\n",execname(),pid,priority);
  • }
  • probe timer.s($1)?{
  • ????printf("--------------------------------------------------------------\n")
  • ????????exit();
  • }
  • ? ? A) ? ?FIFO調(diào)度策略的輸出:
  • 終端1 :
  • stap ./cswmon_spec.stp 70
  • 終端2 :
  • ./getpsinfo.sh
  • 終端3
  • ./comp.sh 1
  • 輸出結(jié)果如下:
    ? ? 99優(yōu)先級(jí)跑完了,才輪到70優(yōu)先級(jí),但是雖說有3個(gè)70優(yōu)先級(jí),但是先跑的那個(gè)進(jìn)程跑完了,第二個(gè)優(yōu)先級(jí)為70的才能跑。因?yàn)檩敵鼋Y(jié)果用代碼無法漂亮的展示,所以我截了圖,截圖又不能把這個(gè)輸出都截下來,所以我很蛋疼。有需要結(jié)果的,我以附件形式附在最后。 ? ? 看下第二個(gè)腳本的輸出:
  • time_off ( 689546 ) test( 6305)(pri= 120)(state=0)-> migration/2( 11)(pri= 0)(state=0)
  • time_off ( 689977 ) stap( 5895)(pri= 120)(state=0)-> test( 6305)(pri= 120)(state=0)
  • time_off ( 690067 ) test( 6305)(pri= 29)(state=1)-> stap( 5895)(pri= 120)(state=0)
  • time_off ( 697899 ) test( 6303)(pri= 120)(state=0)-> migration/2( 11)(pri= 0)(state=0)
  • time_off ( 698042 ) test( 6307)(pri= 120)(state=0)-> migration/0( 3)(pri= 0)(state=0)
  • time_off ( 699114 ) stap( 5895)(pri= 120)(state=0)-> test( 6303)(pri= 120)(state=0)
  • time_off ( 699307 ) test( 6303)(pri= 0)(state=1)-> test( 6307)(pri= 120)(state=0)
  • time_off ( 699371 ) test( 6307)(pri= 29)(state=1)-> stap( 5895)(pri= 120)(state=0)
  • time_off ( 699392 ) test( 6309)(pri= 120)(state=0)-> migration/3( 15)(pri= 0)(state=0)
  • time_off ( 699966 ) events/1( 20)(pri= 120)(state=1)-> test( 6309)(pri= 120)(state=0)
  • time_off ( 700034 ) test( 6309)(pri= 29)(state=1)-> stap( 5895)(pri= 120)(state=0)
  • time_off ( 707379 ) test( 6311)(pri= 120)(state=0)-> migration/3( 15)(pri= 0)(state=0)
  • time_off ( 707587 ) test( 6313)(pri= 120)(state=0)-> migration/0( 3)(pri= 0)(state=0)
  • time_off ( 712021 ) stap( 5895)(pri= 120)(state=0)-> test( 6311)(pri= 120)(state=0)
  • time_off ( 712145 ) test( 6311)(pri= 49)(state=1)-> test( 6313)(pri= 120)(state=0)
  • time_off ( 712252 ) test( 6313)(pri= 69)(state=1)-> stap( 5895)(pri= 120)(state=0)
  • time_off ( 727057 ) test( 6315)(pri= 120)(state=0)-> migration/0( 3)(pri= 0)(state=0)
  • time_off ( 727952 ) stap( 5895)(pri= 120)(state=0)-> test( 6315)(pri= 120)(state=0)
  • time_off ( 728047 ) test( 6315)(pri= 89)(state=1)-> stap( 5895)(pri= 120)(state=0)
  • time_off ( 2690181 ) stap( 5895)(pri= 120)(state=0)-> test( 6305)(pri= 29)(state=0)
  • time_off ( 2699316 ) test( 6305)(pri= 29)(state=0)-> test( 6303)(pri= 0)(state=0)
  • task :test PID(6303) PRI(0) EXIT
  • time_off (13057854 ) test( 6303)(pri= 0)(state=64)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (13057864 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6305)(pri= 29)(state=0)
  • time_off (15333340 ) test( 6305)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (15333354 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6305)(pri= 29)(state=0)
  • time_off (18743409 ) test( 6305)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (18743422 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6305)(pri= 29)(state=0)
  • time_off (22154757 ) test( 6305)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (22154771 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6305)(pri= 29)(state=0)
  • task :test PID(6305) PRI(29) EXIT
  • time_off (22466855 ) test( 6305)(pri= 29)(state=64)-> test( 6307)(pri= 29)(state=0)
  • time_off (25563548 ) test( 6307)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (25563566 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6307)(pri= 29)(state=0)
  • time_off (28973602 ) test( 6307)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (28973616 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6307)(pri= 29)(state=0)
  • task :test PID(6307) PRI(29) EXIT
  • time_off (31846121 ) test( 6307)(pri= 29)(state=64)-> test( 6309)(pri= 29)(state=0)
  • time_off (32383671 ) test( 6309)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (32383683 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6309)(pri= 29)(state=0)
  • time_off (35793735 ) test( 6309)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (35793747 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6309)(pri= 29)(state=0)
  • time_off (39203797 ) test( 6309)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (39203809 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6309)(pri= 29)(state=0)
  • task :test PID(6309) PRI(29) EXIT
  • time_off (41200440 ) test( 6309)(pri= 29)(state=64)-> test( 6311)(pri= 49)(state=0)
  • time_off (42613866 ) test( 6311)(pri= 49)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (42613898 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6311)(pri= 49)(state=0)
  • time_off (46024070 ) test( 6311)(pri= 49)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (46024082 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6311)(pri= 49)(state=0)
  • time_off (49434004 ) test( 6311)(pri= 49)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (49434017 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6311)(pri= 49)(state=0)
  • task :test PID(6311) PRI(49) EXIT
  • ? ? 可以清楚的可到,同樣是70優(yōu)先級(jí)(內(nèi)核態(tài)是29),6305退出以前,6307根本就撈不著跑。同樣6307退出一樣,6309根本就撈不著跑。這就是FIFO。 ? B) RR的情況
  • 終端1 :
  • stap ./cswmon_spec.stp 70
  • 終端2 :
  • ./getpsinfo.sh
  • 終端3
  • ./comp.sh 1

  • ? ? ? 實(shí)時(shí)優(yōu)先級(jí)是70的三個(gè)進(jìn)程齊頭并進(jìn)。再看第二個(gè)腳本的輸出:
  • time_off ( 4188015 ) test( 6428)(pri= 0)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off ( 4188025 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6428)(pri= 0)(state=0)
  • time_off ( 7612014 ) test( 6428)(pri= 0)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off ( 7612024 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6428)(pri= 0)(state=0)
  • task :test PID(6428) PRI(0) EXIT
  • time_off (10679062 ) test( 6428)(pri= 0)(state=64)-> test( 6430)(pri= 29)(state=0)
  • time_off (10964413 ) test( 6430)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (10964422 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6430)(pri= 29)(state=0)
  • time_off (11709024 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (12736030 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (13779022 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (13879021 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (13984075 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (14084020 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (14184023 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (14284024 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (14374486 ) test( 6434)(pri= 29)(state=0)-> watchdog/1( 10)(pri= 0)(state=0)
  • time_off (14374502 ) watchdog/1( 10)(pri= 0)(state=1)-> test( 6434)(pri= 29)(state=0)
  • time_off (14384097 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (14484066 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (14584023 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (14684020 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (14786032 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (14886020 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (14986026 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (15089023 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (15192030 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (15292026 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (15396085 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (15496022 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • time_off (15596027 ) test( 6434)(pri= 29)(state=0)-> test( 6430)(pri= 29)(state=0)
  • time_off (15696153 ) test( 6430)(pri= 29)(state=0)-> test( 6432)(pri= 29)(state=0)
  • time_off (15796022 ) test( 6432)(pri= 29)(state=0)-> test( 6434)(pri= 29)(state=0)
  • ? ? 用戶態(tài)實(shí)時(shí)優(yōu)先級(jí)為99,內(nèi)核態(tài)優(yōu)先級(jí)為0的進(jìn)程6428退出后,3個(gè)用戶態(tài)實(shí)時(shí)優(yōu)先級(jí)為70的進(jìn)程6430,6432,6434你方唱罷我登場(chǎng),每個(gè)人都"唱"多久呢?看相鄰2條記錄的時(shí)間差,基本都在100ms左右,這就是時(shí)間片。 ? ? ? 后記:如果放開綁定到一個(gè)CPU的限制,同時(shí)加大實(shí)時(shí)進(jìn)程的個(gè)數(shù),多個(gè)實(shí)時(shí)進(jìn)程在CPU之間PULL和PUSH,是更復(fù)雜的情況,呵呵,希望拋磚引玉,能有人模擬下這種情況。 ? ? ? 附件為測(cè)試代碼及輸出: ? ???study_sched.txt??? 參考文獻(xiàn) 1 深入linux 內(nèi)核架構(gòu) 2 linux system program 3 systemtap example

    轉(zhuǎn)載于:https://www.cnblogs.com/diegodu/p/3924927.html

    總結(jié)

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

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