其他分享
首页 > 其他分享> > 了解CFS完全公平调度器

了解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