5.10 动态优先级模式

动态优先级模式与静态优先级模式类似,但动态优先级模式会随着任务运行时条件的改变自动调整任务优先级。调整任务优先级的策略有很多种,最常见的是“最早截止期优先”(Earliest Deadline First),即优先级最高的任务是离截止时间最近的任务。动态优先级模式明确强调了任务的紧迫性高于其关键性。

5.10.1 摘要

正如上一节提到的,可调度性最重要的两个概念是紧急性关键性,但操作系统通常只提供一个单一数值:优先级,来管理两者。静态优先级模式中,优先级是在设计时确定的,通常反映了紧急性和关键性的组合。动态优先级模式则根据任务的紧迫性,在运行时动态设定任务优先级。

动态优先级模式将每个任务的优先级设定为一个与剩余时间相关的函数,越接近截止时间优先级升高。这种调度策略通常被称为最早截止期优先 (Earliest Deadline First,简称 EDF)。该策略已被证明是可验证的最佳策略,即如果任务集合可以用任何方法调度,那么它也一定可以用 EDF 方法调度。然而,动态优先级模式并不稳定,这意味着在设计时无法预测过载情况下哪些任务会失败。

动态优先级模式最适用于关键性大致相等的任务集合,因为在这种情况下,紧迫性成为首要考虑因素。它也非常适合高度复杂的情况,例如无法预测同时运行的任务集合。在如此复杂的情况下,为任务构建最佳静态优先级往往困难甚至不可能。

动态优先级模式通过协作的系统对象,根据任务的紧迫性动态调整优先级,从而实现高效的实时任务调度。

优点

  • 对紧迫性要求高的任务更有效。
  • 适用于任务集关键性大致相等的情况。

缺点

  • 不稳定,无法预测过载情况下哪些任务会失败。
  • 实现比静态优先级模式复杂。

5.10.2 问题

在小型实时系统中,任务的排列组合是已知的,任务本身是稳定的:它们的截止日期从任务调用到任务调用是一致的,执行时间大致相同。但在复杂系统中,如完全对称的多任务系统,任务分配到处理器直到执行时才知道,这使得分析变得困难或不可能。

对于小型实时系统来说,待运行任务的排列组合是已知的,任务本身也是稳定的:它们的截止时间从上一个任务调用到下一个任务调用是一致的,执行时间大致相同。这极大地简化了分析,允许以绝对值精确计算系统的可调度性。

然而,在复杂系统中,例如完全对称的多任务系统,任务被分配到哪一个处理器需要等到执行时才知道,这种分析变得困难或不可能。此外,即使能够进行分析,这也是一项复杂的工作,添加单个任务就需要完全重新进行分析。

5.10.3 模式结构

如图 5-19 所示,动态优先级模式的结构与静态优先级模式非常相似,但抽象线程类中额外包含了一个名为截止时间(Deadline) 的属性。该属性通常是指从任务被调用到截截止时间点之间的时间段。虽然指定为持续时间,但调度器会根据此信息计算出任务的绝对截止时间 (存放在任务控制块中),并根据“最接近截止时间最优先”的策略安排任务执行。当一个新任务准备就绪时,它会根据其下一个截止时间插入就绪队列。

5.10.4 协作角色

  • 抽象线程 (Abstract Thread):

    • 抽象类,不可直接实例化。
    • 与调度器关联,保证接口一致性。
    • 拥有一个“截止时间”属性,表示任务执行完成的期限。
  • 阻塞队列 (Blocked Queue):

    • 一个按优先级排序的任务控制块引用队列。
    • 任务被阻塞时,其引用会放入该队列。
    • 任务解除阻塞时,其引用会从该队列移除并放入就绪队列。
  • 具体线程 (Concrete Thread):

    • 可实例化的抽象线程子类。
    • 用于包含执行系统实际工作的“语义对象”。
    • 提供将这些语义对象纳入并发架构的直接方式。
  • 互斥锁 (Mutex):

    • 一次只允许一个调用者通过的互斥信号量对象。
    • 共享资源的服务调用会锁定它,完成后解锁。
    • 尝试调用已锁定的服务则会被阻塞,直到互斥锁解锁。
  • 就绪队列 (Ready Queue):

    • 存放当前准备运行的任务控制块引用的队列。
    • 就绪队列中最高优先级的任务比当前运行任务优先级高时,将其移出并执行。
    • 高优先级任务加入就绪队列时,会抢占当前运行任务,使其重新排入就绪队列。
  • 调度器 (Scheduler):

    • 与静态优先级模式类似,但动态计算任务优先级。
    • 根据任务截止时间与当前时间的距离计算优先级,离截止日期越近优先级越高。
  • 共享资源 (Shared Resource):

    • 由一个或多个线程共享的对象。
    • 必须是可重入的,或通过互斥锁保护,以免并发访问导致错误。
  • 栈 (Stack):

    • 每个抽象线程都有一个用于返回地址和传递参数的栈。
    • 这是调度基础设施的重要组成部分。
  • 任务控制块 (Task Control Block,TCB):

    • 包含线程的调度信息,包括优先级、默认启动地址和当前入口地址等。
    • 保存任务下一个截止时间的属性“绝对截止日期”。

