linux内核之实时进程调和组调.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux内核之实时进程调和组调

Linux内核之实时进程调度和组调度 作者:harvey wang 邮箱: HYPERLINK mailto:harvey.perfect@ harvey.perfect@ 新浪博客地址: HYPERLINK /harveyperfect /harveyperfect ,有关于减肥和学习英语相关的博文,欢迎交流 Linux支持三种进程调度策略,分别是SCHED_FIFO 、 SCHED_RR和SCHED_NORMAL。Linux支持两种类型的进程,实时进程和普通进程。实时进程可以采用SCHED_FIFO 和SCHED_RR调度策略;普通进程采用SCHED_NORMAL调度策略。 Linux为实时进程划分了100个优先级,从0—99,0为最高优先级,99为最低实时优先级,请参考《linux内核之进程优先级》。为了实现O(1)调度算法,内核为每个优先级维护一个运行队列和一个DECLARE_BITMAP,内核根据DECLARE_BITMAP的bit数值找出非空的最高优先级队列编号,即queue[]数组的下标,从而可以直接从非空最高优先级队列中取出进程进行运行。 #define MAX_RT_PRIO 100 相同优先级的FIFO实时进程和RR实时进程挂到同一个运行队列上,他们的不同在于RR实时进程运行一段时间后(时间片耗尽),重新挂到运行队列的尾部等待下一次运行。而FIFO的实时进程一旦运行,则会一直占据CPU直到更高优先级的FIFO或RR进程抢占,或自己主动放弃CPU。这样子好像很不公平,通常会把运行时间较短的进程设置为FIFO调度策略,把运行时间较长的进程设置为RR调度策略。 RR实时进程是有时间片的,FIFO实时进程是没有时间片。但也有的说FIFO进程也有时间片,从内核代码看,FIFO实时进程也是有时间片的,是为了在很多处理中不需要使用if语句区分这两种进程,而在时钟中断中只会减少RR进程的时间片,不会改变FIFO进程的时间片。FIFO进程的时间片永远用不完,使其时间片失去作用。 不同优先级的实时进程间是基于优先级进行抢占的。实时进程也是完全抢占普通进程的吗?Linux内核设置了两个全局变量,单位为us,如下 unsigned int sysctl_sched_rt_period = 1000000; int sysctl_sched_rt_runtime = 950000; sysctl_sched_rt_period表示实时进程运行周期为1s,sysctl_sched_rt_runtime表示在运行周期内,实时进程最多运行0.95秒。内核强制实时进程为普通进程预留出一定的运行时间。当???可以把sysctl_sched_rt_runtime和sysctl_sched_rt_period设置成相同的数值,即实时进程可以完全抢占普通进程。 实时进程调度相关的数据结构 struct rq { struct cfs_rq cfs; struct rt_rq rt; } struct rt_rq { struct rt_prio_array active; } struct rt_prio_array { DECLARE_BITMAP(bitmap, MAX_RT_PRIO+1); /* include 1 bit for delimiter */ struct list_head queue[MAX_RT_PRIO]; } 参考下图红色框中,struct rq为每个cpu上最顶层调度数据结构,其中包括CFS调度队列struct cfs_rq cfs(参见《linux内核之CFS调度和组调度》)和实时进程调度数据结构struct rt_rq rt,其中实时进程调度数据结构中包含了调度队列struct rt_prio_array,在该结构中为每个实时优先级分配了一个队列头,用于挂接该优先级的实时进程(其实是进程对应的调度实体se)。 实时进程组调度 实时进程组调度的文字是基于《linux组调度浅析》(作者:百度空间的kouu)中的描述整理得到。 实时进程是对CPU有着实时性要求的进程,它的优先级是跟具体任务相关的,完全由用户来定义的。调度器总是会选择优先级最高的实时进程来运行。实时进程组的优先级就被定义为“组内最高优先级的进程所拥有的优先级”。比如组内有三个优先级分别为10、20、30的进程,则组的优先级就是10(数值越小优先级越大)。 将实时进程分组还有什么意义呢?无论分组与否,调度程序要做的事情都是“在所有TASK_RUNNING状态的实时进程中选择优先级最高的那一个”。 其实,实时进程的分组就把sched_rt_runtime_us和sched_rt_period_us的概念扩

文档评论(0)

panguoxiang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档