Linux进程调度器

完全公平调度器

用黑体标出的是文章的主线,未用黑体标出的内容是对黑体内容的解释或注解。

每次调用调度器时,它会挑选具有最高等待时间的进程,把CPU提供给该进程。如果经常发生这种情况,那么进程的不公平待遇不会累积,不公平会均匀分布到系统中的所有进程。
如果通过轮流运行各个进程来模拟多任务,那么当前运行的进程,其待遇显然好于哪些等待调度 器选择的进程,即等待的进程受到了不公平的对待。不公平的程度正比于等待时间。
所有的可运行进程都按时间在一个红黑树中排序,所谓时间即其等待时间。等待CPU时间最长的 进程是最左侧的项,调度器下一次会考虑该进程。等待时间稍短的进程在该树上从左至右排序。这个红黑树称之为就绪队列
红黑树的查找、插入、删除操作需要的时间复杂度为O(log n),比Linux的旧调度器的性能更差,后者以O(1)调度器著称,即 其运行时间与需要处理的进程的数目无关。但除非大量进程同时处于可运行状态,否则新调度器的对数级时间造 成的性能下降是可以忽略的。实际上,这种情况不会发生。
除了红黑树外,就绪队列还装备了虚拟时钟。
该时钟的时间流逝速度慢于实际的时钟,精确的 速度依赖于当前等待调度器挑选的进程的数目。假定该队列上有4个进程,那么虚拟时钟将以实际时 钟四分之一的速度运行。如果以完全公平的方式分享计算能力,那么该时钟是判断等待进程将获得多 少CPU时间的基准。在就绪队列等待实际的20秒,相当于虚拟时间5秒。4个进程分别执行5秒,即可 使CPU被实际占用20秒。
假定就绪队列的虚拟时间由fair_clock给出,而进程的等待时间保存在wait_runtime。为排序 红黑树上的进程,内核使用差值fair_clock – wait_runtime。
fair_clock是完全公平调度的情况 下进程将会得到的CPU时间的度量,而wait_runtime直接度量了实际系统的不足造成的不公平。
在进程允许运行时,将从wait_runtime减去它已经运行的时间。这样,在按时间排序的树中它 会向右移动到某一点,另一个进程将成为最左边,下一次会被调度器选择。但请注意,在进程运行时 fair_clock中的虚拟时钟会增加。这实际上意味着,进程在完全公平的系统中接收的CPU时间份额, 是推演自在实际的CPU上执行花费的时间。这减缓了削弱不公平状况的过程:减少wait_runtime等 价于降低进程受到的不公平对待的数量,但内核无论如何不能忘记,用于降低不公平性的一部分时间, 实际上属于处于完全公平世界中的进程。 再次假定就绪队列上有4个进程,而一个进程实际上已经等 待了20秒。现在它允许运行10秒:此后的wait_runtime是10,但由于该进程无论如何都会得到该时间段中的10/4 = 2秒,因此实际上只有8秒对该进程在就绪队列中的新位置起了作用。
遗憾的是,这样做远远不够。

  1. 进程的不同优先级(即,nice值)必须考虑,更重要的进程必须比次要进程更多的CPU时间 份额。
  2. 进程不能切换得太频繁,因为上下文切换,即从一个进程改变到另一个,是有一定开销的。 在切换发生得太频繁时,过多时间花费在进程切换的过程中,而不是用于实际的工作。 另一方面,两次相邻的任务切换之间,时间也不能太长,否则会累积比较大的不公平值。对 多媒体系统来说,进程运行太长时间也会导致延迟增大。
    可以用两种方法激活调度。
    一种是直接的,比如进程打算睡眠或出于其他原因放弃CPU;另一种是通过周期性机制,以固定的频率运行,不时检测是否有必要进行进程切换。这两个组件称为通用调度器(generic scheduler)或核心调度器(core scheduler)。

通用调度器和其他两个组件进行交互。

  1. 调度类用于判断接下来运行哪个进程。内核支持不同的调度策略(完全公平调度、实时调度、在无事可做时调度空闲进程),调度类使得能够以模块化方法实现这些策略,即一个类的代码不需要与其他类的代码交互。在调度器被调用时,它会查询调度器类,得知接下来运行哪个进程。每个进程都刚好属于某一调度类,各个调度类负责管理所属的进程。通用调度器自身完全不涉及进程管理,其工作都委托给调度器类。
  2. 在选中将要运行的进程之后,必须执行底层任务切换。这需要与CPU的紧密交互。

