linux调度器_第三代cfs(2)_分解代码_vruntime和min_vruntime大概理解

时间:2021-04-10 14:36:18

接上文,上文我都记不太清楚了,没关系,看题目,我们是要来分解代码的。把《linux调度器_第三代cfs(1)_引入》中的代码放上来先。

//kernel\sched_fair.c 138行

static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se) 
{
return se-> se->vruntime- cfs_rq->min_vruntime;
}


哦,大概有点印象了,话说,cfs是把所有可运行进程都扔到一个红黑树(或者就认为是一个有序队列里),看谁关键值小谁在前面,就让谁先运行。而上面这段代码就是为了算出这个关键值。

 se->vruntime的分解

先算前面一个值。 se->vruntime,实体的虚拟运行时间。实体前面已经解释过了,因为有时候排队的有可能是进程组。虚拟俩字,后面再解释,先来理解运行时间这个概念。

假设(时间单位可能与计算机内部的有区别,但这里是为了方便理解)有三个进程,A,B,C。A已经运行了一秒,所以A的运行时间为1秒,A-runtime (是运行时间,而不是虚拟运行时间)= 1;B已经运行了3秒,因此B->runtime = 3;C已经运行了5秒,因此C->runtime = 5;来排个队,A1=1,B3= 2,C5=3,A排第一。cfs(暂时不考虑后面的cfs_rq->min_vruntime,因为这对所有进程都会减去这个值,可以暂时不考虑它)这时候就会选择A运行,因为它排最前面。如果让A运行3秒,这时候A的运行时间就是1+3=4秒了,再排队,B3=1,A4=2,C5=3,这时候就该选B进程运行了,运行了几秒之后再排队,cfs总选排在前面的运行。这基本上就是cfs的主要思想,再加上一些精妙的考虑,简直美死了。

细心的同学会发现前面的假设中并没有加上虚拟俩字,是的,那时是为了方便理解,现在来加上,肯定会问为什么要加上虚拟俩字?如果你有这样的疑问,我只能说问的好。问出了水平,想象一下,1秒钟飞机跟自行车走的距离肯定不一样吧,cfs为了让那些重要的进程有更多的时间运行,实际运行1秒,虚拟运行时间涨5秒,而那些不重要的进程,时间运行1秒,虚拟运行时间涨20秒。那么重要的进程肯定更容易排在前面,有更多的时间来运行。关于虚拟运行时间与进程的重要性的具体关系,再这里先不讨论,只需有一个大概的概念即可。

cfs_rq->min_vruntime

接着来分解第二个参数,cfs即Completely Fair Scheduler完全公平调度,rq就是Runnable Queue可运行队列,min最小,v,virtual虚拟的,运行时间。就是cfs的最小虚拟运行时间。需要记住的是这个参数是单调递增的就可以了。至于为什么需要这个参数,也查了一些资料。另外下文会给一些相关的网址,方便感兴趣的朋友深入研究。

这里会有一个相对的概念,最近刚刚高考完,然而你说理科600分高还是不高呢?湖北理科一本线是510分,假如你在湖北600分就老高了,然而浙江的理科一本线是626,所以在浙江理科600分并不算太高,所以cfs中也需要一个放之不同cpu之间,可以衡量此进程对cpu需求的标准,来衡量进程对cpu的相对需求程度。下面两段分别摘自别处。

     In order to remove the cfs_rq dependency from set_task_cpu() we need to ensure the task is cfs_rq invariant for all callsites.

为了移除cfs_rq对set_task_cpu() 【在smp(对称多处理结构的简称)中定义的函数,对称多处理结构的简称】的依赖性,我们需要一个不变的标准对各个调用的位置。
      The simple approach is to substract cfs_rq->min_vruntime from se->vruntime on dequeue, and add cfs_rq->min_vruntime on enqueue.

       最简单的方法就是在出队列时,减去一个cfs_rq->min_vruntime,在入队列时加上cfs_rq->min_vruntime。

总结:

      分别对排队的两个参数进行了一定的解释,仍是只需大概理解即可。

虚拟运行时间,因为进程的优先级不一样加入了权值的因素。

最小虚拟运行时间,则是为了创造一个相对的概念,有一个相对的认识。

参考文献

http://m.blog.csdn.net/blog/ctthunagchneg/8925591

http://bbs.chinaunix.net/forum.php?mod=viewthread&action=printable&tid=3665947