一尘不染

CFS中vruntime的概念是什么

linux

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


阅读 772

收藏
2020-06-07

共1个答案

一尘不染

vruntime是按线程的;它是嵌套在task_struct中的成员。

本质上,vruntime是线程“运行时”的度量,即线程在处理器上花费的时间。粮安委的重点是对所有人公平。因此,这种算法归结为一个简单的事情:(在给定运行队列中的任务中)具有最低vruntime的任务是最值得运行的任务,因此将其选择为“
next”。(为了提高效率,实际使用rbtree完成了实现)。

考虑到各种因素(例如优先级,可取值,cgroup等),vruntime的计算不像简单的增量那样简单。我建议阅读Wrox Press的Mauerer的“Professional Linux KernelArchitecture”中的相关部分-对其进行了详细说明。

请在下面快速总结一下其中的一些内容。

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

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

  • 大多数工作在kernel / sched_fair.c:__ update_curr()中完成

  • 调用计时器滴答

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

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

  • 对于其他优先级(不错)的任务则不是这样;因此,使用负载权重因子,vruntime的计算会受到电流优先级的影响

delta_exec =(无符号长)(现在– 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上的左侧排队更多!)。

2020-06-07