linux+任务默认优先级,uclinux内核的任务优先级及其load_weight
快樂(lè)蝦
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文適用于
ADSP-BF561
uclinux-2008r1.5-RC3(移植到vdsp5)
Visual DSP++ 5.0(update 5)
歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息
內(nèi)核將任務(wù)分為兩類,一類是實(shí)時(shí)任務(wù),另一類是非實(shí)時(shí)任務(wù),這兩類任務(wù)的優(yōu)先級(jí)并不同,在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)
即實(shí)時(shí)任務(wù)的優(yōu)先級(jí)為[0, 99],而非實(shí)時(shí)任務(wù)的優(yōu)先級(jí)則為[100, 139]。這個(gè)數(shù)值越小,表示其優(yōu)先級(jí)越高。
相應(yīng)的,調(diào)度策略也分為兩類:
/*
* Scheduling policies
*/
#defineSCHED_NORMAL0
#defineSCHED_FIFO1
#defineSCHED_RR2
#defineSCHED_BATCH3
其中對(duì)于實(shí)時(shí)任務(wù)可以使用SCHED_FIFO與SCHED_RR兩種策略,而對(duì)于非實(shí)時(shí)任務(wù)則使用SCHED_NORMAL和SCHED_BATCH兩種策略。
1.2static_prio到load_weight的轉(zhuǎn)換
每一個(gè)任務(wù)都有一個(gè)prio成員和load_weight成員,可以從優(yōu)先級(jí)計(jì)算load_weight,這個(gè)工作由set_load_weight函數(shù)完成:
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))
從這里就可以看出對(duì)于實(shí)時(shí)任務(wù)和非實(shí)時(shí)任務(wù)來(lái)講,它們的計(jì)算方式是不同的。
#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))
比較這兩個(gè)宏定義可以發(fā)現(xiàn)實(shí)時(shí)任務(wù)計(jì)算所得的load_weight值都將大于非實(shí)時(shí)任務(wù)的load_weight值,下面對(duì)此原因進(jìn)行分析:
#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這兩個(gè)值均為常數(shù),因而傳遞給LOAD_WEIGHT的值越大,計(jì)算所得的結(jié)果也越大。
在上面的宏定義中,使用了static_prio_timeslice函數(shù):
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)
從這里可以看出,傳給此函數(shù)的static_prio值越小,其計(jì)算所得的值越大。
再回頭看
#defineRTPRIO_TO_LOAD_WEIGHT(rp) /
(PRIO_TO_LOAD_WEIGHT(MAX_RT_PRIO) + LOAD_WEIGHT(rp))
由于非實(shí)時(shí)任務(wù)的值都將大于MAX_RT_PRIO,因此PRIO_TO_LOAD_WEIGHT(MAX_RT_PRIO)計(jì)算所得的值都將大于非實(shí)時(shí)任務(wù)計(jì)算所得的值,再加上LOAD_WEIGHT(rp)自然更大。從而可以得出結(jié)論:
實(shí)時(shí)任務(wù)計(jì)算所得的load_weight值都將大于用戶任務(wù)的load_weight值,且任務(wù)的優(yōu)先級(jí)越低,計(jì)算所得的值越大,不論它是實(shí)時(shí)任務(wù)還是非實(shí)時(shí)任務(wù)。
對(duì)于init_task這個(gè)默認(rèn)的任務(wù)來(lái)講,在HZ取默認(rèn)值250的情況下,其load_weight的值將為128。
總結(jié)
以上是生活随笔為你收集整理的linux+任务默认优先级,uclinux内核的任务优先级及其load_weight的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux中锚定符号的作用,Linux基
- 下一篇: linux中的ln属性,linux 常用