linux调度策略分多种,其中最常见的就是CFS(Completely Fair Scheduler)调度策略。下面主要介绍一下CFS调度策略的原理及实现流程。

实现目标

在调度普通进程时,为了实现高优先级进程能被优先调用,同时保证所有进程都有机会被调用,避免CPU一直被高优先级进程占用,linux设计了CFS调度策略。

实现原理

下面针对CFS调度策略的目的讲解它的实现原理。

  1. 为了保证高优先级任务能被优先调用,linux为每一个普通进程设置了对应的优先级,而每一个优先级对应一个权重,进程实际被调用时间和权重相关。

linux内核在实际实现时,通过nice值表示优先级,取值范围为[-20, 19]。nice值和权重具有一一对应关系,数值越小表示优先级越高,对应的权重也就越高。nice值和权重对应关系在内核中通过如下数组反映:

nice = 0对应的优先级为120,对应的权重为1024。普通进程默认的nice值即为0,即NICE_0_LOAD。

每个进程在一个调度周期内实际被调用时间计算方式如下:

实际运行时间 = 调度周期 * (进程权重 / 所有进程权重之和)

2. 为了保证在一个调度周期内,低优先级进程也能有机会被调用,防止CPU一直被高优先级进程霸占,CFS调度策略引入了虚拟调度时间概念。在CFS调度策略中,所有进程总的可运行的虚拟运行时间均相等,且每次调度时选择已运行虚拟调度时间最小的进程调用。

进程的虚拟调度时间如下:

虚拟运行时间 = 实际运行时间 * NICE_0_LOAD / 进程权重

= 调度周期 * (进程权重 / 所有进程权重之和) * NICE_0_LOAD / 进程权重

= 调度周期 * NICE_0_LOAD / 所有进程权重之和

从上面公式可知,可以得出以下两个结论:

  • 由于在一个调度周期内,调度周期、NICE_0_LOAD(1024)、所有进程权重之和均为定值,因此所有进程的虚拟运行时间均相等
  • 实际执行相等时间时,优先级高的进程对应使用的虚拟运行时间更少,即消耗的虚拟运行时间更少

对于上面结论综合起来通俗地讲即,虽然所有进程的虚拟运行时间均相等,调度时也选择已运行虚拟时间更小进程进行调用,但对于高优先级进程来说,运行相同实际时间时,其虚拟运行时间增加的更少,消耗的更慢,下次调度时更可能被选择调用。

通过上面分析可知,CFS调度策略通过实际运行时间和虚拟运行时间概念,实现了使高优先级进程更大概率、更多时间被调用,同时低优先级进程也能在调度周期内得到调度,即公平与优先得到了很好地平衡。

调度实体保存方式

为了提高查找、删除效率,内核采用红黑树的数据结构保存CFS调度的进程。根据红黑树特性,虚拟运行时间小的进程调度实体存放在红黑树的最左边,虚拟运行时间大的进程调度实体存放在红黑树的最右边。CFS调度器每次调度时选择红黑树最左边节点即可。

调度周期

CFS调度器的调度周期不是固定的,而是根据实际调度场景进行调整。

  • 当调度队列上排队进程数小于等于8个时,调度周期固定为6ms
  • 当调度队列上排队进程数大于8个时,为了保证各个进程能得到有效调度的同时避免频繁地切换线程增加系统开销,调度周期调整为:排队进程数 * 0.75ms

内核实现如下:

linux进程调度CFS策略相关推荐

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

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

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

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

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

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

  4. Linux进程调度:完全公平调度器 Completely Fair Scheduler 内幕| linux-2.6

    https://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html? 目录 Linux 调度器简史 C ...

  5. (7)Linux进程调度-O(1)调度算法

    <(1)Linux进程调度> <(2)Linux进程调度器-CPU负载> <(3)Linux进程调度-进程切换> <(4)Linux进程调度-组调度及带宽控制 ...

  6. linux进程调度之FIFO和RR策略

    最近花了10几天的时间,将linux进程调度相关的内核代码看了两遍左右,也看了一些讲述linux进程调度的一些文章,总想写个系列文章,把进程调度全景剖析一遍,但是总是感觉力不逮己,自己都不敢下笔写文章 ...

  7. linux进程调度之 FIFO 和 RR 调度策略

    转载 http://blog.chinaunix.net/uid-24774106-id-3379478.html  linux进程调度之 FIFO 和 RR 调度策略 2012-10-19 18:1 ...

  8. Linux进程调度与性能优化 | 真货

    作者简介: 张毅峰,某主机厂架构师. 一.eBPF安全可观测性的前景展望 本次分享将从监控和可观测性.eBPF安全可观测性分析.内核安全可观测性展望三个方面展开. 1.监控(Monitoring)vs ...

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

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

最新文章

  1. python目标跟踪精度曲线图_Python+opencv3.4+Kalman滤波在视频中跟踪绘制运动目标,Pythonopencv34kalman,卡尔曼滤波,实现,物体,追踪,和,轨迹...
  2. 3 微信公众号开发 接受普通消息
  3. C++笔记-二维棋盘数组转邻接表(使用QTL)
  4. 《HTML5移动应用开发入门经典》—— 1.6 编写移动网站
  5. 摩托罗拉Edge真机谍照曝光:挖孔瀑布屏+骁龙765
  6. java 将json转换成sql_SQL Server中将查询结果转换为Json格式脚本分享
  7. django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析...
  8. C#.Net工作笔记019---葡萄城控件FlexGrid自定义风格_比如给某列设置某个颜色_该颜色不受选择行的影响
  9. efi分区能不能删除 win10_电脑分区被删除如何恢复_win10系统中EFI分区被删除的处理方法...
  10. No package ‘libpeas-1.0‘ found/No package ‘libpeas-gtk-1.0‘
  11. dbc2000 注册机|dbc2000 注册码注册机下载
  12. 现代电力系统分析[简答】
  13. PaddleHub创意项目 | 将霉霉P到埃菲尔铁塔前
  14. SuperScan扫描工具(或Nmap)的使用
  15. golang 文件命名规则
  16. windows平台服务监控邮件报警批处理脚本
  17. 诚风老师-直销立法十年 直销企业迎来新机遇
  18. QQ截屏快速获取像素颜色
  19. 支付宝第三方支付保证数据的安全性
  20. 面向服务与微服务架构

热门文章

  1. vue 悬浮图标_vue实现可拖拽移动悬浮球
  2. 语音识别入门第七节:语言模型(实战篇)
  3. 基于android o版本单手模式实现
  4. 笑看云卷云舒,聆听花开花落
  5. iPad阅读应用横向评测: 普通2B文学青年的碰撞
  6. HTTP状态码302分析
  7. Anaconda 与 Pycharm 间的安装和链接
  8. 常见的分布式数据库有哪些
  9. 网络编程之编写LSP进行Winsock API监控拦截或LSP注入
  10. AI开源的硬核战场:领军者百度如何亮剑?