深入探讨Linux的进程调度器

news2024/9/21 0:45:27

      Linux操作系统作为一个开源且广泛应用的操作系统,其内核设计包含了许多核心功能,而进程调度器(Scheduler)就是其中一个至关重要的模块。进程调度器负责决定在任何给定的时刻哪个进程可以运行,以及其运行的顺序。这篇文章将详细探讨Linux进程调度器的工作原理、主要算法、调度策略以及其在实际操作中的应用。

      进程调度是指操作系统决定在多道程序环境下如何分配CPU时间给多个进程或线程的过程。在一个现代操作系统中,通常有多个进程或线程需要执行,但是CPU的核心数量有限,因此需要通过调度来合理分配这些有限的计算资源。Linux进程调度的目标包括以下几个方面:

  1. 响应时间:保证交互式进程有良好的响应时间。
  2. 吞吐量:尽可能多地完成任务,提高系统的整体吞吐量。
  3. 公平性:确保所有进程都有机会获得CPU时间,避免饥饿现象。
  4. 实时性:对于实时系统,调度器应能确保实时任务在其时间约束内完成。

      为达到以上目标,Linux按照调度的优先级,分别实现了DEADLINE调度策略、实时(RT)调度策略、完全公平调度策略等。

图1 Linux调度策略的优先次序

      如图1所示[1],Linux在调度过程中首先尝试在最高级别的策略模块中寻找调度实体(即进程),如果没找到,则到下一级的策略模块中寻找,如果都没找到,则进入idle状态。例如,Linux内核如果在DEADLINE策略模块中找到了调度实体,就会在处理器上调度运行该实体,而不会继续到RT调度策略模块中寻找。接下来分节介绍Linux中最常用的DEADLINE、RT以及完全公平调度策略模块,又称调度器。DEADLINE调度器

      Linux内核中的DEADLINE调度器是一种实时调度策略,旨在满足具有严格时间要求的实时任务的需求。它在设计上结合了EDF(Earliest Deadline First)和CBS(Constant Bandwidth Server)两种经典的实时调度算法,为实时应用程序提供了更可靠和可预测的执行环境。

      Linux DEADLINE调度器是Linux内核自3.14版本以来引入的调度策略,其目的是为实时任务提供精确的时间控制和调度保证。DEADLINE调度器通过为每个任务分配三个关键参数——开始时间(Start Time)、截止时间(Deadline)和运行时间(Runtime),来确定任务的执行顺序和调度行为。

      调度器的目标是在任务的截止时间到达之前,完成所有具有时间约束的任务。如果任务没有在截止时间前完成,通常会被视为任务失败或延迟,这在硬实时系统中是不可接受的。

      DEADLINE调度器基于EDF(Earliest Deadline First)的思想,即在系统中,优先选择截止时间最早的任务执行。此外,结合CBS(Constant Bandwidth Server)机制,DEADLINE调度器还能控制任务的CPU时间消耗,防止任务因超出分配的时间片而影响系统的整体实时性能。

      Linux DEADLINE调度器的主要应用场景是硬实时系统,如工业控制系统、机器人控制、航空航天等领域,这些系统对任务的时间精度要求非常高,任务的延迟或未按时完成会导致严重的后果。通过DEADLINE调度器,系统可以确保任务在其指定的截止时间内完成。多媒体应用,如音频和视频流处理,要求任务以固定的周期执行,并在特定时间内完成,以保证输出的连续性和质量。DEADLINE调度器可以帮助这些任务获得所需的CPU时间,从而避免丢帧或音视频不同步的问题。以及高精度定时任务,如在金融交易系统、科学计算、医疗设备等场景中,高精度的定时任务非常重要。DEADLINE调度器能够确保这些任务按预定时间精确执行,满足系统的严格要求。

      DEADLINE调度器的缺点是相比于普通调度器,DEADLINE调度器的配置参数较多,需要用户对任务的时间需求有详细了解,这对应用开发者提出了更高的要求。另外,DEADLINE调度器需要系统有足够的资源来满足实时任务的要求,当任务过多或系统资源有限时,可能会出现任务调度失败的情况。最后,DEADLINE调度器缺乏弹性,在负载非常动态的系统中,DEADLINE调度器可能不如CFS等调度器灵活,因为它严格依赖于预先设定的时间参数。

