CFS调度算法中有一个重要的概念,进程运行的虚拟时间vruntime,CFS调度算法时间是根据vruntime进行进程调度的。本文结合自己对vruntime的理解进行整理和梳理。

下面是理论上计算vruntime的公式:

从上面的公式推导可以看出,在一个调度周期(调度周期是一个可变量,在一个调度周期内,保证每个就绪队列的进程都能够有机会运行)内“虚拟运行时间”是相等的,但是在CFS调度算法中是以vruntime的值作为红黑树的健值,CFS也是根据红黑树的健值进行进程的调度的,CFS调度的优先级是vruntime的值越小,优先级越高,越能够进行优先调用。

从上面的CFS调度的原理看,为什么“虚拟运行时间”相等,但是在调度的时候又是按照“虚拟机运行时间”最小的值优先进行调用的呢。根据上面的公式“虚拟运行时间”不应该相等吗? 怎么又会出来最小的“虚拟运行时间”呢?

如果按照上面的公式进行推导的话“虚拟运行时间”确实是相同的。但是上面的公式计算是一种理想化的场景,但是在实际情况下,进程的调度涉及到多种因素,比如:周期性调度,进程因为各种原因进行了休眠、唤醒进程的加入等。因此这里公式的唯一一个不确定的变量就是进程的实际运行时间(内核中的变量为delta_exec),其实内核中针对实际运行时间的计算不是按照上面的公式进行套用的。

Update_curr函数在内核中会被频繁的调用,该函数就是计算和更新vruntime的。

static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se){
//如果权重等于NICE_0_LOAD的话,直接返回delta,说明delta就是进程的实际运行时间。if (unlikely(se->load.weight != NICE_0_LOAD))delta = __calc_delta(delta, NICE_0_LOAD, &se->load);return delta;
}

__calc_delta 函数根据上面的公式,通过移位的方式完成虚拟时间的计算。

进程的实际运行时间,并不是按照上面的公式1进行计算的,而是实际运行的一个时间差值。在update_curr函数中计算得到的。

在周期性调度函数中,有下面的针对ideal_runtime的计算,该变量为curr进程本次调度周期内应该占用的CPU时间,如果实际运行的时间已经大于理论运行时间,就设置为进程为TIF_NEED_RESCHED标志,表示可以调度。

check_preempt_tick函数里面计算了进程理想的ideal_runtime。

我们看一下,curr进程应该占用的时间是如何计算的。

static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se){unsigned int nr_running = cfs_rq->nr_running;struct sched_entity *init_se = se;unsigned int min_gran;u64 slice;if (sched_feat(ALT_PERIOD))nr_running = rq_of(cfs_rq)->cfs.h_nr_running;//根据就绪队列中的进程数量,计算调度周期。内核中如果进程数量小于8的,默认的调度周期为6ms,如果大于8,调度周期为一个动态调度的值。slice = __sched_period(nr_running + !se->on_rq);for_each_sched_entity(se) {struct load_weight *load;struct load_weight lw;struct cfs_rq *qcfs_rq;qcfs_rq = cfs_rq_of(se);load = &qcfs_rq->load;if (unlikely(!se->on_rq)) {lw = qcfs_rq->load;update_load_add(&lw, se->load.weight);load = &lw;}
//这里传递的时间为调度周期,curr进程权重,就绪队列权重,根据这些参数,按照公式1进行计算wall_time。最后返回通过计算得出理想情况的实际运行时间。从这里也可以看出,内核代码中并没有直接使用该方式,进而推导进程的实际运行时间和虚拟时间,而是根据进程的调用和调出的时间差计算时间运行时间的。所以这里进程的虚拟时间是不相等的,伴随着周期调度、进程的唤醒等各类操作。slice = __calc_delta(slice, se->load.weight, load);}
if (sched_feat(BASE_SLICE)) {if (se_is_idle(init_se) && !sched_idle_cfs_rq(cfs_rq))min_gran = sysctl_sched_idle_min_granularity;elsemin_gran = sysctl_sched_min_granularity;slice = max_t(u64, slice, min_gran);}return slice;}

上面讨论的都是进程调度的优先级,也就是上一个进程运行结束后,应该从就绪队列中选择那个进程继续运行。后续需要分析一下进程是退出CPU的几种方式? 进程退出占用的CPU,然后才能进行后续的调度。