5.10.5 结果

动态优先级调度算法虽然是最优的,但并不稳定。所谓“最优”是指,如果任务集可以用任何算法调度成功,那么它也一定可以用动态优先级算法调度成功。所谓“不稳定”是指,我们无法预先预测在过载情况下哪些任务会失败。

在无法进行静态分析的复杂情况下,动态优先级模式可以很好地扩展到大量线程。静态优先级模式适用于相对静态的场景,在这种情况下,我们可以预知并为最坏的情况做好规划。但在高度复杂的系统中,尤其是完全对称的多任务架构,情况可能并非如此。

5.10.6 实施策略

实施这种模式比静态优先级模式稍微复杂一些。在静态优先级模式中,具体线程必须包含一个常量值的优先级。而在动态优先级模式中,具体线程必须包含相对于任务开始的截止日期。

实现难度:略高于静态优先级模式

动态优先级模式的实现复杂度仅略高于静态优先级模式。两者的主要区别在于:

  • 静态优先级模式: 具体线程(Concrete Thread)内存储固定的优先级值,调度器(Scheduler)用它来安排任务控制块(TCB)的优先级队列。
  • 动态优先级模式: 具体线程存储的是任务相对于开始时间的截止时间(Deadline 属性)。当具体线程准备就绪时,调度器会计算出下一个绝对截止时间(AbsoluteDeadline),并将该值存储在 TCB 中。调度器正是根据这个属性对优先级队列进行排序。

关键实现步骤:

  1. 具体线程中设置 Deadline 属性: 表示任务相对于开始时间的截止时间。
  2. 调度器计算 AbsoluteDeadline: 当具体线程准备就绪时,调度器从 Deadline 属性计算出下一个绝对截止时间。
  3. 存储 AbsoluteDeadline 于 TCB: 计算出的绝对截止时间存储在任务控制块中。
  4. 基于 AbsoluteDeadline 排序: 调度器使用 AbsoluteDeadline 属性作为优先级队列的排序依据。

5.10.7 相关模式

虽然存在动态优先级模式,但并不像静态优先级模式那样常见。与静态优先级模式一样,动态优先级模式通常会与其他多种模式结合使用,例如资源管理模式。

就像静态调度模式一样,当资源需要共享时,调度就变得格外棘手。优先级继承、最高锁持有者和优先级上限协议等资源共享模式,专门解决无界优先级反转可能引发的问题。

5.10.8 示例模型

图片 5-20 展示了与上一节静态优先级模式相同的模型,不同之处在于图中标注了每个线程的截止时间属性值,这些值会产生等效但未必完全相同的任务调度结果。

例如,如果数据采集线程 (DataAcqThread) 准备就绪运行,在静态优先级模式下,它会抢占其他任何线程,而不考虑任务距离截止时间有多近。然而,在动态优先级模式下,数据采集线程只有在它的下一个截止时间确实比其他线程的截止时间更近时才会抢占它们。在这两种情况下,任务都是可调度完成的。

在静态优先级模式下,当系统过载时,我们可以预测哪个线程会延迟:优先级最低的线程(过滤线程)。然而,如果使用动态优先级模式,则无法预测哪个线程会在过载情况下延迟。

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

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

相关文章

11个技巧让你的Python性能起飞

更多资料获取 📚 个人网站:ipengtao.com Python 是一门非常强大且易于学习的编程语言,但在处理大规模数据或复杂任务时,可能会遇到性能瓶颈。为了让你的 Python 代码运行更快,本文将介绍一些提高 Python 性能的技巧和…

uniapp如何添加多个表单数组?

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 总结模板: 一、实现思路 1.在 data 中定义一个数组,用于存储表单项的数据 2.在模板中使用 v-for 指令渲染表单项 3.在 methods 中…

