linux核心的三種主要排程策略:
1,SCHED_OTHER 分時排程策略,
2,SCHED_FIFO實時排程策略,先到先服務
3,SCHED_RR實時排程策略,時間片輪轉 實時程序將得到優先呼叫,實時程序根據實時優先順序決定排程權值。分時程序則透過nice和counter值決定權值,nice越小,counter越大,被排程的機率越大,也就是曾經使用了cpu最少的程序將會得到優先排程。 SHCED_RR和SCHED_FIFO的不同: 當採用SHCED_RR策略的程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的RR任務的排程公平。 SCHED_FIFO一旦佔用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄。 如果有相同優先順序的實時程序(根據優先順序計算的排程權值是一樣的)已經準備好,FIFO時必須等待該程序主動放棄後才可以執行這個優先順序相同的任務。而RR可以讓每個任務都執行一段時間。 相同點: RR和FIFO都只用於實時任務。 建立時優先順序大於0(1-99)。 按照可搶佔優先順序排程演算法進行。 就緒態的實時任務立即搶佔非實時任務。 所有任務都採用linux分時排程策略時:1,建立任務指定採用分時排程策略,並指定優先順序nice值(-20~19)。2,將根據每個任務的nice值確定在cpu上的執行時間(counter)。3,如果沒有等待資源,則將該任務加入到就緒佇列中。
4,排程程式遍歷就緒佇列中的任務,透過對每個任務動態優先順序的計算權值(counter+20-nice)結果,選擇計算結果最大的一個去執行,當這個時間片用完後(counter減至0)或者主動放棄cpu時,該任務將被放在就緒佇列末尾(時間片用完)或等待佇列(因等待資源而放棄cpu)中。
5,此時排程程式重複上面計算過程,轉到第4步。
6,當排程程式發現所有就緒任務計算所得的權值都為不大於0時,重複第2步。 所有任務都採用FIFO時:1,建立程序時指定採用FIFO,並設定實時優先順序rt_priority(1-99)。2,如果沒有等待資源,則將該任務加入到就緒佇列中。3,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值(1000+rt_priority),選擇權值最高的任務使用cpu,該FIFO任務將一直佔有cpu直到有優先順序更高的任務就緒(即使優先順序相同也不行)或者主動放棄(等待資源)。4,排程程式發現有優先順序更高的任務到達(高優先順序任務可能被中斷或定時器任務喚醒,再或被當前執行的任務喚醒,等等),則排程程式立即在當前任務堆疊中儲存當前cpu暫存器的所有資料,重新從高優先順序任務的堆疊中載入暫存器資料到cpu,此時高優先順序的任務開始執行。重複第3步。5,如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒佇列中刪除,加入等待佇列,此時重複第3步。 所有任務都採用RR排程策略時:1,建立任務時指定排程引數為RR,並設定任務的實時優先順序和nice值(nice值將會轉換為該任務的時間片的長度)。2,如果沒有等待資源,則將該任務加入到就緒佇列中。3,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值(1000+rt_priority),選擇權值最高的任務使用cpu。4,如果就緒佇列中的RR任務時間片為0,則會根據nice值設定該任務的時間片,同時將該任務放入就緒佇列的末尾。重複步驟3。5,當前任務由於等待資源而主動退出cpu,則其加入等待佇列中。重複步驟3。系統中既有分時排程,又有時間片輪轉排程和先進先出排程: 1,RR排程和FIFO排程的程序屬於實時程序,以分時排程的程序是非實時程序。2,當實時程序準備就緒後,如果當前cpu正在執行非實時程序,則實時程序立即搶佔非實時程序。
linux核心的三種主要排程策略:
1,SCHED_OTHER 分時排程策略,
2,SCHED_FIFO實時排程策略,先到先服務
3,SCHED_RR實時排程策略,時間片輪轉 實時程序將得到優先呼叫,實時程序根據實時優先順序決定排程權值。分時程序則透過nice和counter值決定權值,nice越小,counter越大,被排程的機率越大,也就是曾經使用了cpu最少的程序將會得到優先排程。 SHCED_RR和SCHED_FIFO的不同: 當採用SHCED_RR策略的程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的RR任務的排程公平。 SCHED_FIFO一旦佔用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄。 如果有相同優先順序的實時程序(根據優先順序計算的排程權值是一樣的)已經準備好,FIFO時必須等待該程序主動放棄後才可以執行這個優先順序相同的任務。而RR可以讓每個任務都執行一段時間。 相同點: RR和FIFO都只用於實時任務。 建立時優先順序大於0(1-99)。 按照可搶佔優先順序排程演算法進行。 就緒態的實時任務立即搶佔非實時任務。 所有任務都採用linux分時排程策略時:1,建立任務指定採用分時排程策略,並指定優先順序nice值(-20~19)。2,將根據每個任務的nice值確定在cpu上的執行時間(counter)。3,如果沒有等待資源,則將該任務加入到就緒佇列中。
4,排程程式遍歷就緒佇列中的任務,透過對每個任務動態優先順序的計算權值(counter+20-nice)結果,選擇計算結果最大的一個去執行,當這個時間片用完後(counter減至0)或者主動放棄cpu時,該任務將被放在就緒佇列末尾(時間片用完)或等待佇列(因等待資源而放棄cpu)中。
5,此時排程程式重複上面計算過程,轉到第4步。
6,當排程程式發現所有就緒任務計算所得的權值都為不大於0時,重複第2步。 所有任務都採用FIFO時:1,建立程序時指定採用FIFO,並設定實時優先順序rt_priority(1-99)。2,如果沒有等待資源,則將該任務加入到就緒佇列中。3,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值(1000+rt_priority),選擇權值最高的任務使用cpu,該FIFO任務將一直佔有cpu直到有優先順序更高的任務就緒(即使優先順序相同也不行)或者主動放棄(等待資源)。4,排程程式發現有優先順序更高的任務到達(高優先順序任務可能被中斷或定時器任務喚醒,再或被當前執行的任務喚醒,等等),則排程程式立即在當前任務堆疊中儲存當前cpu暫存器的所有資料,重新從高優先順序任務的堆疊中載入暫存器資料到cpu,此時高優先順序的任務開始執行。重複第3步。5,如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒佇列中刪除,加入等待佇列,此時重複第3步。 所有任務都採用RR排程策略時:1,建立任務時指定排程引數為RR,並設定任務的實時優先順序和nice值(nice值將會轉換為該任務的時間片的長度)。2,如果沒有等待資源,則將該任務加入到就緒佇列中。3,排程程式遍歷就緒佇列,根據實時優先順序計算排程權值(1000+rt_priority),選擇權值最高的任務使用cpu。4,如果就緒佇列中的RR任務時間片為0,則會根據nice值設定該任務的時間片,同時將該任務放入就緒佇列的末尾。重複步驟3。5,當前任務由於等待資源而主動退出cpu,則其加入等待佇列中。重複步驟3。系統中既有分時排程,又有時間片輪轉排程和先進先出排程: 1,RR排程和FIFO排程的程序屬於實時程序,以分時排程的程序是非實時程序。2,當實時程序準備就緒後,如果當前cpu正在執行非實時程序,則實時程序立即搶佔非實時程序。