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上的左侧排队更多!)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)