RT调度器

      RT调度器是Linux内核中专门为实时任务设计的调度器,它为那些对延迟敏感的任务提供了更高的调度优先级,以确保它们能够在预定时间内执行。Linux中主要有两种RT调度策略:SCHED_FIFO 和 SCHED_RR,它们都是基于优先级的调度策略,与普通调度策略相比,RT调度策略提供了更严格的时间保证。

      SCHED_FIFO(First In, First Out):这是一个简单的实时调度策略,任务按优先级排序,优先级相同的任务按到达顺序执行。SCHED_FIFO任务一旦获得CPU资源,将持续运行,直到任务主动让出CPU或被更高优先级的任务抢占。没有时间片的概念,这意味着低优先级的任务可能会被高优先级任务“饿死”。

      SCHED_RR(Round-Robin):SCHED_RR与SCHED_FIFO类似,但它在相同优先级的任务之间实现了时间片轮转。每个任务在获得CPU时会运行一个时间片(默认100ms),然后让位给同一优先级的下一个任务。这样可以防止同一优先级的任务发生饥饿现象。

      RT调度器具有严格的优先级控制,RT调度策略减少了调度延迟,保证了任务在规定时间内获得CPU资源。在需要高可靠性和时间精度的场景中,RT调度器提供了比普通调度器更高的稳定性和可预测性。

      RT调度器的缺点是高优先级的RT任务可能长期占用CPU,导致低优先级任务得不到执行,甚至可能导致系统不响应(例如,一个SCHED_FIFO任务如果没有主动释放CPU,系统将无法响应其他任务)。另外RT调度器配置复杂,配置复杂:合理配置RT调度器的优先级和时间片需要深入了解任务的时间需求,配置不当可能导致系统不稳定或性能下降。RT调度器对资源的占用较为刚性,在动态负载环境下可能表现不佳。

完全公平调度器

      Linux内核的完全公平调度器(Completely Fair Scheduler, CFS)是目前Linux系统中默认的进程调度器,它旨在提供一个公平、可扩展且高效的调度机制。CFS调度器的设计理念是尽量公平地分配CPU时间,使得每个任务都能获得与其优先级相符的CPU时间份额。

      在CFS中,公平的概念体现在所有任务都应该在相同优先级的情况下,获得相等的CPU时间份额。CFS通过维护每个任务的“虚拟运行时间”来实现这一点。任务的虚拟运行时间越少,意味着它获得的CPU时间越少,因此CFS会优先调度虚拟运行时间较少的任务,以实现CPU时间的公平分配。

      CFS使用红黑树(Red-Black Tree)数据结构来管理所有可运行的任务。红黑树是一种自平衡二叉搜索树,能够在O(log N)时间内插入、删除和查找元素。CFS将所有任务按其虚拟运行时间排序存储在红黑树中,每次调度时,选择树中最左边(虚拟运行时间最少)的任务来运行。

            最后,CFS调度器与cgroups(Control Groups)紧密结合,允许管理员对任务组设置CPU资源的配额。通过cgroups,系统管理员可以将进程划分为不同的组,并为每个组分配CPU时间份额,从而实现更精细的资源控制。

图2 Linux完全公平调度策略与Cgroup的进程组的结合

      如图2所示,与Cgroup结合后,Linux完全公平调度的实体,按照调度任务组形成了一个树状结构。在进行调度实体选择时,调度器首先从树的根结点(与处理器直接对应的调度组),逐层选取最佳调度实体,一直到叶子结点(与具体进程对应)。

望获自适应调度器

      最后简单介绍一下,国科环宇在研的望获自适应调度器。该调度器针对Linux实时调度器配置和运行不够灵活的缺点,对进程的行为进行在线分析,并利用机器学习的方法对进程的调度进行配置,以做到实时性和灵活性的兼顾。

参考文献

