注:这里并没有详细分析到每个内部函数,如果要了解这些细节的话,可以看后面的 OTHER CFS CLASS API 及 CFS主要的内部函数。
     周期性调度器在调度框架上由 scheduler_tick 完成:在每一个cpu的时钟周期都触发一次该函数调用,它更新运行队列的时钟及load,然后调用当前进程的调度器类的周期调度函数。

[cpp] view plaincopy
  1. update_rq_clock(rq); /* 更新运行队列的时钟rq->clock*/
  2. /* 更新运行队列load,本质是将数组中先前存储的负荷值向后移动一个位置,将当前负荷记入数组的第一个位置 */
  3. update_cpu_load_active(rq);
  4. curr->sched_class->task_tick(rq, curr, 0);

我们再来看一下CFS调度器类的周期调度函数( task_tick_fair ),该函数是对 entity_tick 的组调度的一个封装(因为只有真正的task的se才会在cpu上运行,而group的se是不会在cpu上运行的,所以这里参数的se就是一个task,然后对从它到它所在的组的根的所有group se调用entity_tick),所以我们直接来看一下 entity_tick 函数:

[cpp] view plaincopy
  1. update_curr(cfs_rq);
  2. //完成当前se(这个se可以是task或group)的执行时间,虚拟时间,cfs_rq的相应时间及统计的更新:
  3. curr->exec_start=now;curr->sum_exec_runtime+=delta_exec;及curr->vruntime+= calc_delta_fair();
  4. 更新cfs_rq的min_vruntime.其中delta_exec表示实质执行的时间,而calc_delta_fair则计算delta_exec
  5. 相对应的虚拟时间,即delta_fair={if se->load.weight != NICE_0_LOAD return delta_exec;
  6. else return delta_exec *NICE_0_LOAD/se.load->weight},可以看到当该se是0优先级的话,
  7. 那么它的虚拟时间等于实质执行的物理时间,否则如果该se的load越大那么它的虚拟时间就越小,
  8. 这也是为什么load越大的进程能够执行的时间越多——它的虚拟时间增长的越慢
  9. update_entity_shares_tick(cfs_rq); //这个函数只有对于SMP才有作用,所以我们这里先不分析
  10. #ifdef CONFIG_SCHED_HRTICK  //HRTICK情况,不知道干嘛
  11. if (queued) {
  12. resched_task(rq_of(cfs_rq)->curr);
  13. return;
  14. }
  15. if (!sched_feat(DOUBLE_TICK) &&
  16. hrtimer_active(&rq_of(cfs_rq)->hrtick_timer))
  17. return;
  18. #endif
  19. //可运行的大于1,或者不支持WAKEUP_PREEMPT,后面这个条件在后来的版本已经被去掉了
  20. if (cfs_rq->nr_running > 1 || !sched_feat(WAKEUP_PREEMPT))
  21. check_preempt_tick(cfs_rq, curr);
  22. //该函数用于检查当前进程是否运行了足够长的时间(实质运行时间大于sched_slice理想运行时间或者当前运行
  23. 队列最左边的se到现在的等待的时间已经超过curr理想应该运行的时间),如果出现了上面的情况则调用
  24. resched_task将该进程设置为TIF_NEED_RESCHED,即可调度的;如果运行时间小于sysctl_sched_min_granularity
  25. (最小执行时间)或者内核不允许WAKEUP_PREEMPT(内核允许的调度特性在/proc/sys/kernel/sched_features
  26. 定义WAKEUP_PREEMPT使用第3 bit),则直接返回。注意这里的每个判断条件的顺序是非常重要的(前面的更重要):
  27. 1.如果进程已经运行超过它的理想运行时间那么它将无条件被resched_task;
  28. 2.如果不支持WAKEUP_PREEMPT那么直接返回不对当前的进行resched_task;
  29. 3.如果运行的时间小于sysctl_sched_min_granularity那么也直接返回;
  30. 4.最左边的等待时间大于理想运行时间时resched_task(curr),即要4满足的话,必须当前的执行时间小于它理想运行时间,
  31. 并且支持WAKEUP_PREEMPT及运行了至少sysctl_sched_min_granularity,最后已经等待的时间大于理想运行时间

可以看到每个时钟都对会当前运行的se进行实质执行时间及虚拟执行时间进行更新,最后检查该进程是否运行的足够长的时间,如果是的话则将它置为TIF_NEED_RESCHED供主调度在适当的时机进行切换。可见周期性调度器还是比较简单,没有涉及到真正的调度任务,只是设置一个重调度请求的标志而已,下面看看主调器,也就是它来响应周期性调度器的 TIF_NEED_RESCHED 。

