首页 文章

CFS中vruntime的概念是什么?

提问于
浏览
6

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

2 回答

  • 2

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

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

    考虑到各种因素 - 如优先级,漂亮的值,cgroups等 - vruntime的计算并不像简单的增量那样简单 . 我建议阅读"Professional Linux Kernel Architecture", 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)
    

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

  • 11

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

    min_vruntime表示cfs runqueue的最小vruntime . 它表示在该cfs runqueue上计划的进程的所有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

相关问题