Linux进程之调度器

1. Linux调度器的原理

Linux调度器(Linux Scheduler)负责管理这一进程在CPU上运行时的资源分配。它根据选定策略和所估算的进程行为,考量各种因素的权重,对等待在运行队列的进程按优先级排列,从而决定哪个进程能够接下来获得CPU时间。

Linux的调度器可以使用不同的调度策略,有两个主要的类型是:抢占式(preemptive)和非抢占式(non-preemptive)。

  • 抢占式调度器:允许正在运行的进程在它完成任务之前被中断,从而使其他进程有机会使用CPU资源。这常用于希望响应实时交互的环境,例如桌面系统或游戏。

  • 非抢占式调度器:一旦进程占有CPU,它将保持运行状态,直至它结束本次CPU周期,除非它被阻塞等待一个事件(如I/O操作)。这种策略常运用于批处理环境,如数据分析或科学计算。

自从 Linux 2.6.23 版本引入以来,Linux 默认使用的是完全公平调度器(CFS,Completely Fair Scheduler)。基于虚拟运行时间,CFS适应抢占式任务调度,试图为每一个运行的任务平等分配CPU时间。

CFS主要通过以下两种方式确保公平性:

  1. CFS使用"红黑树"(Red-Black Tree)数据结构保存待运行的任务,该数据结构能够在O(log n)时间复杂度内插入、删除和查找元素。每个进程都分配有一个虚拟运行时间,表示其获得的CPU时间。CFS调度器总是选取虚拟运行时间最小的任务来执行。

  2. 跟踪每个任务的虚拟运行时间改变,使之与"运行时间"保持一致,其中,运行时间是任务在过去一段时间内占CPU的实际时间。虚拟运行时间以不同速率增长,取决于任务优先级。优先级较高(nice值小)的任务将看到他们的虚拟运行时间以较快的速率增长。

虽然有许多其他因素(如处理器亲和性、实时优先级等)会影响具体的调度决策,但CFS的基本原则是确保所有进程都能得到公平的CPU时间分配。

2. Linux中有哪些调度器类,各自调度策略是什么

在 Linux 中,有几种主要的调度器类,他们分别为不同类型的任务提供了不同的调度策略:

  • 完全公平调度器(Completely Fair Scheduler,CFS):CFS 是用于普通进程的默认调度器。它使用一种称为公平队列(Fair Queuing)的算法,以保证所有进程能得到公平的 CPU 时间。CFS 被 SCHED_NORMALSCHED_BATCH 策略使用。

  • 实时调度器(Real-time Scheduler):Linux 内核支持两种实时调度策略:SCHED_FIFOSCHED_RR。实时调度器确保实时任务得到及时的调度,优先级靠前的任务总是先于优先级靠后的任务运行。

  • Deadline 调度器(SCHED_DEADLINE):这是 Linux 中较新的调度器,它为任务提供了更强的实时性保证。每个任务都需要指定它的运行周期和运行时间,调度器会确保在每个运行周期内,任务都能在指定的运行时间内完成。

  • 空闲调度器(Idle Task Scheduler,SCHED_IDLE):用于非常低优先级的任务,只在系统闲置,无其他任务执行时,才会运行这类任务。

根据具体的应用需求和场景,开发者可以选择最适合的调度策略,以满足他们的性能和响应时间需求。例如,实时任务,比如音频处理或者医疗设备通常会使用实时调度策略;而 CPU 密集型的后台任务则可能会选择 SCHED_BATCH 策略。

3. Linux中各个调度器类的执行优先级

Linux 系统中的各个调度器类的执行优先级主要取决于它们所使用的策略类型。在大多数情况下,实时进程具有最高的优先级,然后是常规进程,最后是空闲进程。

