日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux+任务默认优先级,uclinux内核的任务优先级及其load_weight

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。