CFS中vruntime的概念是什么?

iam*_*aza 10 linux schedule scheduler linux-kernel

我一直在阅读内核中的Linux内核和CFS调度程序.我遇到了vruntime(虚拟运行时),它是CFS调度程序背后的核心概念.我从" Linux内核开发 "和互联网上的其他博客中读到,但无法理解vruntime背后的基本计算.是否vruntime属于特定进程或它属于一组进程具有相同的nice值.什么是加权因子以及如何计算?我经历了所有这些概念,但无法理解.另外vruntime和*min_vruntime*有什么区别?

kai*_*wan 16

vruntime是每线程; 它是嵌套在task_struct中的成员.

本质上,vruntime是线程"运行时"的度量 - 它在处理器上花费的时间.CFS的重点是对所有人公平; 因此,算法可归结为一个简单的事情:(在给定的队列中的任务中)具有最低vruntime的任务是最值得运行的任务,因此将其选为"下一个".(实际的实现是使用rbtree来提高效率).

考虑到各种因素 - 如优先级,漂亮的值,cgroups等 - vruntime的计算并不像简单的增量那样简单.我建议阅读"专业Linux内核架构"中的相关部分,Mauerer,Wrox Press - 它的详细解释.

Pl见下面快速尝试总结其中的一些内容.

其他资源: Documentation/scheduler/sched-design-CFS.txt

快速摘要 - vruntime计算:( 基于本书)

  • 大部分工作都在kernel/sched_fair.c中完成:__ update_curr()

  • 打电话给计时器

  • 更新刚刚在处理器上花费的"当前"的物理和虚拟时间

  • 对于以默认优先级运行的任务,即nice值0,所花费的物理和虚拟时间是相同的

  • 对于其他优先(好)级别的任务不是这样; 因此,vruntime的计算受到使用负载权重因子的当前优先级的影响

    delta_exec =(unsigned long)(现在 - curr-> exec_start); // ... delta_exec_weighted = calc_delta_fair(delta_exec,curr); curr-> vruntime + = delta_exec_weighted;

忽略一些舍入和溢出检查,calc_delta_fair所做的是计算由以下公式给出的值:

delta_exec_weighed = delta_exec * (NICE_0_LOAD / curr->load.weight)
Run Code Online (Sandbox Code Playgroud)

问题是,更重要的任务(具有较低值的那些)将具有更大的权重; 因此,通过上面的等式,对它们的vruntime将会更小(因此它们在rbtree上更多地排在左边!).

  • @kaiwan 将 min_vruntime 与最小粒度混淆了。min_vruntime 只是跟踪当前在给定红黑树中找到的任何 vruntime 值的最小值。 (2认同)

小智 5

vruntime 是进程的虚拟运行时,它有助于跟踪进程运行了多少时间。vruntime 是 include/linux/sched.h 中定义的 sched_entity 结构的成员

min_vruntime 表示 cfs 运行队列的最小 vruntime。它表示在该 cfs 运行队列上调度的进程的所有 vruntime 中的最小值。min_vruntime 是 include/linux/sched.h 中定义的 cfs_rq 结构的成员

min_vruntime 的目的是选择cfs runqueue 中的下一个进程运行。为了对所有进程公平,CFS调度器选择vruntime最小的进程先执行。

include/linux/sched.h 的链接是http://lxr.free-electrons.com/source/include/linux/sched.h