linux核心的三種排程策略:
1,sched_other 分時排程策略,
2,sched_fifo實時排程策略,先到先服務。一旦占用cpu則一直執行。一直執行直到有更高優先順序任務到達或自己放棄
3,sched_rr實時排程策略,時間片輪轉。當程序的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的rr任務的排程公平
linux執行緒優先順序設定
首先,可以通過以下兩個函式來獲得執行緒可以設定的最高和最低優先順序,函式中的策略即上述三種策略的巨集定義:
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
sched_other是不支援優先順序使用的,而sched_fifo和sched_rr支援優先順序的使用,他們分別為1和99,數值越大優先順序越高。
設定和獲取優先順序通過以下兩個函式
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
;
我們可以通過下面的測試程式來說明,我們自己使用的系統的支援的優先順序:
#
include
#include
#include
#include
<
assert
.h>
static
int get_thread_policy(
pthread_attr_t
*attr)
return policy;
}static
void show_thread_priority(
pthread_attr_t
*attr,
int policy)
static
int get_thread_priority(
pthread_attr_t
*attr)
static
void set_thread_policy(
pthread_attr_t
*attr,
int policy)
int main(
void
)
下面是測試程式的執行結果:
policy=sched_other
show current configuration of priority
max_priority=0
min_priority=0
show sched_fifo of priority
max_priority=99
min_priority=1
show sched_rr of priority
max_priority=99
min_priority=1
show priority of current thread
priority=0set thread policy
set sched_fifo policy
policy= sched_fifo
set sched_rr policy
policy= sched_rrrestore current policy
policy=sched_other
這裡測試一下其中的兩種特性,sched_other和sched_rr,還有就是優先順序的問題,是不是能夠保證,高優先順序的執行緒,就可以保證先執行。
下面的這個測試程式,建立了三個執行緒,預設建立的執行緒的排程策略是sched_other,其餘的兩個執行緒的排程策略設定成sched_rr。我的linux的核心版本是2.6.31。sched_rr是根據時間片來確定執行緒的排程。時間片用完了,不管這個執行緒的優先順序有多高都不會在執行,而是進入就緒佇列中,等待下乙個時間片的到了,那這個時間片到底要持續多長時間?在《深入理解linux核心》中的第七章程序排程中,是這樣描訴的,linux採取單憑經驗的方法,即選擇盡可能長、同時能保持良好相應時間的乙個時間片。這裡也沒有給出乙個具體的時間來,可能會根據不同的cpu 來定,還有就是多cpu 的情況。
#
include
#include
#include
#include
void thread1(
)printf
("thread 1\n");
}printf
("pthread 1 exit\n");
}void thread2(
)printf
("thread 2\n");
}printf
("pthread 2 exit\n");
}void thread3(
)printf
("thread 3\n");
}printf
("pthread 3 exit\n");
}int main(
)
下面是該程式的其中之一的執行結果:
sudo .
/prio_test
the current user is root
sched_other
sched_rr
sched_rr 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
pthread 1 exit
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
pthread 2 exit
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
pthread 3 exit
而不是絕對依靠優先順序的高低,來保證。
不過,從執行的結果上,我們可以看到,
排程策略為sched_rr的執行緒1,執行緒2確實搶占了排程策略為sched_other的執行緒3。這個是可以理解的,由於scher_rr是實時排程策略。
只有在下述事件之一發生時,實時程序才會被另外乙個程序取代。
(1) 程序被另外乙個具有更高實時優先順序的實時程序搶占。
(2) 程序執行了阻塞操作並進入睡眠
(3)程序停止(處於task_stopped 或task_traced狀態)或被殺死。
(4)程序通過呼叫系統呼叫sched_yield(),自願放棄cpu 。
(5)程序基於時間片輪轉的實時程序(sched_rr),而且用完了它的時間片。
基於時間片輪轉的實時程序是,不是真正的改變程序的優先順序,而是改變程序的基本時間片的長度。所以基於時間片輪轉的程序排程,並不能保證高優先順序的程序先執行。
下面是另一種執行結果:
sudo .
/prio_test
the current user is root
sched_other
sched_rr 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
thread 1
pthread 1 exit
sched_rr
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
thread 2
pthread 2 exit
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
thread 3
pthread 3 exit
Linux核心 程序排程
搶占式多工 由排程程式來決定什麼時間停止乙個程序的執行 程序的時間片 分配給每個可執行程序的處理器時間段 o 1 排程程式 反轉樓梯最後期限排程演算法 完全公平排程演算法 i o消耗型和處理器消耗型程序 i o消耗型程序 大部分時間用來提交i o請求或等待i o請求 處理器消耗型程序 把時間大部分用...
linux核心程序排程系列之排程概述
多工作業系統分為非搶占式多工和搶占式多工。linux採用的是搶占式多工的模式,這就意味著程序對cpu的占用時間是由作業系統決定的,跟具體的說,由作業系統的程序排程程式所決定的,這個章節就介紹關於程序的排程策略。一 排程策略 1 其實程序的排程策略和程序的型別有關 第一種分配方法 cpu消耗型和i o...
linux核心之程序排程(一)
等待佇列 sleep相關函式將程序的狀態設定為非執行態,在下一次排程來時,將在schedule函式中將本程序從執行佇列中移除。sleep函式將程序加入等待佇列,然後呼叫schedule函式選擇並重新開始另乙個程式的執行。當呼叫wake up類函式將程序喚醒時,wake up類函式將程序加入執行佇列中...