以下是具体的优先级分类:

  • 实时调度策略(SCHED_FIFOSCHED_RRSCHED_DEADLINE 的任务具有最高优先级。这是因为这些任务通常是时间敏感的,并且需要预测性的响应时间。如果系统中有实时任务在等待运行,那么它们将优先于其他所有类型的任务执行。

  • 常规调度策略 (SCHED_NORMALSCHED_BATCH 的任务优先级次于实时任务。这些任务使用完全公平调度器(CFS),它为每个任务分配公平和均匀的 CPU 时间,但会在有实时任务时让出 CPU。

  • SCHED_IDLE(Idle Task Scheduler) 策略任务的优先级最低,只在没有其他任务时才会运行。

需要注意的是,每种策略中的任务也会根据其优先级进行排序。例如,在实时任务中,具有较高优先级的任务会先于具有较低优先级的任务运行。而在常规任务中,虚拟运行时间(vruntime)最少的进程会被优先运行。 所以总的来说,调度器类的执行优先级主要由它们所使用的策略类型决定。

4. 在完全公平调度器中,进程是如何在就绪队列中排序的

在 Linux 的完全公平调度器(Completely Fair Scheduler,CFS)中,进程在就绪队列中的排序是根据它们的虚拟运行时间(vruntime)排序的。红黑树(红黑树是一种不能有重复节点的二叉查找树,能通过颜色和旋转操作来保证树的平衡)这种数据结构被用来存储和管理就绪队列。

基本的设想是,当进程变为就绪状态时,它将被插入到红黑树中,位置取决于它的虚拟运行时间:虚拟运行时间最小的进程被放在树的最左边,虚拟运行时间最大的进程被放在树的最右边。

调度器每次都选择红黑树最左边的节点(也就是虚拟运行时间最小的进程)来运行。当一个正在运行的进程用完其 CPU 时间片或者被阻塞时,它将从红黑树中移除,调度器再次选择虚拟运行时间最小的进程来运行。

如果有新的进程进入就绪状态,或者一个被阻塞的进程重新变为就绪状态,那么它们将根据它们的虚拟运行时间在红黑树中找到合适的位置插入。重新计算虚拟运行时间后,有可能造成原本正在运行的进程的虚拟运行时间不再是最小,这时就需要进行上下文切换。

通过这种基于虚拟运行时间的排序机制,CFS 能够保证所有进程都公平地获取 CPU 时间,同时还能考虑到进程的优先级。

5. 进程的虚拟运行时间是如何计算的

在 Linux 的完全公平调度器(Completely Fair Scheduler,CFS)中,进程的虚拟运行时间(vruntime)是根据进程的实际运行时间和权重进行计算的。在每次调度决策时,使用以下公式调整进程的虚拟运行时间:

vruntime +&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 增加控制文件

oracle 增加控制文件 1、看control_file路径 SQL> show parameter controlNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer …

Kubernetes kubectl管理命令使用方法

陈述式资源管理方法(通过命令行) 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化…

[Python进阶] 定制类:运算篇

4.10.4 运算篇 Python的类型系统是鸭子类型,也就是不检查某个具体的对象是什么类型,而是检查这个对象有没有相应的功能。在Python中有大量的魔术方法,我们可以通过魔术方法的方式为对象添加相应的功能。 下面介绍Python中和运算相关的魔术方…

从零开始学python(十六)爬虫集群部署

前言 今天讲述Python框架源码专题最后一个部分,爬虫集群部署,前面更新了十五个从零开始学python的系列文章,分别是: 1.编程语法必修篇 2.网络编程篇 3.多线程/多进程/协程篇 4.MySQL数据库篇 5.Redis数据库篇 6.MongoDB数据库篇 …

运维监控学习笔记2

硬件监控: 1)使用IPMI 2)机房巡检 路由器和交换机: 使用SNMP(简单网络管理协议)进行监控。 Linux 安装snmp: yum install -y net-snmp net-snmp-utils 说明:net-snmp是安装在snm…

到 2030 年API 攻击预计将激增近 1000%

导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计,截至 2030 年 API 攻击将激增 996%,意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…

StarGANv2: Diverse Image Synthesis for Multiple Domains论文解读及实现(一)

StarGAN v2: Diverse Image Synthesis for Multiple Domainsp github:https://github.com/clovaai/stargan-v2 1 模型架构 模型主要架构由四部分组成 ①Generator、②Mapping network、③Style encoder、④Discriminator Generator:G网络 生成模型G将输入图片x转换…

数字普惠金融、数字创新与经济增长—基于省级面板数据的实证考察(2011-2021年)

