linux核心的三種調度方法:
1,SCHED_OTHER 分時調度策略,
2,SCHED_FIFO即時調度策略,先到先服務
3,SCHED_RR即時調度策略,時間片輪轉
SCHED_RR調度和SCHED_FIFO調度的進程屬於即時進程,以分時調度的進程是非即時進程。
當即時進程準備就緒後,如果當前cpu正在運行非即時進程,則即時進程立即搶佔非即時進程。
SCHED_RR線程和SCHED_FIFO線程都採用即時優先順序做為調度的權值標準,RR是FIFO的一個延伸。FIFO時,如果兩個進程的優先順序一樣,則這兩個優先順序一樣的進程具體執行哪一個是由其在隊列中的位置決定的,這樣導致一些不公正性(優先順序是一樣的,為什麼要讓你一直運行?),如果將兩個優先順序一樣的任務的調度策略都設為RR,則保證了這兩個任務可以迴圈執行,保證了公平。
使用pthread_yield()可以放棄線程的執行權
採用SCHED_RR和SCHED_FIFO的即時線程調用pthread_yield後,還是處於就緒隊列中,沒有同等優先順序或者更高優先順序的情況下,他們將繼續運行
linux核心的調度單位是線程(linux下線程和進程的概念是比較模糊的,執行線程是核心的調度對象),在測試時,使用SCHED_FIFO和SCHED_RR能夠達到95%的cpu使用率,而運行while(1)的分時線程(在不通的進程裡面)得到30%左右。同時同時運行帶有即時調度的線程(不阻塞)的進程和分時線程時,分時線程也能獲得少量的執行時間。
SCHED_FIFO和SCHED_RR並不是嚴格按照SCHED_FIFO和SCHED_RR定義執行的,根據linux 核心的調度策略不通其它線程或多或少獲得了CPU時間(如上)
即時線程的建立需要超級使用者權限
即時線程的建立
routine是執行常式,dwPriority是優先順序sched_get_priority_max和sched_get_priority_min得到一般為1-99越大優先順序越高
int create_fifo_thd(void* (* routine)(void* param),int dwPriority)
{
int hea ;
pthread_attr_t Attr;
pthread_attr_init(&Attr);
/*優先順序繼承 pthread_attr_setinheritsched 後SCHED_RR SCHED_FIFO 才會起作用********************/
if (pthread_attr_getinheritsched(&Attr, &hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
hea = PTHREAD_EXPLICIT_SCHED;
if (pthread_attr_setinheritsched(&Attr, hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_EXPLICIT_SCHED\n");
// exit(1);
/***********************************************************************/
if (pthread_attr_setschedpolicy(&Attr,SCHED_FIFO) != 0)
printf("\npthread_attr_setschedpolicy\n");
pthread_attr_setdetachstate(&Attr,PTHREAD_CREATE_DETACHED);
struct sched_param sch_param;
sch_param.sched_priority = dwPriority;
if (pthread_attr_setschedparam(&Attr,&sch_param) != 0)
printf("\npthread_attr_setschedparam\n");
pthread_t pid = 0;
if (pthread_create(&pid,&Attr,routine,0) != 0) {
printf("\npthread_create err\n");
}
pthread_attr_destroy(&Attr);
return pid;
}
int create_rr_thd(void* (* routine)(void* param),int dwPriority)
{
int hea ;
int policy;
pthread_attr_t Attr;
pthread_attr_init(&Attr);
/*優先順序繼承 pthread_attr_setinheritsched 後SCHED_RR SCHED_FIFO 才會起作用********************/
if (pthread_attr_getinheritsched(&Attr, &hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
hea = PTHREAD_EXPLICIT_SCHED;
if (pthread_attr_setinheritsched(&Attr, hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_EXPLICIT_SCHED\n");
/***********************************************************************/
if (pthread_attr_setschedpolicy(&Attr,SCHED_RR) != 0)
printf("\npthread_attr_setschedpolicy\n");
pthread_attr_getschedpolicy(&Attr,&policy);
if (policy == SCHED_RR) {
printf("\nSCHED_RR\n");
} else if (policy == SCHED_FIFO) {
printf("\nSCHED_FIFO\n");
} else if (policy == SCHED_OTHER) {
printf("\nSCHED_OTHER\n");
}
//exit(1);
pthread_attr_setdetachstate(&Attr,PTHREAD_CREATE_DETACHED);
struct sched_param sch_param;
sch_param.sched_priority = dwPriority;
if (pthread_attr_setschedparam(&Attr,&sch_param) != 0)
printf("\npthread_attr_setschedparam\n");
pthread_t pid = 0;
if (pthread_create(&pid,&Attr,routine,0) != 0) {
printf("\npthread_create err\n");
}
pthread_attr_destroy(&Attr);
return pid;
}