ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

了解CFS完全公平调度器

2022-05-12 17:01:05  阅读:183  来源: 互联网

标签:curr rq exec 调度 cfs 公平 vruntime 进程 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有