了解CFS完全公平调度器
作者:互联网
CFS模拟理想多任务调度
公平,即对于n个正在运行的任务,当这些任务同时不断地运行时,CPU会尽可能分配给他们1/n的处理时间。CFS是一种基于加权公平排队思想的调度算法。
精确,指的是它采用红黑树作为调度的任务队列的数据结构。
为了实现CFS,很关键的一点就是进行时间记账。
时间记账:为每个进程维护一个虚拟时间。
进程调度:每个CPU一个红黑树,选择虚拟时间最小的进程运行。
虚拟时间:vruntime变量,记录一个程序到底运行了多长时间,以及它还应该再运行多久。
系统定时器周期性调用 update_curr()函数,来更新所有进程的vruntime,不管进场处于什么状态。
进程的运⾏时间计算公式为:
分配给进程的运⾏时间 = 调度周期 * 进程权重 / 所有进程权重之和
vruntime = 实际运⾏时间 * 1024 / 进程权重
调度周期:就是将所处于TASK_RUNNING态进程都调度⼀遍的时间。
CFS调度运行队列如下。
其中的min_vruntime,也是时常更新的。
当一个进程进入运行对列或者出队列时,会调用update_curr,更新min_vruntime
static void update_curr(struct cfs_rq *cfs_rq) { struct sched_entity *curr = cfs_rq->curr; u64 now = rq_clock_task(rq_of(cfs_rq)); u64 delta_exec; if (unlikely(!curr)) return; /*计算进程运行时间 */ delta_exec = now - curr->exec_start; curr->exec_start = now; /*更新进程累计运行时间 */ curr->sum_exec_runtime += delta_exec; /*根据进程权重计算虚拟运行时间 */ curr->vruntime += calc_delta_fair(delta_exec, curr); /*更新cfs运行队列最小虚拟运行时间 */ update_min_vruntime(cfs_rq); }
参考:https://wenku.baidu.com/view/18630ef475eeaeaad1f34693daef5ef7ba0d1297.html
新创建的进程的虚拟时间为min_vruntime
休眠中的进程vruntime 会有补偿。防止休眠的vruntime 比其他进程小太多产生饥饿。
一个进程迁移到另一个进程vruntime 会做平衡性调整。
进程CPU占用时间片最小为1ms 不可以为无穷小。
标签:curr,rq,exec,调度,cfs,公平,vruntime,进程,CFS 来源: https://www.cnblogs.com/thotf/p/16263189.html