linux进程调度算法:分时调度策略、FIFO调度策略、RR调度策略
原文鏈接:https://www.cnblogs.com/zhouhbing/p/3904827.html
Linux內核的三種調度策略
一 Linux內核的三種調度策略:
1,SCHED_OTHER 分時調度策略,
2,SCHED_FIFO實時調度策略,先到先服務。一旦占用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄
3,SCHED_RR實時調度策略,時間片輪轉。當進程的時間片用完,系統將重新分配時間片,并置于就緒隊列尾。放在隊列尾保證了所有具有相同優先級的RR任務的調度公平 Linux線程優先級設置
SCHED_OTHER 是不支持優先級使用的(但自己實驗過程中發現:一組進程采用的調度策略都是SCHED_OTHER時,是優先數越小,越先調用),而SCHED_FIFO和SCHED_RR支持優先級的使用,他們分別為1和99,數值越大優先級越高(的確如此,優先數越大,越先被調度)。如果程序控制線程的優先級,一般是用pthread_attr_getschedpolicy來獲取系統使用的調度策略,如果是 SCHED_OTHER的話,表明當前策略不支持線程優先級的使用,否則可以。
實時調度與非實時調度的主要區別是:
(1)實時調度所調度的任務有完成時限,而非實時調度沒有。從而,實時調度算法的正確與否不
僅與算法的邏輯有關,也與調度算法調度的時限有關。
(2)實時調度要求較快的進程或線程切換時間,而非實時調度的進程或線程的切換時間較長。
(3)非實時調度強調資源利用率(批處理系統)或用戶共享處理機(分時系統),實時調度則主要強
調在規定時限范圍內完成對相應設備的控制。
(4)實時調度為搶先式調度,而非實時調度則很少采用搶先式調度
二 優先級范圍的獲得
所設定的優先級范圍必須在最大和最小值之間。
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
三 設置和獲取優先級通過以下兩個函數
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
param.sched_priority = 51; //設置優先級
四 更改系統優先級初始值
系統創建線程時,默認的線程是SCHED_OTHER。所以如果我們要改變線程的調度策略的話,
可以通過下面的這個函數實現。
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
上面的param使用了下面的這個數據結構:
struct sched_param {
int __sched_priority; //所要設定的線程優先級
};
例:創建優先級為10的線程
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
param.sched_priority = 10;
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(xxx , &attr , xxx , xxx);
例:設置最高優先級
pthread_attr_t attr;
struct sched_param param;
pthread_t thread = pthread_self();//當前程序線程號
int rs = pthread_attr_init( &attr );
assert( rs == 0 );pthread_attr_setschedpolicy(&attr,SCHED_FIFO);//設置線程調度策略
param.sched_priority = sched_get_priority_max(SCHED_FIFO); //優先級設定
rs = pthread_attr_setschedparam( &attr, ¶m );//設置和獲取schedparam屬性pthread_attr_destroy(&attr);
五 編譯
編譯命令:
#g++ pthread_priority3.c -o pthread_priority3 -lpthread
否則,會有如下錯誤
/tmp/cc21HcoW.o(.text+0x4c): In function main': : undefined reference topthread_create’
collect2: ld returned 1 exit status
可以看出是在ld的時候系統無法找到pthread_create函數。也就是說編譯器在link得時候找不到其中的一個使用庫的函數。
如果差pthread_create的話可以發現其在pthread.so中,所以需要增加 -lpthread編譯參數,告訴linker在link的時候使用pthread模塊
其他的參考:
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/qq_32811489/article/details/70768264linux內核的三種調度方法:
注意:
實時進程將得到優先調用,實時進程根據實時優先級決定調度權值,分時進程則通過nice和counter值決定權值,nice越小,counter越大,被調度的概率越大,也就是曾經使用了cpu最少的進程將會得到優先調度。
兩個實時調度策略對比如下。
SHCED_RR和SCHED_FIFO的不同:
當采用SHCED_RR策略的進程的時間片用完,系統將重新分配時間片,并置于就緒隊列尾。將進程放在隊列尾保證了所有具有相同優先級的RR任務的調度公平。
SCHED_FIFO一旦占用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄。
如果有相同優先級的實時進程(根據優先級計算的調度權值是一樣的)已經準備好,FIFO時必須等待該進程主動放棄后才可以運行這個優先級相同的任務。而RR可以讓每個任務都執行一段時間。
SHCED_RR和SCHED_FIFO的相同點:
SHCED_RR和SHCED_FIFO都只用于實時任務。
創建時優先級大于0(1-99)。
按照可搶占優先級調度算法進行。
就緒態的實時任務立即搶占非實時任務。
所有任務都采用linux分時調度策略時:
計算結果最大的一個去運行,當這 個時間片用完后(counter減至0)或者主動放棄cpu時,該任務將被放在
就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄cpu)中。
所有任務都采用FIFO時:
所有任務都采用RR調度策略(輪轉法調度)時:
系統中既有分時調度,又有時間片輪轉調度和先進先出調度:
總結
以上是生活随笔為你收集整理的linux进程调度算法:分时调度策略、FIFO调度策略、RR调度策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OS中关于父子进程的执行顺序和多个子进程
- 下一篇: 倒水问题