7.4 Highest Locker Protocol/Pattern

Bruce Powel Douglass大师介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/134665868嵌入式软件开发从小工到专家-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/135297955C嵌入式编程设计模式源码-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/ChatCoding/article/details/134819019

最高锁定模式虽然可以减少优先级反转的情况,但并不能保证完全避免死锁。其他模式,如有序锁定模式(Ordered Locking Pattern)和同时锁定模式(Simultaneous Locking Pattern),则提供了避免死锁的其他方法。

7.4.1 抽象

最高锁定模式是解决无界阻塞/无界优先级反转问题的另一种解决方案。

  • 最高锁定模式为每个资源定义了一个优先级上限。
  • 在最高锁定模式下,如果任务没有阻塞任何更高优先级的任务,则其优先级不会提升。只有当任务阻塞了一个或多个更高优先级的任务时,任务的优先级才会提升到其所持有资源中最高的优先级。

HLP(Highest Locker Protocol):

  • 一步到位: HLP 会直接将任务的优先级提升到资源的上限优先级。
  • 快速响应: HLP 可以快速响应高优先级任务的资源请求,避免高优先级任务长时间阻塞。

PIP(Priority Inheritance Protocol ):

  • 逐步提升: PIP 会逐步提升任务的优先级,每当被阻塞任务的优先级高于当前优先级,则提升一次持有资源任务的优先级。
  • 响应速度慢: PIP 的响应速度相对较慢,因为需要多次提升才能达到最终的优先级。
  • 这限制了优先级反转:任务的优先级只能提升到其所持有的资源的最高优先级,因此,因资源竞争而导致的优先级反转最多发生一次。
  • 它与优先级继承模式不同:任务在拥有资源时被更高优先级的任务抢占(这个更高优先级的任务不需要当前已被锁定的资源),不会发生链式阻塞。

在最高锁定模式(Highest Locker Pattern)中,当一个任务在拥有资源时被抢占,不会发生链式阻塞,因为如果它需要这个资源,它的优先级就不会比资源的优先级上限还高,所以它无法抢占。因此,就不会有一个任务在等待另一个任务释放资源时被阻塞,进而导致链式阻塞。

只要任务在拥有资源时不自行挂起,这种设计避免了任务在拥有资源时被抢占导致的链式阻塞。

  • 任务在拥有资源时主动挂起自己,可能会出现链式阻塞,类似于优先级继承模式(Priority Inheritance Pattern)因此可能会出现死锁情况

任务在拥有资源时主动挂起可能会导致链式阻塞,因为这种行为可能违反了最高锁定模式的规则。在最高锁定模式中,任务在获取资源时会提升到该资源的优先级上限,以此来限制优先级反转。

然而,如果任务在持有资源的同时挂起自己,它就无法释放资源,如果有其他任务需要这些被挂起任务持有的资源,它们也会被阻塞。

如果这些被阻塞的任务又持有其他资源,那么又会有更多的任务因为等待这些资源而被阻塞,从而形成一条阻塞链。这种链式阻塞可能会涉及多个任务和资源,最终可能导致系统的运行效率降低,甚至出现死锁的情况。

为了避免死锁,应该确保任务在拥有资源时不会挂起自己。如果系统允许任务在拥有资源时挂起自己,那么就需要像处理优先级继承模式那样计算最坏情况下的阻塞时间(遍历链式阻塞的最长情况)。

  • 只要拥有资源的任务不将自己挂起,就不会出现死锁的情况。

为了避免死锁,需要打破死锁的四个必要条件中的至少一个。最高锁定模式主要是通过限制优先级反转来解决无界阻塞/无界优先级反转问题,但它并没有直接解决死锁问题。相比之下,优先级上限模式(Priority Ceiling Pattern)旨在限制最大优先级反转到单一级别,并完全防止基于资源的死锁。

7.4.2 问题

解决资源竞争而导致的:无限优先级反转。

7.4.3 模式结构:

图 7-10:最高锁定模式

最高锁定模式的结构元素与优先级继承模式类似,如图 7-10 所示。唯一的区别在于共享资源新增了名为 priorityCeiling 的属性。

该模式通过为每个可锁定资源定义一个上限优先级priorityCeilingpriorityCeiling 仅比资源最高优先级客户端的优先级稍高一级,并在设计时确定。当资源被锁定时,锁定任务的优先级会提升到该资源的上限优先级。

7.4.4 协作角色:

抽象线程 (Abstract Thread)

  • 抽象类,不可直接实例化。
  • 与调度器关联,保证接口一致性。
  • 抽象线程是一个“活动”对象,意味着它创建时会创建一个线程用于运行。它通过组合关系包含一些被动对象,这些被动对象在“活动”对象的线程中执行。

具体线程 (Concrete Thread)

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

