Linux DEADLINE调度算法详解

介绍

在实时系统中,调度算法的选择对于任务的及时执行至关重要。为了满足实时性需求,Linux内核引入了不同的调度算法,其中 DEADLINE 调度算法是为硬实时任务而设计的。DEADLINE 调度算法的目标是在多任务的情况下确保任务在其指定的最后期限(deadline)之前被执行,从而最大限度地减少错过最后期限的情况。本文将详细介绍Linux的DEADLINE调度算法的原理、工作机制、优缺点以及其适用场景。

Linux调度算法

Linux系统在调度时,会按照下图的顺序依次从调度策略子模块选取进程,作为下一个在处理器运行的候选者。如果优先级高的调度策略子模块没有候选进程,则从后继的子模块选取进程。从下图可见,Linux DEADLINE子模块的优先级是要高于RT调度子模块,以及CFS子模块的。

                       图1、Linux的调度顺序

为了处理那些对时间非常敏感的任务,Linux 引入了 DEADLINE 调度类,它基于 Earliest Deadline First (EDF) 和 Constant Bandwidth Server (CBS) 算法。这种调度策略能够确保在一个处理上运行了多个硬实时任务的情况下,只要满足一定条件,每个任务在其规定的时间内得到处理。

DEADLINE调度算法的参数

DEADLINE 调度算法依赖于三个重要的参数,它们被用于定义任务的时间约束:

  1. 运行时(Runtime,runtime): 指每个调度周期内任务需要运行的时间量。
  2. 周期(Period,period): 指任务可以再次运行的时间间隔,即调度任务的频率。

3)最后期限(Deadline,deadline): 指任务的最后执行时间点,任务必须在这个时间点之前完成。

每个任务在创建时都会被分配这些参数。调度器会根据每个任务的最后期限来决定优先级:最后期限越早,优先级越高。这与传统的优先级调度不同,它完全基于任务的时间要求来进行调度。

DEADLINE调度算法的工作机制

Linux 中的 DEADLINE 调度算法是通过两个主要子算法实现的:

最早截止时间优先(Earliest Deadline First, EDF):这是 DEADLINE 调度的核心部分。调度器根据任务的截止时间对其进行排序,并优先调度最早到期的任务。每次有新任务需要调度时,调度器都会重新检查所有任务的最后期限,并选择那个最先到期的任务。

恒定带宽服务器(Constant Bandwidth Server, CBS):DEADLINE 调度器还需要确保每个任务不会超出其分配的 CPU 时间,这就是 CBS 的作用。它通过管理任务的运行时间来控制任务的CPU占用,使得即使在过载的情况下,也能够限制任务的 CPU 使用量,避免系统资源被某些任务过度占用。

DEADLINE 调度器中的每个任务会分配一个虚拟的截止时间(virtual deadline),这个时间用于决定其调度顺序。每次任务被调度时,其截止时间会被更新,从而确保系统中不同任务的公平性。

理论证明[1],在满足下面公式的前提下,调度算法能保证在同一处理器上运行的周期性任务都不超时:

以上公式的符号说明:Ci表示任务i的运算时间,Ti表示任务i的运行周期。

[1]给出了例子,说明,面对同样的任务,RM算法(先到达优先)不能保证所有任务都能满足运行期限需求。而EDF算法可以满足这些需求。

图2、RM调度算法和DEADLINE调度算法的比较

为了比较Linux RT调度策略和DEADLINE算法,国科环宇用相同的一组任务分别针对Linux RT下的RR算法、FIFO算法,以及DEADLINE算法做了比较实验,RR算法和FIFO算法都出现了超时的情况,而DEADLINE调度算法没有超时。实验数据如下:

在同一个CPU核心上运行三个实时进程,周期分别为4ms、4ms、2ms,实际占用CPU时间为1ms、2ms、0.4ms,是否能在周期内完成运行:

FIFO调度超时概率:95%,94%,95%

RR调度超时概率:92%,96%,92%

Deadline调度:0%,0%,0%

DEADLINE调度算法的应用

DEADLINE算法目前在媒体播放器,以及工业控制上进行了实验和测试。同时RT-TESTS测试套件[2]中的deadline_test测试程序给出了对Linux DEADLINE算法的使用样例。

deadline_test[2]的工作原理是,根据输入的总的运行时间/运行周期比例,给多个进程分配相应的运行时间/运行周期(并按照此运行时间/运行周期设置DEADLINE调度参数),使这些进程的运行时间/运行周期的和等于总的运行时间/运行周期。针对每个进程,按照其运行时间进行整数计算。所有进程运行10秒后,统计其运行时间错过率,以及运行周期错过率。

对周期性实时任务有需求的开发者可以参照deadline_test的样例设计和实施DEADLINE调度,也可以与国科环宇合作,打造Linux下的多任务强实时应用案例。

参考文献

[1] Giorgio C. Buttazzo. Hard Real-Time Computing Systems. Springer 2011.

[2] https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄?实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一,请跟我一起领悟它的智慧!   正文开始! 一、…

如何实现简单的 WinCC 项目分屏?

说明: 本文主要介绍了在不使用分屏器的情况下,通过 WinCC 项目中的设置,实现简单的分屏操作。两台显示器分别显示不同的 WinCC 画面,独自操作,互不影响。 试验环境 : 本文试验时所用硬件及软件环境…

案例分享—国外优秀UI设计作品赏析

