linux 實時線程優先級問題——數值越大優先級越高嗎?


linux 實時線程優先級問題——數值越大優先級越高嗎?  

2012-06-03 15:14:23|  分類: linux內核開發 |字號 訂閱

     今天查看了linux下的實時線程,FIFO和RR策略的調度,遇到一個問題:

     priority越大優先級越高呢?還是越小越高呢?

     回答這個問題要明白一個問題,首先,linux2.6內核將任務優先級進行了一個劃分:

    0——99  實時進程 

   100——139   非實時進程

    現在,這個劃分是起決定作用的,而且一定是數值越小,優先級越高。

    但是,有時候從網上會看到 優先級數值越大,優先級越高?這又是怎麼回事?難道有一種說法錯了嗎?

   實際的原因是這樣的,對於一個實時進程,他有兩個參數來表明優先級——prio 和 rt_priority,

   prio纔是調度所用的最終優先級數值,這個值越小,優先級越高;

   而rt_priority 被稱作實時進程優先級,他要經過轉化——prio=MAX_RT_PRIO - 1- p->rt_priority; 

   MAX_RT_PRIO = 99;這樣意味着rt_priority值越大,優先級越高;

   而內核提供的修改優先級的函數,是修改rt_priority的值,所以越大,優先級越高

   所以用戶在使用實時進程或線程,在修改優先級時,就會有“優先級值越大,優先級越高的說法”,也是對的。


http://bbs.chinaunix.net/thread-1996337-1-1.html
                關於進程時間片的計算
    進程的時間片time_slice是基於進程靜態優先級的。
    靜態優先級越高(值越小),時間片就越大。
    計算時間片是通過函數task_timeslice()(kernel/sched.c)來完成的。
    通過優先級來計算時間片的等式爲:
        timeslice=MIN_TIMESLICE+((MAX_TIMESLICE-MIN_TIMESLICE)*(MAX_PRIO-1-(p)->static_prio)/(MAX_USER_PRIO-1))
    這樣的話就可以將100~139 的優先級映射到200ms~10ms 的時間片上去,優先級數值越大,則分配的時間片越小。
在Kernel2.6中時間片的計算是分散的,具體的計算既可以用task_timeslice(),也可以用其他方法。
    進程創建時,將父進程的時間片分一半給子進程,同時父進程的時間片減半。
    進程用完時間片以後,需要重新計算時間片,並將進程插入到相應的運行隊列。
    進程退出時,根據first_timeslice的值來決定是否將子進程的時間片返還給父進程。
平均等待時間sleep_avg
    平均等待時間sleep_avg既決定了進程優先級,又影響了進程交互程度。
    進程的平均等待時間(以nanosecond 爲單位),在0 到NS_MAX_SLEEP_AVG 之間取值,初值爲0。
    這個值是動態優先級計算的關鍵因子,sleep_avg 越大,計算出來的進程優先級也越高(數值越小)。
              

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章