互斥锁 (Mutex)

互斥锁是一个互斥信号量对象,一次只允许一个调用者通过。共享资源的操作每当调用相关服务时都会调用它,在启动服务之前将其锁定,并在服务完成后将其解锁。

  • 一次只允许一个调用者通过互斥信号量访问共享资源。
  • 共享资源的服务调用会锁定它,完成后解锁。
  • 尝试调用已锁定的资源则会被阻塞,直到互斥锁解锁。
  • 互斥信号量向调度器发送信号,通知调度器当前活动线程尝试调用互斥信号量,并提供互斥信号量 ID (用于以后释放时解锁)和入口点(线程继续执行的位置)。

调度器 (Scheduler)

  • 调度器根据线程优先级协调多个线程的执行,始终运行就绪队列中具有最高优先级的任务。
  • 当“活动”线程对象创建时,它会调用 createThread 操作为其创建一个任务。
    • 当任务未被阻塞或抢占,调度器会调用 StartAddr 地址从头开始执行此任务,
    • 当任务已被阻塞或抢占,调度器则会调用 EntryPoint 地址继续执行此任务。
  • 在最高锁定模式中,当互斥锁试图访问已被锁定的资源时,调度器会:
    • 阻塞请求任务,将其放入阻塞队列中。
    • 将拥有资源的任务的优先级提升到共享资源的 priorityCeiling

共享资源 (Shared Resource)

  • 共享资源是多个线程共享的对象。为了保证系统正常运行,所有共享资源要么是可重入的,要么必须受到保护。
  • 当线程尝试使用受保护的资源时,会检查资源关联的互斥锁。如果被锁定,则将任务放入阻塞队列,并将其重新进入点记录在 TCB 中。
  • 共享资源有一个名为 priorityCeiling 的常量属性,其值要比能访问该资源的最高优先级的任务的优先级要高一级,这确保了当资源被锁定时,使用该资源的其他任务不能抢占它。

任务控制块 (Task Control Block, TCB)

  • TCB包含与其对应的线程对象相关的调度信息,包括线程的优先级、默认启动地址以及在完成之前被抢占或阻塞时的入口地址。
  • 调度器为每个现有线程维护一个 TCB 对象。TCB 记录线程的当前优先级(可能因资源访问和阻塞而提升)及其初始默认优先级。

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

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

相关文章

IT行业中最重要的证书

在IT行业,拥有一些含金量较高的证书是职业发展的关键。这些证书不仅可以证明技能水平,还有助于提升在职场上的竞争力。本文将介绍几个IT行业中最重要的证书。 1. Cisco认证 CCNA(Cisco Certified Network Associate)是Cisco公司新…

Acrel-1200分布式光伏运维平台屋顶光伏工商业屋顶光伏应用

上海安科瑞电气股份有限公司 胡冠楠 咨询家:“Acrelhgn”,了解更多产品资讯 行业现状 “十四五”期间,随着“双碳”目标提出及逐步落实,本就呈现出较好发展势头的分布式光伏发展有望大幅提速。就“十四五”光伏发展规划&#xf…

关键字const

1.定义常量 const int a; 2.定义常量指针 1.不可以通过常量指针来修改其指向的内容。 2.不能把常量指针赋值给非常量指针,反过来可以。 3.函数参量为常函数指针时,可以避免函数内部不小心改变指针所指地方的内容。

Linux ---- Shell编程之免交互

一、Here Document 多行重定向 1、Here Document定义 使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件…

猫什么时候发腮?公认发腮效果好的生骨肉冻干推荐

猫什么时候发腮是许多猫主人非常关心的问题。在猫咪的成长过程中,发腮是一项重要的体征,也是猫咪成熟的标志。想要让猫咪拥有可爱的肉嘟嘟脸型,主人需要在适龄的年龄段加强营养补给,不要错失最佳发腮期。那么,猫咪的最…

netty源码:(58)NioEventLoop中处理IO事件和普通事件的时间比例是多少?

