Linux CFS(完全公平调度程序)延迟
我是Linux内核的初学者,我正试图学习Linux如何调度进程。
我已经阅读了一些关于Linux内核的书籍,并通过了IBM http://www.ibm.com/developerworks/linux/library/l-cfs/和所有链接,但我仍然留有一些疑问。
sysctl_sched_latency
时间内的所有任务? place_entity
函数中实际做了什么? sched_latency
减去vruntime
进行调整? 难道不会导致运行队列中的vruntime
值有很大差异吗? 首先是任务的虚拟运行时间
1.调度程序如何调度sysctl_sched_latency时间内的所有任务?
它维护一个时间排序的红黑树,所有可运行任务都按其虚拟运行时间排序。 左边的节点已经运行了最短的时间。 CFS选择最左边的任务并运行它,直到任务计划或调度程序打勾,然后将其运行的CPU时间添加到其虚拟运行时。 当它不再是最左边的节点时,则运行具有最短虚拟的新任务,并且预先处理旧任务。
2.当一个进程唤醒了place_entity函数中的实际操作时?
简洁版本:
当某个进程唤醒时,place_entity函数会保留该任务的虚拟运行时,或者增加它。
长版本:
当一个进程唤醒时,place_entity函数会执行以下操作
将临时虚拟运行时初始化为最小任务的CFS运行队列的虚拟运行时。
由于低于单个延迟的睡眠不计算,因此将阈值变量初始化为sysctl_sched_latency。 如果GENTLE_FAIR_SLEEPERS功能被启用,那么这个变量的值是其一半。 用此阈值减少先前初始化的临时虚拟运行时间。
通过将计算的虚拟运行时间设置为其自身的最大值以及任务的虚拟运行时间,确保临时虚拟运行时间至少与任务的虚拟运行时间相等。
将任务的虚拟运行时设置为临时运行时。
3.当进程唤醒时,为什么通过从sched_latency中减去调整vruntime?
虚拟运行时间减少,因为低于单个延迟的睡眠不计算在内。 例如,如果任务的调度程序延迟时间不够,则该任务不应在红黑树中发生更改。
4.不能导致运行队列中的进程与vruntime值有很大差异吗?
我相信问题2的步骤3中描述的逻辑可以防止或至少将其最小化。
参考
sched.c Linux内核源码
sched_fair.c Linux内核源码
关于CFS计划程序设计的注意事项
链接地址: http://www.djcxy.com/p/43611.html