[1] Digging into the Linux scheduler 

http:// https://deepdives.medium.com/digging-into-linux-scheduler-47a32ad5a0a8

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

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

相关文章

如何编写一个CMakeLists.txt文件(由简到难,较详细)

在Linux系统下,经常使用CMakeLists.txt文件来链接、编译C工程,大部分人clone的代码里都是有CMakeLists.txt文件的,只需要cmake .. 和make就完事了,但在工作中,你必须要有从无到有编写CMakeLists.txt文件的能力。 一、…

一款简易大众点评项目实战——达人探店、关注、附近商圈、签到、UV统计

一款简易大众点评项目实战——达人探店、关注、附近商圈、签到、UV统计 8.达人探店8.1上传接口与发布笔记接口8.2 达人探店-查看探店笔记8.3 达人探店-点赞功能8.4 达人探店-点赞排行榜 9、好友关注9.1 好友关注-关注和取消关注9.2 好友关注-共同关注9.3 好友关注-Feed流实现方…

Visual Studio 2024安装教程(非常详细),从零基础入门到精通,看完这一篇就够了(附安装包)

软件下载 软件:Visual Studio版本:2022语言:简体中文大小:4.11M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨下载链接:https://pan.baid…

C语言-在主函数中输入10个等长的字符串。用另一函数对他们进行排序,然后再主函数输出这10个排好序的数列(分别用数组法和指针法实现)

在主函数中输入10个等长的字符串。用另一函数对他们进行排序&#xff0c;然后再主函数输出这10个排好序的数列&#xff08;分别用数组法和指针法实现&#xff09; 一、数组法实现 void str_sort(char str[][32], int n) {int i, j;for (i 0; i < n - 1; i){for (j 0; j …

Stable Diffusion WebUI安装ControlNet 遇到的问题

最近研究Stable Diffusion &#xff0c;在安装ControlNet遇到了几个问题&#xff0c;总算解决了 1.第一个是连不上github,可以使用国内的这个 https://gitcode.com/gh_mirrors/sd/sd-webui-controlnet.git 2.第二个问题是一直Installing ,虽然下载下来了&#xff0c;但还是…

【Python】函数练习题

1、定义一个函数&#xff0c;用于计算一个字符串中字符a出现的次数并通过return返回。 代码&#xff1a; 2、写函数&#xff0c;判断用户传入的一个值&#xff08;字符串或列表或字典或元组&#xff09;长度是否大于5&#xff0c;如果大于5返回True,反之返回False. 代码&…

Python实现邮件发送时,如何优化邮件内容?

Python实现邮件发送如何设置&#xff1f;使用Python发信技巧&#xff1f; 无论是个人用途还是企业需求&#xff0c;一封优化良好的邮件能够提升用户体验&#xff0c;提高邮件的打开率和响应率。AokSend将探讨在Python实现邮件发送时&#xff0c;如何通过几个关键步骤来优化邮件…

【C#】中IndexOf的用法

在 C# 中&#xff0c;IndexOf 方法是字符串和列表&#xff08;如 List<T>&#xff09;等数据结构中常用的方法&#xff0c;用于查找指定元素或子串首次出现的位置。以下是针对不同情况使用 IndexOf 的示例。 对于字符串 对于字符串类型&#xff0c;IndexOf 方法返回子字…

【Python-办公自动化】1秒比较出2张表格之间的不同并标黄加粗

欢迎来到"花花 Show Python"&#xff0c;一名热爱编程和分享知识的技术博主。在这里&#xff0c;我将与您一同探索Python的奥秘&#xff0c;分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者&#xff0c;都能在这里找到有价值的信息和灵感。 自我介…

本地http://localhost/端口 通过本地服务,远程调用同一网络下的另一台主机的微服务方法

首先需要确保能够ping通另一台主机的ip&#xff0c;切记一定要确保可以ping通&#xff0c;否则无法正常访问 我使用的spring-cloud框架&#xff0c;在spring-cloud框架中进行操作&#xff0c;我是有一个单独的Remote模块用于远程调用&#xff0c;在这里 第一步&#xff1a;需要…

