linux内核之CFS调和组调.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  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内核之CFS调和组调

Linux内核之CFS调度和组调度 作者: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调度策略。 本文主要讨论普通进程的调度算法,为了描述方便,后面章节中的“进程”指“普通进程”。 从Linux2.6.23内核到目前最新的Linux3.3.5内核的普通进程(采用调度策略SCHED_NORMAL)采用了绝对公平调度算法,CFS(completely fair schedule)。CFS从RSDL/SD中吸取了完全公平的思想,不再跟踪进程的睡眠时间,也不再区分交互式进程。它将所有的进程都统一对待,这就是公平的含义。CFS 调度中,进程数据结构中的动态优先级成员prio还继续有效,只是内核不再动态调整进程的动态优先级了。 进程的优先级为100—139,对应的nice值为-20—19。和之前版本的优先级规定相同。Nice 和优先级对应关系如下 如何实现公平调度的?内核给每个进程维护了一个虚拟运行时间vruntime,每个进程运行一段时间后,虚拟运行时间会增加,但是运行同样的实际时间每个进程增加的数值是不同的。比如nice值为0的进程运行了10ms,其虚拟运行时间增加了1vms(vms为1虚拟毫秒,为了描述方便而定义);nice为19的进程运行10ms,其虚拟运行时间增加了1000vms。进程在其生命周期中,其虚拟运行时间一直都是在增加的。内核把虚拟运行时间看做实际运行时间,为了公平起见要选择运行时间短的进程进行运行。所以内核在调度中总是选择虚拟运行时间小的进程。对内核来说,这样就很公平了,O(∩_∩)O 同样运行10ms,如何确定一个进程该增加多少vms?增加的虚拟运行时间和进程的优先级nice数值有关,每个nice数值对应一个权重数值,见下图。 每个进程虚拟运行时间增加的时间量和 (NICE_0_LOAD/nice_n_weight) 成正比。其中NICE_0_LOAD 为1024,即nice数值为0的权重,nice_n_weight即为nice数值为n的进程的权重,如nice为-20(优先级最高的普通进程)的权重为88761。从这种算法也可以看出,优先级高的进程的虚拟运行时间增加的慢,其实际运行时间累计数值也就长。同样,这种算法能保证优先级低的进程也有运行机会,只是实际运行的时间比较短。 内核要把所有running状态的进程放到一起,在需要调度时从中取出一个虚拟运行时间短的进程。因为发生调度的频率非常高,查找合适进程的算法就变的很重要了。在CFS调度中,内核采用了以进程虚拟运行时间为key值的红黑树数据结构挂接各个running的进程。有关红黑树请参考《linux内核之红黑树》。 先要引入一个重要概念,调度实体(sched entiy):就是调度的对象。每个进程的task_struct包含了调度实体成员变量se。为何要引入调度实体,而不是直接使用进程的task_struct?是因为在CFS中支持CFS组调度,一个组中可能包含1个或多个进程。不能通过组中任何进程的task_struct来调度组,所以引入了调度实体的概念。为了统一起见,进程组和进程都使用调度实体保存调度相关的信息。后面会介绍CFS组调度。 在多核系统中,每个CPU(此处指一个核心)对应一个全局变量per_cpu_runqueues,其数据结构为struct rq,该变量为调度的最顶层的数据结构。在该数据结构中包含了cfs,其数据结构为struct cfs_rq。cfs 就是在该cpu上CFS调度的顶级结构,或者说是CFS调度的入口点。其实rq中还包括了rt成员变量,rt是实时进程调度的顶级结构。 struct cfs_rq { 为了说明方便,只保留部分成员变量 struct rb_root tasks_timeline; struct rb_node *rb_leftmost; struct sched_entity *curr, *next, *last, *skip; } 其中成员变量tasks_timeline指向了红黑树的根,所有的进程都挂到这棵红黑树上(有些是间接挂接的)。如下图中的单个进程,进程数据结构task_struct中包含了成员变量

文档评论(0)

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

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

1亿VIP精品文档

相关文档