进程的相对优先级属性
task_struct采用了3个成员来表示进程的优先级:prio和normal_prio表示动态优先级,static_prio表示进程的静态优先级。静态优先级是进程启动时分配的优先级。它可以用nice和sched_setscheduler系统调用修改,否则在进程运行期间会一直保持恒定。normal_priority表示基于进程的静态优先级和调度策略计算出的优先级。因此,即使普通进程和实时进程具有相同的静态优先级,其普通优先级也是不同的。进程分支时,子进程会继承普通优先级。但调度器考虑的优先级则保存在prio。由于在某些情况下内核需要暂时提高进程的优先级,因此需要第3个成员来表示。由于这些改变不是持久的,因此静态和普通优先级不受影响。

Original: https://www.cnblogs.com/csfb/p/16210507.html
Author: vptvpt
Title: Linux进程调度器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606772/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 解决Ubuntu(20.04)和Windows10双系统时间不同步问题

    1. 原因分析 出现这种情况的原因是 Windows 和 Ubuntu它们在默认情况下看待硬件时间(主板上的BOIS显示的时间)的方式 不一样。 我们先来看看时间的概念: [En]…

    Linux 2023年5月27日
    0195
  • springboot JDBC整合

    1、建立一个springboot项目,并导包:JDBC API 与 MySQL Driver 2、项目建好之后,发现自动帮我们导入了如下的启动器: <dependency&g…

    Linux 2023年6月14日
    0121
  • Redis Persistent Replication Sentinel Cluster的一些理解

    Redis Persistent Replication Sentinel Cluster的一些理解 我喜欢把工作中接触到的各种数据库叫做存储系统,笼统地说:Redis、Mysql…

    Linux 2023年5月28日
    077
  • js打印前几天或后几天的日期

    创作对你我有价值的,喜欢交朋友,失忆王子,期待与你共同探讨,技术qq群153039807 Original: https://www.cnblogs.com/hshanghai/p…

    Linux 2023年6月13日
    0106
  • QLabel图片自适应

    故事背景:由于要做终端定制的需求,在服务端上传一张128像素的图片,下发给客户端,适配所有图标(界面左上角、任务栏、快捷方式、托盘等),但是由于每个位置的图标大小不一样,代码要根据…

    Linux 2023年6月13日
    089
  • 基础算法题

    Problem 3或5的倍数 2: 偶斐波那契数 4:最大回文乘积 5 窗口移动 11:方向数组 13大整数加法 、 14最长考拉兹序列 15:网格路径 25:1000位斐波那契数…

    Linux 2023年6月7日
    0128
  • MySQL-报错:Error when bootstrapping CMake:

    在进行MySQL的源码安装的时候,系统上找不到合适的C编译器,GCC忘了装,莫慌,直接 yum命令装上gcc,还有gcc-C++没装的话后面也会提示错误,一起装上,,, [root…

    Linux 2023年6月13日
    0108
  • php-redis 总结

    php-redis代码库和文档地址:https://github.com/phpredis/phpredis/#readme string 字符串类型: list 列表类型(也是链…

    Linux 2023年5月28日
    0106
  • Nginx服务的搭建与配置

    Nginx服务的搭建与配置 一、关闭防火墙并安装epel源 1、关闭selinux ①修改selinux的配置文件 [root@localhost ~]# vim /etc/sel…

    Linux 2023年6月7日
    0118
  • Python eval()函数

    The eval() takes three parameters: expression – this string as parsed and evaluated …

    Linux 2023年6月8日
    0100
  • Android中的Coroutine协程原理详解

    前言 协程是一个并发方案。也是一种思想。 传统意义上的协程是单线程的,面对io密集型任务他的内存消耗更少,进而效率高。但是面对计算密集型的任务不如多线程并行运算效率高。 不同的语言…

    Linux 2023年6月13日
    0105
  • 缓冲区溢出二:从缓冲区溢出到获取反弹shell实例

    一、说明 之前写过一篇”缓冲区溢出一:函数调用过程中的堆栈变化及缓冲区溢出利用原理“,道理讲得还可以,但现在看还是需要一个示例来讲解从攻击角度如何实现返回地…

    Linux 2023年5月28日
    0114
  • C++ inline

    inline的坏处:若在一台内存有限的机器上,过度热衷inlining会造成程序体积太大,即使拥有虚拟内存,inline造成的代码膨胀也会导致额外的换页行为,降低指令高速缓存装置的…

    Linux 2023年6月7日
    0109
  • Linux 压缩、解压缩命令

    Linux 压缩、解压缩命令 tar 语法命令 tar [options…] [files] options:选择描述-A 追加tar文件至归档-c 创建一个新文档-d…

    Linux 2023年6月6日
    0107
  • 【原创】Linux中断子系统(二)-通用框架处理

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    099
  • shell加密

    如何保护自己编写的shell程序要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1、加密 2、设定过期时间,下面以shc工具为例说明: 一、下载安装shc工具s…

    Linux 2023年5月28日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球