linux+任务默认优先级,uclinux内核的任务优先级及其load_weight
快樂蝦
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文適用于
ADSP-BF561
uclinux-2008r1.5-RC3(移植到vdsp5)
Visual DSP++ 5.0(update 5)
歡迎轉載,但請保留作者信息
內核將任務分為兩類,一類是實時任務,另一類是非實時任務,這兩類任務的優先級并不同,在include/linxu/sched.h中有如下定義:
/*
* Priority of a process goes from 0..MAX_PRIO-1, valid RT
* priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
* tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
* values are inverted: lower p->prio value means higher priority.
*
* The MAX_USER_RT_PRIO value allows the actual maximum
* RT priority to be separate from the value exported to
* user-space.This allows kernel threads to set their
* priority to a value higher than any user task. Note:
* MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
*/
#defineMAX_USER_RT_PRIO100
#defineMAX_RT_PRIOMAX_USER_RT_PRIO
#defineMAX_PRIO(MAX_RT_PRIO + 40)
即實時任務的優先級為[0, 99],而非實時任務的優先級則為[100, 139]。這個數值越小,表示其優先級越高。
相應的,調度策略也分為兩類:
/*
* Scheduling policies
*/
#defineSCHED_NORMAL0
#defineSCHED_FIFO1
#defineSCHED_RR2
#defineSCHED_BATCH3
其中對于實時任務可以使用SCHED_FIFO與SCHED_RR兩種策略,而對于非實時任務則使用SCHED_NORMAL和SCHED_BATCH兩種策略。
1.2static_prio到load_weight的轉換
每一個任務都有一個prio成員和load_weight成員,可以從優先級計算load_weight,這個工作由set_load_weight函數完成:
staticvoid set_load_weight(struct task_struct *p)
{
if (has_rt_policy(p)) {
#ifdefCONFIG_SMP
if (p == task_rq(p)->migration_thread)
/*
* The migration thread does the actual balancing.
* Giving its load any weight will skew balancing
* adversely.
*/
p->load_weight = 0;
else
#endif
p->load_weight = RTPRIO_TO_LOAD_WEIGHT(p->rt_priority);
} else
p->load_weight = PRIO_TO_LOAD_WEIGHT(p->static_prio);
}
這里有:
#defineis_rt_policy(p)((p) != SCHED_NORMAL && (p) != SCHED_BATCH)
#definehas_rt_policy(p)unlikely(is_rt_policy((p)->policy))
從這里就可以看出對于實時任務和非實時任務來講,它們的計算方式是不同的。
#definePRIO_TO_LOAD_WEIGHT(prio) /
LOAD_WEIGHT(static_prio_timeslice(prio))
#defineRTPRIO_TO_LOAD_WEIGHT(rp) /
(PRIO_TO_LOAD_WEIGHT(MAX_RT_PRIO) + LOAD_WEIGHT(rp))
比較這兩個宏定義可以發現實時任務計算所得的load_weight值都將大于非實時任務的load_weight值,下面對此原因進行分析:
#defineLOAD_WEIGHT(lp) /
(((lp) * SCHED_LOAD_SCALE) / TIME_SLICE_NICE_ZERO)
#defineSCHED_LOAD_SCALE128UL/* increase resolution of load */
#defineTIME_SLICE_NICE_ZERO DEF_TIMESLICE
#defineDEF_TIMESLICE(100 * HZ / 1000)
由于SCHED_LOAD_SCALE和TIME_SLICE_NICE_ZERO這兩個值均為常數,因而傳遞給LOAD_WEIGHT的值越大,計算所得的結果也越大。
在上面的宏定義中,使用了static_prio_timeslice函數:
staticunsigned int static_prio_timeslice(int static_prio)
{
if (static_prio < NICE_TO_PRIO(0))
return SCALE_PRIO(DEF_TIMESLICE * 4, static_prio);
else
return SCALE_PRIO(DEF_TIMESLICE, static_prio);
}
#defineSCALE_PRIO(x, prio) /
max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO / 2), MIN_TIMESLICE)
從這里可以看出,傳給此函數的static_prio值越小,其計算所得的值越大。
再回頭看
#defineRTPRIO_TO_LOAD_WEIGHT(rp) /
(PRIO_TO_LOAD_WEIGHT(MAX_RT_PRIO) + LOAD_WEIGHT(rp))
由于非實時任務的值都將大于MAX_RT_PRIO,因此PRIO_TO_LOAD_WEIGHT(MAX_RT_PRIO)計算所得的值都將大于非實時任務計算所得的值,再加上LOAD_WEIGHT(rp)自然更大。從而可以得出結論:
實時任務計算所得的load_weight值都將大于用戶任務的load_weight值,且任務的優先級越低,計算所得的值越大,不論它是實時任務還是非實時任務。
對于init_task這個默認的任務來講,在HZ取默認值250的情況下,其load_weight的值將為128。
總結
以上是生活随笔為你收集整理的linux+任务默认优先级,uclinux内核的任务优先级及其load_weight的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中锚定符号的作用,Linux基
- 下一篇: linux中的ln属性,linux 常用