Stable Diffusion绘画 | 提示词中的符号解析

() 小括号-提升权重 每个单词默认的权重值为1&#xff0c; 每套上一层“()”后&#xff0c;权重增加1.1倍&#xff0c;最多可套3层小括号&#xff1a; blue&#xff1a;权重值1 (blue)&#xff1a;权重值1.1 ((blue))&#xff1a;权重值1.21 (((blue)))&#xff1a;权重值1.3…

进程与磁盘管理相关

进程与磁盘管理相关 进程创建&#xff08;或者存在的)的唯一标志》进程控制块 PCB是进程存在的唯一标志&#xff0c;当进程被创建时&#xff0c;操作系统为当前进程创建PCB&#xff0c;当进程结束时&#xff0c;会回收PCB PCB .进程描述信息 。进程控制和管理信息 。资源分…

GPS跟踪环路MATLAB之——数字锁相环

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 GPS跟踪环路MATLAB之——数字锁相环 前言为什么要锁相环科斯塔斯环锁相环的一些基本概念1、捕获、锁定与跟踪的概念2、捕获时间和稳态相差3、相位捕获和频率捕获4、捕获带和同…

《计算机组成原理》(第3版)第5章 输入输出系统 复习笔记

第5章 输入输出系统 一、概述 &#xff08;一&#xff09;输入输出系统的发展概况 1&#xff0e;早期阶段 早期的I/O设备种类较少&#xff0c;I/O设备与主存交换信息都必须通过CPU&#xff0c;如图5-1所示。 图5-1 I/O设备通过CPU与主存交换信息 2&#xff0e;接口模块和DMA…

JavaScript模拟空调效果

JavaScript模拟空调效果https://www.bootstrapmb.com/item/15074 在JavaScript中模拟空调效果主要依赖于前端界面的交互和状态变化&#xff0c;因为实际的温度调节、风扇速度调整等硬件操作无法直接通过JavaScript在浏览器中实现。不过&#xff0c;我们可以通过JavaScript来模…

yaml详解实战,读取实战,以及运行结果解析,以及单引号和双引号对转义符读取的影响

一、 YAML&#xff1a;数据格式 文章&#xff1a;《yaml基本语法&#xff0c;数据类型&#xff0c;对象&#xff0c;数组&#xff0c;复合结构&#xff0c;纯量&#xff0c;引用&#xff1b;文件后缀为.yml或.yaml》 里有一些介绍&#xff0c;以及我自己的理解。 这篇文章偏实战…

nvm介绍、下载、安装、配置及使用

一、背景 在工作中&#xff0c;我们可能同时在进行2个或者多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;进而不同项目必须依赖不同版本的NodeJS运行环境&#xff0c;这种情况下&#xff0c;对于维护多个版本的node将会是一件非常麻烦的事情&#xff0c;nvm就…

Linux C 程序 【04】线程分离

1.开发背景 Linux 线程区分于FreeRTOS&#xff0c;线程的属性形态有2中&#xff0c;在 pthread.h 中有注解&#xff0c;如下。 /* Detach state. */ enum {PTHREAD_CREATE_JOINABLE, #define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLEPTHREAD_CREATE_DETACHED #defin…

72v-85v输出12v/13.5v电流6A用在电自上AH1009

135-3806-7573.在探讨“72V-85V输出12V/13.5V电流6A用在电动自行车&#xff08;电自上&#xff09;AH1009”这一主题时&#xff0c;我们深入到一个结合了电力电子技术、电池管理系统以及电动自行车性能优化的专业领域。。 *****芯片概述&#xff1a; AH1009是一款宽电压范围、…

数据中心服务器监控系统搭建方案

数据中心监控系统搭建方案 1、背景2、环境3、部署3.1、终端部署3.1.1、服务器配置3.1.1.1、浪潮服务器3.1.1.2、曙光服务器 3.2、服务端部署3.2.1、在线环境下载3.2.2、离线环境安装3.2.3、系统配置 1、背景 服务部署与三个网络环境中&#xff0c;其中某个网位于线下机房&…