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