在NioEventLoop的run方法中有如下代码片段: 当ioRatio不为100时,首先通过System.nanoTime()获取IO事件的开始处理时间,然后调用processSelectedKeys方法处理IO时间,然后再计算IO事件执行了多长时间。最后通过ioTime(I…

《区块链简易速速上手小册》第4章:区块链与加密货币(2024 最新版)

文章目录 4.1 比特币与区块链4.1.1 比特币基础4.1.2 比特币交易的工作流程:4.1.3 拓展案例 1:闪电网络4.1.4 拓展案例 2:比特币ATM 4.2 其他主要加密货币4.2.1 加密货币的多样性4.2.2 以太坊的案例4.2.3 拓展案例 1:非同质化代币&…

springboot 整合 PowerJob实现定时任务调度

最近项目需要使用定时任务,而使用了PowerJob做任务调度模块,感觉这个框架真香,今天我们就来深入了解一下新一代的定时任务框架——PowerJob! 简介 PowerJob是基于java开发的企业级的分布式任务调度平台,与xxl-job一样…

【JavaEE Spring】Spring AOP

Spring AOP 1. AOP概述2. Spring AOP快速⼊⻔2.1 引⼊AOP依赖2.2 编写AOP程序 3. Spring AOP详解3.1 SpringAOP核⼼概念3.1.1 切点(Pointcut)3.1.2 连接点(JoinPoint)3.1.3 通知(Advice)3.1.4 切⾯(Aspect) 3.2 通知类型3.3 PointCut3.4 切⾯优先级Order3.5 切点表达式3.5.1 ex…

什么是网络数据抓取?有什么好用的数据抓取工具?电商数据API免费测试入口

什么是网络数据抓取 网络数据抓取(Web Scraping)是指采用技术手段从大量网页中提取结构化和非结构化信息,按照一定规则和筛选标准进行数据处理,并保存到结构化数据库中的过程。目前网络数据抓取采用的技术主要是对垂直搜索引擎&a…

Maya------布尔 圆形圆角组件

17. maya常用命令7.布尔 圆形圆角组件_哔哩哔哩_bilibili 选中一个模型,再按shift加选另外一个模型 圆形圆角命令

QT5.14+VS2017安装踩过的一些坑

1.在QT中使用MSVC只能用VS2017,相应的调试器的版本只能用15.9,高于15.9的亲测都不行。完整的安装除了需要QT5.15和VS2017,还需要Windows SDK (10.0.22621) 下载地址:https://developer.microsoft.com/zh-cn/windows/downloads/win…

Qt读写Execl:QXlsx库

Qt三方库开发技术:QXlsx介绍、编译和使用 我自己记录的实例代码:https://download.csdn.net/download/cao_jie_xin/88795216 目录 一、概述二、下载三、编译四、加载QXlsx静态库五、介绍一些常用的功能1、一些头文件和命名空间2、创建一个excel文件3、…

消息中间件之RocketMQ源码分析(四)

消费者的Rebalance机制 客户端是通过Rebalance服务做到高可靠的。当发生Broker掉线、消费者实例掉线、 Topic扩容等各种突发情况时,消费者组中的消费者实例是怎么重平衡的,以支持全部队列的正常消费的? Rebalance服务的类图 RebalanceImpl的核心属性 …

CHS_06.2.3.4_2+用信号量实现进程互斥、同步、前驱关系

CHS_06.2.3.4_2用信号量实现进程互斥、同步、前驱关系 知识总览信号量机制实现进程互斥信号量机制实现进程同步信号量机制实现前驱关系 知识回顾 各位同学 大家好 在这个小节中 我们要学习怎么用信号量机制来实现进程的同步互制关系 知识总览 那么 我们之前学习了互斥的几种软…

【C++杂货铺】详解类和对象 [下]

个人博客:代码菌-CSDN博客 专栏:C杂货铺_代码菌的博客-CSDN博客 目录 🌈前言🌈 📁 初始化列表(灰常重要) 📂 引入 📂 概念 📂 特性 📁 拓展构…

OG Trade在ZKX揭幕:一家基于Starknet的游戏化永续合约交易所

ZKX的 OG Trade通过内置游戏化和30分钟交易竞赛,为所有交易者创造机会,革新了永续合约交易模式。 2024年1月30日 — ZKX宣布推出OG Trade,这是一家基于Starknet的游戏化永续合约交易所,旨在满足短期交易者、高水平交易者和波段交易…

021 while循环详解

什么时while循环 int i 0; // 循环输出i&#xff0c;大于100时结束 while(i < 100){System.out.println(i);i; } int i 0; int sum 0; // 计算1-100的和&#xff0c;输出 while(i < 100){sum i;i; } System.out.println(sum); 什么是死循环 循环没有停止下来的条件…

Vue3嵌套ref小细节,自我解惑

前言&#xff1a; 作者在学习时&#xff0c;遇到代码如下&#xff1a; import { ref,watch } from vue const state ref({count:0}) const addState ()>{state.value.count } 对于方法中对对象中count的理解存在偏差 问题及解决&#xff1a; 误解&#xff1a; 认为是…

面对近期行情大起大落的伦敦银需要关注什么?

近期经常有听到投资者抱怨说&#xff0c;伦敦银价格没有明显趋势&#xff0c;很难做。确实&#xff0c;我们从日线图看&#xff0c;金价处于一个比较宽幅的横盘区间当中&#xff0c;近期的行情也是大涨大跌。投资者认为&#xff0c;面对大起大落的行情无从下手。下面我们就来讨…