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)

大家都在看

  • [Linux] 如何在 Linux 电脑上制作专业的视频教程

    前言 1、软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2、视频教程制作 3、效果 参考链接 前言 博主使用 Arch…

    Linux 2023年6月8日
    097
  • 网络层协议以及IP数据包 ARP的协议

    ipv6 老设备 不支持华为 IP数据包格式 (分为20字节的固定部分,表示每个ip数据包必须包含的部分,和40字节的可变长部分) ·版本号(4bit)︰指P协议版本。并且通信双方…

    Linux 2023年6月6日
    078
  • 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述流水线集成Docker用法。 一…

    Linux 2023年5月27日
    099
  • 【镜像取证篇】DD系统镜像仿真问题的一些补充说明

    【镜像取证篇】DD系统镜像仿真问题的一些补充说明 ​ 系统千千万,环境占一半,遇到问题建议多重新挂载镜像,多尝试,站在岸上永远学不会游泳。—【蘇小沐】 【镜像取证篇】D…

    Linux 2023年6月13日
    0108
  • 小文件、nginx、Redis、Moosefs

    现在有3KW的数据,单条数据都很小的,如果按key-value来看的话,key就是32位的MD5字符串,value按平均算大概是100字节左右。 现在需要将这些数据做缓存以在高并非…

    Linux 2023年5月28日
    0108
  • Redis相关监控参数【转】

    1 慢查询 默认情况下命令若是执行时间超过10ms就会被记录到日志,slowlog只会记录其命令执行的时间,不包含io往返操作,也不记录单由网络延迟引起的响应慢。如果想修改慢命令的…

    Linux 2023年5月28日
    068
  • 学习一下 SpringCloud (三)– 服务调用、负载均衡 Ribbon、OpenFeign

    (1) 相关博文地址: 学习一下 SpringCloud (一)– 从单体架构到微服务架构、代码拆分(maven 聚合): https://www.cnblogs.com/l-y…

    Linux 2023年6月11日
    079
  • Linux下定时自动备份Docker中所有SqlServer数据库

    给出一个备份的范例 #!/bin/bash #设置mssql备份目录 folder=/var/opt/mssql/data/databack/ day=date +%Y%m%d%H…

    Linux 2023年6月14日
    0101
  • [云原生]Kubernetes-集群搭建(第2章)

    一、前置知识点 二、kubeadm部署方式介绍 三、安装要求 四、最终目标 五、准备环境 六、环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(…

    Linux 2023年6月13日
    062
  • 如何逃离框架孤井?

    前言 前面我发过一篇文章,脱离了Spring询问大家能不能继续开发,结果文章下面的评论和回复都告诉我大家伙的基础打得很牢固,该咋写还是咋写。看得我在这内卷的时代瞬间躺平。 那么今天…

    Linux 2023年6月13日
    086
  • linux系统(centos)配置ssh免密登录

    linux系统(centos)配置ssh免密登录 背景 在日常使用时候,远程执行一些命令或脚本,交互式的输入密码有些不方便。故需配置免密登录。 用SSH命令行在A服务器上远程登录B…

    Linux 2023年6月8日
    089
  • Linux中的RCU机制

    什么是RCU? RCU(Read-Copy Update),顾名思义就是读-拷贝-修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写…

    Linux 2023年6月13日
    0104
  • ipmitool for windows下载网址

    ipmitool for windows版本下载网址 http://ipmiutil.sourceforge.net/ Original: https://www.cnblogs….

    Linux 2023年6月7日
    097
  • Redis集群的节点通信原理

    Redis集群搭建中,数据如何在节点分布的原理,下面来介绍一下节点之间是如何进行通信(节点握手) 一、基础通讯原理 1、维护集群的元数据的两种方案介绍及对比 在分布式存储中需要提供…

    Linux 2023年5月28日
    0109
  • TCP/UDP 编程模型

    TCP编程模型 server创建socket套接字 socket套接字–可以理解为文件描述符(file descriptor),UNIX把网络看成文件 /** * @p…

    Linux 2023年6月6日
    0100
  • Redis集群架构

    Replication+Sentinel 这里Sentinel的作用有三个: 监控:Sentinel 会不断的检查主服务器和从服务器是否正常运行。 通知:当被监控的某个Redis服…

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