linux调度器(三)——周期性调度器与CFS
注:这里并没有详细分析到每个内部函数,如果要了解这些细节的话,可以看后面的 OTHER CFS CLASS API 及 CFS主要的内部函数。
周期性调度器在调度框架上由 scheduler_tick 完成:在每一个cpu的时钟周期都触发一次该函数调用,它更新运行队列的时钟及load,然后调用当前进程的调度器类的周期调度函数。
- update_rq_clock(rq); /* 更新运行队列的时钟rq->clock*/
- /* 更新运行队列load,本质是将数组中先前存储的负荷值向后移动一个位置,将当前负荷记入数组的第一个位置 */
- update_cpu_load_active(rq);
- 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 函数:
- update_curr(cfs_rq);
- //完成当前se(这个se可以是task或group)的执行时间,虚拟时间,cfs_rq的相应时间及统计的更新:
- curr->exec_start=now;curr->sum_exec_runtime+=delta_exec;及curr->vruntime+= calc_delta_fair();
- 更新cfs_rq的min_vruntime.其中delta_exec表示实质执行的时间,而calc_delta_fair则计算delta_exec
- 相对应的虚拟时间,即delta_fair={if se->load.weight != NICE_0_LOAD return delta_exec;
- else return delta_exec *NICE_0_LOAD/se.load->weight},可以看到当该se是0优先级的话,
- 那么它的虚拟时间等于实质执行的物理时间,否则如果该se的load越大那么它的虚拟时间就越小,
- 这也是为什么load越大的进程能够执行的时间越多——它的虚拟时间增长的越慢
- update_entity_shares_tick(cfs_rq); //这个函数只有对于SMP才有作用,所以我们这里先不分析
- #ifdef CONFIG_SCHED_HRTICK //HRTICK情况,不知道干嘛
- if (queued) {
- resched_task(rq_of(cfs_rq)->curr);
- return;
- }
- if (!sched_feat(DOUBLE_TICK) &&
- hrtimer_active(&rq_of(cfs_rq)->hrtick_timer))
- return;
- #endif
- //可运行的大于1,或者不支持WAKEUP_PREEMPT,后面这个条件在后来的版本已经被去掉了
- if (cfs_rq->nr_running > 1 || !sched_feat(WAKEUP_PREEMPT))
- check_preempt_tick(cfs_rq, curr);
- //该函数用于检查当前进程是否运行了足够长的时间(实质运行时间大于sched_slice理想运行时间或者当前运行
- 队列最左边的se到现在的等待的时间已经超过curr理想应该运行的时间),如果出现了上面的情况则调用
- resched_task将该进程设置为TIF_NEED_RESCHED,即可调度的;如果运行时间小于sysctl_sched_min_granularity
- (最小执行时间)或者内核不允许WAKEUP_PREEMPT(内核允许的调度特性在/proc/sys/kernel/sched_features
- 定义WAKEUP_PREEMPT使用第3 bit),则直接返回。注意这里的每个判断条件的顺序是非常重要的(前面的更重要):
- 1.如果进程已经运行超过它的理想运行时间那么它将无条件被resched_task;
- 2.如果不支持WAKEUP_PREEMPT那么直接返回不对当前的进行resched_task;
- 3.如果运行的时间小于sysctl_sched_min_granularity那么也直接返回;
- 4.最左边的等待时间大于理想运行时间时resched_task(curr),即要4满足的话,必须当前的执行时间小于它理想运行时间,
- 并且支持WAKEUP_PREEMPT及运行了至少sysctl_sched_min_granularity,最后已经等待的时间大于理想运行时间
可以看到每个时钟都对会当前运行的se进行实质执行时间及虚拟执行时间进行更新,最后检查该进程是否运行的足够长的时间,如果是的话则将它置为TIF_NEED_RESCHED供主调度在适当的时机进行切换。可见周期性调度器还是比较简单,没有涉及到真正的调度任务,只是设置一个重调度请求的标志而已,下面看看主调器,也就是它来响应周期性调度器的 TIF_NEED_RESCHED 。
linux调度器(三)——周期性调度器与CFS相关推荐
- 【Linux 内核】CFS 调度器 ④ ( 调度子系统组件模块 | 主调度器、周期性调度器 | 调度器类 )
文章目录 一.调度子系统组件模块 二.主调度器.周期性调度器 三.调度器类 一.调度子系统组件模块 调度器 需要对 被调度的进程 进行 排序 和 调度管理 , 进程管理过程需要 调度器 的 组件模块 ...
- kernel调度(2)----主调度器和周期性调度器
进程切换 上一章介绍了调度相关的基础知识,那么这章准备介绍一下进程切换相关的原理.包括主调度器和周期性调度器都做了哪些工作.以及进程切换都做了哪些工作. 周期性调度器都做了什么 我们知道周期性调度器就 ...
- linux cfs 参数设置,Linux CFS如何处理周期性调度器、CFS的周期性调度及总结
1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...
- Linux进程调度器概述--Linux进程的管理与调度(十五)
日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...
- Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)
日期 内核版本 架构 作者 GitHub CSDN 2016-07-01 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...
- Linux进程优先级的处理--Linux进程的管理与调度(二十二)
日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...
- Linux系统核心调度器——周期性调度器详解
日期 内核版本 架构 作者 内容 2019-5-13 Linux-2.6.32 X86 Bystander Linux进程调度 1 绪论 在<Linux系统进程调度--调度架构详细分析>一 ...
- linux 进程状态显示dl,Linux系统中的实时调度器DL调度器的原理是什么?详细概述...
一.概述 实时系统是这样的一种计算系统:当事件发生后,它必须在确定的时间范围内做出响应.在实时系统中,产生正确的结果不仅依赖于系统正确的逻辑动作,而且依赖于逻辑动作的时序.换句话说,当系统收到某个请求 ...
- 【Linux 内核】调度器 ① ( 调度器概念 | 调度器目的 | 调度器主要工作 | 调度器位置 | 进程优先级 | 抢占式调度器 | Linux 进程状态 | Linux 内核进程状态 )
文章目录 一.调度器 0.调度器概念 1.调度器目的 2.调度器主要工作 3.调度器位置 4.进程优先级 5.抢占式调度器 二.Linux 内核进程状态 API 简介 三.Linux 进程状态 一.调 ...
- Linux桌面GUI系统的调度器应该怎么做才不卡顿呢?
承接前面两篇文章,继续这个话题: 为什么Linux CFS调度器没有带来惊艳的碾压效果 https://blog.csdn.net/dog250/article/details/95729830 为什 ...
最新文章
- 枚举类型的定义与使用
- Java x和y之间的全部素数
- 计算机组成801pan,计算机组成06801.ppt
- SAP为什么并购sybase
- linux 进程带宽限制,在Linux中限制网络带宽使用
- extjs 文件加载、解析流程
- VMware安装VMwaretools
- 数据结构与算法(C#版)第二章 C#语言与面向对象技术(下)V1.0
- java 字符串倍_java字符串拼接与性能分析详解
- android系统(8)---android事件分发机制
- SAP License:SAP Business One系统功能
- python中颜色_python - matplotlib中的命名颜色
- java判断两个矩形是否相交_判断矩形相交以及求出相交的区域
- 51 单片机 建立 文本文件_笔记系列之单片机原理及应用1
- Java读取配置文件yml中属性的方法
- 米联ZYNQ7Z020系列的以太网网口芯片RTL8211FD自适应速度的问题
- MySQL之启动选项
- 人生启示录效应篇之破窗效应:及时矫正和补救正在发生的问题
- 标牌标识导视指示系统设计制作工艺及材料知识
- ZDMS0.8/30S-RS55/EX防爆型自动跟踪定位射流灭火装置