国外UI界面设计之所以出色,首要原因在于其注重用户体验。设计师们深入洞察用户需求,通过细致的用户调研和数据分析,确保界面布局、色彩搭配及交互方式都能贴合用户习惯,从而提供流畅、直观的操作体验,增强用户满意度和…

【MySQL】数据库基础、库的操作、表的操作、数据类型

目录 1. 数据库基础1.1 MySQL是什么1.2 使用案例1.3 服务器,数据库,表关系 2. 库的操作2.1 字符集和校验规则2.1.1 查看系统默认字符集以及校验规则2.1.2 查看数据库的字符集和校验规则2.1.3 修改数据库的字符集和校验规则 2.2 库的操作2.2.1 创建数据库…

c++算法第4天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 第一题 题目链接 牛牛的快递_牛客题霸_牛客网 题目解析 <1kg -------> 20元 大于1kg&#xff1a;超出部分每千克1元 加急 5元 代码原理 代码编写 #include …

QT 实现自定义水波进度条

1.界面实现效果 以下是具体的项目需要用到的效果展示。 2.简介 原理:随着进度的改变,在我们的绘制图像void paintEvent(QPaintEvent *) override;事件中绘制图形。 使用QPainter来绘制正弦波,通过定时器,不断的更新我们绘制的图形,动态改变正弦波的参数来创建动画效果…

【从零开始的LeetCode-算法】3099. 哈沙德数

如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1a; 输入&am…

提高阅读效率:三种读书笔记方法的实践

你是否曾经感到&#xff0c;尽管阅读了大量书籍&#xff0c;却很少有几本能够留下持久的印象&#xff0c;甚至书中的人物也逐渐从记忆中消失。实际上&#xff0c;这种阅读方式可能并没有太大的价值。要想真正从阅读中获益&#xff0c;培养良好的阅读习惯至关重要&#xff0c;而…

IDEA下lombok安装及找不到get,set的问题的解决方法

在IDEA中使用Lombok,但是在编译时&#xff0c;提示找不到set()和get()方法&#xff0c;明明在javabean中使用了Data注解&#xff0c;但是编译器就是找不到。 Idea下安装Lombok(需要二步) 第一步&#xff1a; pom.xml中加入lombok依赖包 1 2 3 4 5 6 7 <!-- https://mvnre…

Linux的开发工具gcc Makefile gdb的学习

一&#xff1a;gcc/g 1. 1 背景知识 1. 预处理&#xff08;进行宏替换) 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结…

如何在算家云搭建PhotoMaker(图像生成)

一、PhotoMaker简介 PhotoMaker是一种高效、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义的逼真人类照片。相当于把一张人类照片的特征提取出来&#xff0c;然后生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内快速…

远控代码的重构-远控网络编程的设计上

套路化代码 但是我们这是一个MFC工程,我们需要考虑不是所有操作都需要到main函数里面实现,有些操作可以在main函数之前完成,有些可以在main函数返回以后完成,静态全局变量满足这个需求,我们需要添加一个自己的类 编辑器细节1 添加类和添加类向导的区别,一个是添加自己的类,一…

ESP8266 模块介绍—AT指令学习 笔记

零、简介 感谢百文网韦东山 老师对ESP8266模块的讲解 笔记在CSDN也有文章备份 大家可以在我的gitee仓库 中下载笔记源文件、ESP8266资料等 笔记源文件可以在Notion中导入 一、ESP8266-01S模块详细介绍 1. 名字的由来 ESP8266 是方形的主控芯片旁边的长方形是一个Flash-0…

000010 - Mapreduce框架原理

Mapreduce框架原理 1. InputFormat 数据输入1.1 切片与 MapTask 并行度决定机制1.2 Job 提交流程源码和切片源码详解1.2.1 Job 提交流程源码详解1.2.2 FileInputFormat 切片源码解析&#xff08;input.getSplits(job)&#xff09; 1.3 FileInputFormat 切片机制1.3.1 切片机制1…

基于Springboot个性化图书推荐系统的设计与实现

基于Springboot个性化图书推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

兴业周报|央行宣布“有力度的降息”他来了

耕天下4号楼1单元5-103室&#xff08;复式&#xff09; 稀有户型&#xff1a;标的物为二环内南北通透4居室复式&#xff0c;低密度花园洋房&#xff0c;小区中心位置&#xff0c;前后不临街。 黄金地段&#xff1a;耕天下东接天坛公园、西靠陶然亭公园、南临南护城河、北抵先…

基于微信小程序二手物品调剂系统设计与实现

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个…

优雅的入参校验,Valid常用校验

更好的阅读体验&#xff1a;优雅的入参校验&#xff0c;Valid常用校验 对于前端传递的参数&#xff0c;正常情况下后端是要进行一些必要的校验&#xff0c;最简单的做法是用 if 效果是可以&#xff0c;但不优雅。使用 Validator 代替 if&#xff0c;就会优雅很多 ps&#xff…

【从零开发Mybatis】引入MapperConfig.xml和Mapper映射配置

引言 学习MyBatis源码之前&#xff0c;了解它是如何通过JDBC查询数据库数据的基础知识是非常有用的。 上一篇我们编写了一个最简单的示例&#xff0c;通过JDBC查询数据库数据&#xff0c;从本文开始&#xff0c;我们将正式开始Mybatis框架的开发。 通过JDBC查询数据库数据存…