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 centos7修改默认启动的内核(升级及切换内核)
修改默认启动的内核步骤 uname -r # 查看当前内核版本cat /boot/grub2/grub.cfg |grep "menuentry " # 查看所有可用内核grub2 ...
- linux 线程优先级的高低和执行顺序的关系,混乱的Linux内核实时线程优先级
原标题:混乱的Linux内核实时线程优先级 背景 Linux会把进程分为普通进程和实时进程,普通进程采用CFS之类调度算法,而实时进程则是采用SCHED_FIFO或SCHED_RR. 无论优先级高低, ...
- Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转
目录 Priority inheritance in the kernel 译文 Priority inheritance in the kernel https://lwn.net/Articles ...
- 将linux内核烧进arm板,ARM开发板上uClinux内核移植
<ARM开发板上uClinux内核移植>由会员分享,可在线阅读,更多相关<ARM开发板上uClinux内核移植(19页珍藏版)>请在人人文库网上搜索. 1.纷傲掌秀悸篷益哑檀扬 ...
- 【Linux】如何设置Centos启动默认使用的内核
目录 CentOS8 修改方法 CentOS7 修改方法 原理说明 报错处理 grubby是一个用于更新和显示有关各种体系结构特定的引导程序的配置文件信息的命令行工具. 它主要设计用于安装新内核并需要 ...
- 在ARMSYS(S3C44B0X开发板)上进行uClinux内核移植的总结
标题 针对"如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植"的一个总结,其内容包括对Bootloader的功能分析和uClinux2.4.24发行版 ...
- [转]Linux 2.6.19.x 内核编译配置选项简介
Linux 2.6.19.x 内核编译配置选项简介 作者:金步国,转载地址:http://lamp.linux.gov.cn/Linux/kernel_options.html 版权声明 本文作者是一 ...
- Linux 2.6.19.x 内核编译配置选项简介(内核裁剪)
Linux 2.6.19.x 内核编译配置选项简介 Code maturity level options 代码成熟度选项 Prompt for development and/or incomple ...
- [Linux]Linux 2.6.19.x 内核编译配置选项简介
Linux 2.6.19.x 内核编译配置选项简介 Code maturity level options 代码成熟度选项 Prompt for development and/or incomple ...
最新文章
- Linux 安装完毕要做的事
- 并发基础篇(二):Thread类的API总结
- hazelcast_Hazelcast的MapLoader陷阱
- CentOS7 Nexus安装
- solr 6.4 mysql_solr6.4.1搜索引擎(2)首次同步mysql数据库
- 【PAT (Basic Level) Practice (中文)】1029 旧键盘 (20分)
- open source Lrc歌词解析器发布
- 开源规则引擎Drools、URule简介
- 今日头条信息流 - 基础账户实操
- 一个由“2020年1月7日 京东出现的重大 Bug 漏洞“引起的思考......
- 首发丨极课大数据完成1亿元B轮融资,用AI提升学生作业、考试管理效率
- 服务器DDoS攻击有几种类型?
- 上知天文,下知地理,还能替人写脚本!人工智能的进阶ChatGPT
- 基于车辆运动学模型的LQR横向控制算法
- 数据爬取-奇技淫巧系列1——抓取隐藏在CDN,防爬代理等服务后面的数据
- (Modern Family S01E01) Part 9 PhilClair 射Luke、Haley和Dylan躺床上看电影
- 日语(五十元音)_01
- 《Cinema 4D + After Effects动态图形设计案例解析》——第 1 章 动态图形设计概述 1.1 什么是动态图形...
- 皇帝成长计划html文件打不开,皇帝成长计划源代码修改(共6篇).doc
- R语言 编写循环语句