参照陈啸(2023)的做法,本对来自经济问题《数字普惠金融、数字创新与经济增长——基于省级面板数据的实证考察》一文中的基准回归部分进行复刻。数字普惠金融、数字创新已经成为驱动经济高质量发展的关键。利用省级面板数据,构建固…

【软件测试】UI自动化框架,数据驱动 vs 关键字驱动怎么选

一、UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。 自动化测试小Demo 它要测试的东西其实是要看一下百度搜索能不能返回兴业银行的官网。我们分析一下这段代码都包含些…

达蒙DM数据库使用经验

DM表/字段注释 注:dm数据库无法在建表的同时为字段名添加注释 //为表添加注释 comment on table 库名.表名 is 表注释; //为表字段添加注释 comment on column 库名.表名.列名 is 列注释;DM查询错误:无效的表或视图 1,确认表一定存在 2&am…

清除pip安装库时的缓存

目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时,如果之前已经下载过该库,pip会默认使用缓存来安装库,而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中,具体位置因操作系统和Python版本而异…

elementui 的 dialog 常用逻辑总结

菜鸟最近写后台管理系统,发现不管是弹窗、还是编辑、查看、添加等功能,真的代码都差不多,但是每次都要重新写里面的关闭逻辑等,菜鸟就感觉不如搞一个模版,后面只关注于逻辑,其他都直接来这里复制了&#xf…

项目管理师基础之项目管理计划和项目文件

项目管理过程中,会使用并产生两大类文件:项目管理计划和项目文件。内容一般如下: 整个项目生命周期需要收集、分析和转化大量的数据。从各个过程收集项目数据,并在项目团队内共享。在各个过程中所收集的数据经过结合相关背景的分…

MySQL中同比和环比语句如何写?

营收表如下(表名:a)如下图: 营收表 year month money 2021 1 1000 2021 2 1200 2022 1 1300 2022 2 1500 需要算出2022年营收同比与环比: 同比:和去年同月相比(1300-1000/1000*100%&#xff0…

Python +numpy数组膨胀(填充)方法总结

本文主要介绍数组的各种填充方法,包括数组按照原值复制扩大并填充,数组的扩大填充,数组边缘填充等。 1.数组的复制膨胀 形如二维数组: [[1 2] [3 4]] 膨胀为: [[1 1 1 2 2 2] [1 1 1 2 2 2] [1 1 1 2 2 2] [3 3 3 4 4 4]…

简单易用且高效的跨平台开发工具:Xojo 2023 for Mac

Xojo for Mac是Mac平台上一个跨平台的针对桌面、Web、移动和Raspberry Pi的快速应用程序开发软件。与其他多平台开发工具相比,Xojo for Mac为开发人员提供了显着的生产率提高。 Xojo for Mac具有拖放功能,使您能够快速创建用户界面设计,然后…

Android保存网页的方法

首先要使用js交互就需要懂原理: 感谢大佬:js中document节点获取页面元素的六种方式 1.querySelector()方法 描述:本方法用于根据给定的选择器选中页面元素 如果有多个元素满足条件,则返回第一个满足条件的元素节点 语法&#xff…

GRPC-连接池-GPT

gRPC Dart 管理优化 User grpc for dart 如何统一管理多个Client的创建和销毁,给我一个最优解 ChatGPT 对于在Dart中使用gRPC创建和销毁多个Client的统一管理,您可以使用一个单例模式的管理类来实现最优解。 首先,创建一个管理类&#xff0c…

EPPlus 读取和生成Excel

在项目中添加了EPPlus库的引用,你可以通过NuGet包管理器或手动将EPPlus库添加到项目中。同时,需要注意的是EPPlus库支持的是xlsx格式的Excel文件。 读取 使用EPPlus读取本地Excel文件的示例代码如下: using OfficeOpenXml;public void Rea…

算法随笔:图论问题之割点割边

割点 定义 割点的定义:如果一个点被删除之后会导致整个图不再是一个连通图,那么这个顶点就是这个图的割点。举例: 上图中的点2就是一个割点,如果它被删除,则整个图被分为两个连通分量,不再是一个连通图。…