CFS 调度器的vruntime相关推荐

  1. cpu调度的最小单位_Linux CFS调度器

    一直没有写过关于Linux内核调度器的内容,这几天被问起,简单的讲了讲,收到一堆challenge,这次决定做一个通篇总结方便自己整理思路. 要说Linux2.4和2.6最大的差异就在于CFS调度器的 ...

  2. (5)Linux进程调度-CFS调度器

    目录 背景 1. 概述 2. 数据结构 2.1 调度类 2.2 rq/cfs_rq/task_struct/task_group/sched_entity 3. 流程分析 3.1 runtime与vr ...

  3. Linux进程调度 - CFS调度器 LoyenWang

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  4. 进程管理(二十二)—CFS调度器

    CFS是内核使用的一种调度器或调度类,它主要负责处理三种调度策略:SCHED_NORMAL.SCHED_BATCH和SCHED_IDLE.调度器的核心在挑选下一个运行的进程时有可能会遍历所有的调度类别 ...

  5. Linux调度器及CFS调度器

    Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 ​ 调度:就算按照某种调度的算法 ...

  6. Linux CFS调度器:原理和实现

    目录 CFS调度器的重点 基本概念 一些问题 源码和补充 调度类和调度策略 优先级分类 多处理器系统 rq的平衡 概念部分只讲解CFS调度器 CFS调度器的重点 基本概念 Linux 2.6版本在我看 ...

  7. Linux---进程调度及CFS调度器

    Linux的调度算法 (1)O(N)调度器 O(N)调度器发布于1992年,从就绪队列中比较所有进程的优先级,然后选择一个最高优先级的进程作为下一个调度进程. 优点:操作简单,便于理解. 缺点:时间消 ...

  8. [Linux][内核学习笔记]--CFS调度器

    文章目录 1. 进程的状态转换 2. 内核调度器的发展 3. 调度策略 4. 与调度相关的系统调用 5. 优先级 6. CFS调度器的实现 6.1 相关结构体 6.1.1 sched_entity 结 ...

  9. Linux进程调度-CFS调度器原理分析及实现,懂了

    1. 概述 (1) Completely Fair Scheduler,完全公平调度器,用于Linux系统中普通进程的调度. (2) CFS采用了红黑树算法来管理所有的调度实体 sched_entit ...

最新文章

  1. P2502 [HAOI2006]旅行
  2. EfficientNetV2震撼发布!87.3%准确率!模型更小,训练更快!谷歌大脑新作
  3. golang中的空slice
  4. easyui validatebox验证
  5. C++namespace命名空间
  6. malloc,calloc和realloc函数
  7. java 基础实战_Java基础实战(三)
  8. [BZOJ1669][Usaco2006 Oct]Hungry Cows饥饿的奶牛
  9. Oracle学习 第26天 Toad试用感受
  10. java动态数组储存敌机_如何使用参数通过graphql将动态数组字符串存储为neo4j中的节点属性?...
  11. wd移动硬盘插电脑没反应_西数移动硬盘-急急急!!!!!西部数据移动硬盘插在电脑上不显示盘符了,有人知道? 爱问知识人...
  12. Java程序员技术栈
  13. electron ui框架
  14. SSRF漏洞原理及检测
  15. mysql数据库技术答案_高校邦《MySQL数据库高级技术》全套答案
  16. c语言转换说明符总结(%d,%i,%u,%f,%o,%x,%X,%p,%s,%g,%e)
  17. pdf文件加水印的方法?
  18. PHP审计工具之 RIPS
  19. 好玩免费的api接口
  20. MCP2515驱动程序

热门文章

  1. 瀑布模型,冯.诺依曼结构——摘自百科
  2. fir.im关于iOS Ad hoc内测版下载详细流程
  3. 如何选择适合你的兴趣爱好(三十三),国画
  4. 情绪是人生最大的敌人
  5. 分享技术人学习有用的国外网站
  6. pytese +allure框架设计
  7. LCHub:vika维格表将 70 万行代码开源了
  8. 响应式编程之Spring Webflux
  9. 视频处理-按帧或者按秒截取图像
  10. Mathcad Prime教程-solve解方程组