首先,可以通過以下兩個函式來獲得執行緒可以設定的最高和最低優先順序,函式中的策略即上述三種策略的巨集定義:
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
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
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程序排程策略
linux程序排程策略 linux核心的三種主要排程策略 1,sched other 分時排程策略,2,sched fifo實時排程策略,先到先服務 3,sched rr實時排程策略,時間片輪轉 實時程序將得到優先呼叫,實時程序根據實時優先順序決定排程權值。分時程序則通過nice和counter值決...
程序排程演算法(程序排程策略)
程序排程演算法 排程演算法是指 根據系統的資源分配策略所規定的資源分配演算法。一 先來先服務和短作業 程序 優先排程演算法 1.先來先服務排程演算法。先來先服務 fcfs 排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。fcfs演算法比較有利於長作業 程序 而不利於短...
程序排程及排程策略
程序排程負責動態的將cpu分配給各個程序。主要功能如下 1 記住程序狀態。2 決定哪個程序,什麼時候獲取cpu及其占用多長時間。3 把cpu分配給程序,即將選中程序的pcb中有關程序的相關資訊,如程式狀態暫存器 通用暫存器等內容送入cpu的相應的暫存器中,從而讓該程序占用cpu去執行。4 收回cpu...