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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux进程调度算法:分时调度策略、FIFO调度策略、RR调度策略

發布時間:2025/6/17 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, &param);
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, &param );//設置和獲取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/70768264

linux內核的三種調度方法:

  • SCHED_OTHER 分時調度策略,
  • SCHED_FIFO實時調度策略,先到先服務
  • SCHED_RR實時調度策略,時間片輪轉
  • 注意:

    實時進程將得到優先調用,實時進程根據實時優先級決定調度權值,分時進程則通過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分時調度策略時:

  • 創建任務指定采用分時調度策略,并指定優先級nice值(-20~19)。
  • 將根據每個任務的nice值確定在cpu上的執行時間(counter)。
  • 如果沒有等待資源,則將該任務加入到就緒隊列中。
  • 調度程序遍歷就緒隊列中的任務,通過對每個任務動態優先級的計算(counter+20-nice)結果,選擇
    計算結果最大的一個去運行,當這 個時間片用完后(counter減至0)或者主動放棄cpu時,該任務將被放在
    就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄cpu)中。
  • 此時調度程序重復上面計算過程,轉到第4步。
  • 當調度程序發現所有就緒任務計算所得的權值都為不大于0時,重復第2步。
  • 所有任務都采用FIFO時:

  • 創建進程時指定采用FIFO,并設置實時優先級rt_priority(1-99)。
  • 如果沒有等待資源,則將該任務加入到就緒隊列中。
  • 調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用cpu,該FIFO任務將一直占有cpu直到有優先級更高的任務就緒(即使優先級相同也不行)或者主動放棄(等待資源)。
  • 調度程序發現有優先級更高的任務到達(高優先級任務可能被中斷或定時器任務喚醒,再或被當前運行的任務喚醒,等等),則調度程序立即在當前任務 堆棧中保存當前cpu寄存器的所有數據,重新從高優先級任務的堆棧中加載寄存器數據到cpu,此時高優先級的任務開始運行。重復第3步。
  • 如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒隊列中刪除,加入等待隊列,此時重復第3步。
  • 所有任務都采用RR調度策略(輪轉法調度)時:

  • 創建任務時指定調度參數為RR,并設置任務的實時優先級和nice值(nice值將會轉換為該任務的時間片的長度)。
  • 如果沒有等待資源,則將該任務加入到就緒隊列中。
  • 調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用cpu。
  • 如果就緒隊列中的RR任務時間片為0,則會根據nice值設置該任務的時間片,同時將該任務放入就緒隊列的末尾。重復步驟3。
  • 當前任務由于等待資源而主動退出cpu,則其加入等待隊列中。重復步驟3。
  • 系統中既有分時調度,又有時間片輪轉調度和先進先出調度:

  • RR調度和FIFO調度的進程屬于實時進程,以分時調度的進程是非實時進程
  • 實時進程準備就緒后,如果當前cpu正在運行非實時進程則實時進程立即搶占非實時進程
  • RR進程和FIFO進程都采用實時優先級做為調度的權值標準,RR是FIFO的一個延伸。FIFO時,如果兩個進程的優先級一樣,則這兩個優 級一樣的進程具體執行哪一個是由其在隊列中的未知決定的,這樣導致一些不公正性(優先級是一樣的,為什么要讓你一直運行?),如果將兩個優先級一樣的任務的調度策略都設為RR,則保證了這兩個任務可以循環執行,保證了公平。
  • 總結

    以上是生活随笔為你收集整理的linux进程调度算法:分时调度策略、FIFO调度策略、RR调度策略的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。