linux 線程優先順序__linux

來源:互聯網
上載者:User

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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.