如何快速搭建个人博客

说明:本文介绍如何使用Halo框架快速搭建个人博客,我用的是阿里云的云服务器,操作系统是CentOS 7.0。 安装Docker&DockerCompose (1)Docker安装 Docker的安装参考,Docker安装&卸载; …

AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究

今天分享的是AI算力系列深度研究报告:《AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究》。 (报告出品方:中泰证券) 报告共计:40页 数据中心能耗情况 随着越…

【Docker】linux、nginx、容器镜像三者基本概念

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

SQL中实现行列转换

目录 方法一:sum case when 方法二:sum if 方法三:pivot 现在有一张表class_gender,内容如下: classgender一年级女一年级女一年级男一年级男二年级女二年级女二年级男 现在我们要根据上表,统计得到下…

初识attention

近年来,attention机制在机器视觉和机器翻译领域受到了广泛的关注,有很多文章都是融合attention来提高性能。attention受启发于人类的视觉系统,最先应用于序列化的机器翻译(NLP)后又推广到计算机视觉中,本篇文章就来简单学习一下at…

JS基础 - 遍历对象方法(6种)

初始值: var obj {a: 1,b: 2,c: 3,d: 4,e: 5,}; 第一种:for in for (let key in obj) {console.log(key ":" obj[key]);} 第二种:Object.keys 获取key Object.keys(obj).forEach((key) > {console.log(key ":" …

AI绘画:PhotoMaker Win11本地安装记录!

昨天介绍一个叫PhotoMaker的AI绘画开源项目。挺不错的! 通过这个项目可以快速制作特定人脸的AI绘画作品,相比传统的技术效果会好很多,效率也高很多。 今天趁热打铁,本地电脑装装看,并且记录,分享一下&#…

js padEnd方法介绍笔记

padEnd() 是 JavaScript 字符串的方法之一,它用于在当前字符串的末尾添加指定数量的字符,直到字符串达到指定的长度。 padEnd() 方法接受两个参数: 目标长度和要添加的填充字符。 如果当前字符串的长度已经等于或超过目标长度,则不…

程序员怎么写简历_写简历软件

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一:方法二:展示效果:需要包依赖:代码: 方法三:展示效果:需要包依赖:代码:自己调参数,选择符合自己的 vue预览pdf集中方法 我…

第 9 章:理解C++内存模型

本章是继[第8章]讨论的延续,我们在那里讨论了一些多进程和多线程技术;本章将增强它们的使用。我们将引导你了解各种技术,同时聚焦于本章的主要内容——C内存模型。但为了讨论这一点,你首先将简要检视通过智能指针和可选对象实现的…

ZK鉴权设计以及相关探讨

文章目录 1. zk的鉴权设计2. zk鉴权应用范围3. zk鉴权的常用方法4. 推荐配置5. 参考文档 鉴权,分别由鉴和权组成 鉴: 表示身份认证,认证相关用户是否存在以及相关的用户名和密码是否一致权: 完成身份的鉴后,还需要判断…

DolphinScheduler + Amazon EMR Serverless 的集成实践

01 背景 Apache DolphinScheduler 是一个分布式的可视化 DAG 工作流任务调度开源系统,具有简单易用、高可靠、高扩展性、⽀持丰富的使用场景、提供多租户模式等特性。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方…

【C++】std::variant

上一篇文章讲到了 union,union union存在很多问题,因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…

Redis 安装 redistimeseries.so(时间序列数据类型)教程

配置步骤 1.下载 redistimeseries.so 文件 2.在 redis.conf 中增加配置 loadmodule /home/chenjian/redis-lib/RedisTimeSeries/redistimeseries.so DUPLICATE_POLICY LAST3.重启 Redis 服务 4.连接客户端,测试 RedisTimeSeries 相关命令,下图表明 R…

Java玩转《啊哈算法》排序之快速排序

心无挂碍,无挂碍故,无有恐怖,远离颠倒梦想,究竟涅槃。 地图 引子代码地址快速排序核心代码优劣完整代码演示 课后习题 引子 搭嘎好!本人最近看的《啊哈算法》这本书写的确实不错,生动形象,在保…

安全耐用 一路稳行 极固轮胎3大系列产品重磅上市

临近年关,全国范围内雨雪天气多发,让极端天气环境下的行车安全再次成为热议话题。路面寒冷湿滑,交通事故频发,也让大家开始关注一个话题:如何确保汽车在湿滑路面上的安全系数?或者说,如果遭遇类…