图 CFS与周期调度器

linux调度器(三)——周期性调度器与CFS相关推荐

  1. 【Linux 内核】CFS 调度器 ④ ( 调度子系统组件模块 | 主调度器、周期性调度器 | 调度器类 )

    文章目录 一.调度子系统组件模块 二.主调度器.周期性调度器 三.调度器类 一.调度子系统组件模块 调度器 需要对 被调度的进程 进行 排序 和 调度管理 , 进程管理过程需要 调度器 的 组件模块 ...

  2. kernel调度(2)----主调度器和周期性调度器

    进程切换 上一章介绍了调度相关的基础知识,那么这章准备介绍一下进程切换相关的原理.包括主调度器和周期性调度器都做了哪些工作.以及进程切换都做了哪些工作. 周期性调度器都做了什么 我们知道周期性调度器就 ...

  3. linux cfs 参数设置,Linux CFS如何处理周期性调度器、CFS的周期性调度及总结

    1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...

  4. Linux进程调度器概述--Linux进程的管理与调度(十五)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  5. Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)

    日期 内核版本 架构 作者 GitHub CSDN 2016-07-01 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  6. Linux进程优先级的处理--Linux进程的管理与调度(二十二)

    日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  7. Linux系统核心调度器——周期性调度器详解

    日期 内核版本 架构 作者 内容 2019-5-13 Linux-2.6.32 X86 Bystander Linux进程调度 1 绪论 在<Linux系统进程调度--调度架构详细分析>一 ...

  8. linux 进程状态显示dl,Linux系统中的实时调度器DL调度器的原理是什么?详细概述...

    一.概述 实时系统是这样的一种计算系统:当事件发生后,它必须在确定的时间范围内做出响应.在实时系统中,产生正确的结果不仅依赖于系统正确的逻辑动作,而且依赖于逻辑动作的时序.换句话说,当系统收到某个请求 ...

  9. 【Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )

    文章目录 一.调度器 0.调度器概念 1.调度器目的 2.调度器主要工作 3.调度器位置 4.进程优先级 5.抢占式调度器 二.Linux 内核进程状态 API 简介 三.Linux 进程状态 一.调 ...

  10. Linux桌面GUI系统的调度器应该怎么做才不卡顿呢?

    承接前面两篇文章,继续这个话题: 为什么Linux CFS调度器没有带来惊艳的碾压效果 https://blog.csdn.net/dog250/article/details/95729830 为什 ...

最新文章

  1. 枚举类型的定义与使用
  2. Java x和y之间的全部素数
  3. 计算机组成801pan,计算机组成06801.ppt
  4. SAP为什么并购sybase
  5. linux 进程带宽限制,在Linux中限制网络带宽使用
  6. extjs 文件加载、解析流程
  7. VMware安装VMwaretools
  8. 数据结构与算法(C#版)第二章 C#语言与面向对象技术(下)V1.0
  9. java 字符串倍_java字符串拼接与性能分析详解
  10. android系统(8)---android事件分发机制
  11. SAP License:SAP Business One系统功能
  12. python中颜色_python - matplotlib中的命名颜色
  13. java判断两个矩形是否相交_判断矩形相交以及求出相交的区域
  14. 51 单片机 建立 文本文件_笔记系列之单片机原理及应用1
  15. Java读取配置文件yml中属性的方法
  16. 米联ZYNQ7Z020系列的以太网网口芯片RTL8211FD自适应速度的问题
  17. MySQL之启动选项
  18. 人生启示录效应篇之破窗效应:及时矫正和补救正在发生的问题
  19. 标牌标识导视指示系统设计制作工艺及材料知识
  20. ZDMS0.8/30S-RS55/EX防爆型自动跟踪定位射流灭火装置

热门文章

  1. jquery1.6.2源码拆分一
  2. hadoop中4种压缩格式的特征的比较
  3. nginx实战(五) 正向代理支持https
  4. 重构计算力 浪潮M5新一代服务器闪耀登场
  5. 在UNITY中按钮的高亮用POINT灯实现,效果别具一番风味
  6. .Net码农就业求职储备(新手进阶)
  7. NinePatchChunk.java分析
  8. 将多个csv文件整合到一个csv文件中
  9. ExecutorService的shutDown和shutDownNow方法的区别
  10. 用友与中国互联网协会签署战略合作 共推企业互联网转型