xenomai内核解析--任务同步互斥机制(一)--优先级倒置

简介: 本文是关于Xenomai实时操作系统中资源管理和优先级倒置问题的概述。Xenomai使用`xnobject`和`xnregistry`管理任务间的同步互斥资源,如信号量、互斥锁等。资源管理涉及访问控制和资源保存,确保共享资源的正确调度。文章还介绍了优先级倒置现象,即高优先级任务因低优先级任务持有资源而被阻塞。为解决此问题,Xenomai采用了优先级继承策略,临时提升低优先级任务的优先级,以防止持续的优先级反转。文章后续将深入分析`xnsynch`模块和优先级倒置解决方案。

版权声明:本文为本文为博主原创文章,转载请注明出处。如有错误,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/
[TOC]

一、xenomai 资源管理简要

同步:任务间的直接制约关系,A要继续执行需要B完成某一个操作操作才能继续进行。
互斥:任务间的间接制约关系,A访问了资源B就不能去访问,必须等A访问完了才行。

操作系统提供了任务间的同步互斥机制,如信号量信号量(sem)、互斥锁(mutex)、条件变量(cond)等,抽象来说这些同步互斥锁本都是操作系统管理的一种资源,与消息队列(mq)、xddp/bufp/iddp、信号(signal)、一个驱动设备等一样。

对于每种资源,任务间资源管理要有两个基本机制:访问控制资源的保存

  • 访问控制。资源状态与任务调度管理紧密相关,以实现对共享资源阻塞、强占、唤醒等。
  • 资源的保存。各种资源在内核中的保存形式,内核必须提供一种机制,方便任务能快速查找访问的共享资源,例如两个任务件间通过命名信号量(sem)来进行同步时,需要能通过name(bind操作)快速定位到任务访问的资源,并将其与任务联系起来。

xenomai内核中将任务间的一切资源(包括xenomai内核态一些资源)使用内核对像xnobject表示,内核中的所有内核对象使用xnregistry来保存,由于xenomai内核工作过程中不能动态去申请内存,所以xnregistry大小一般是内核配置时配置的,具体内存分配在xenomai初始化时调用xnregistry_init()初始化xnregistry时分配。

内核对象管理xnregistry分析,详见文章内核对象管理—xnregistry

xenomai内存管理,详见文章xenomai实时系统内存池管理--xnheap

xenomai调度管理,请关注本博客后续文章xenomai任务管理系列


xenomai内核中,任务间共享资源(一切涉及任务间同步互斥的资源)抽象为对象xnsynch,这里的资源不仅限于信号量(sem)、互斥锁(mutex)、xnpipe、消息队列(mq)、事件(event)、条件(cond),还可以是一个驱动设备、以及内核中的资源管理器xnregister……,xnsynch与xenomai任务调度管理紧密结合,来实现上面所说的访问控制,本文所说的优先级倒置问题在该模块中实现。

xnregistry:保存内核对象,提供内核对象存储和快速检索。

xnsynch:资源抽象,提供线程与资源的同步互斥管理机制。

具体的线程间内核资源(对象):信号量(sem)、消息队列(mq)、xddp/bufp/iddp、事件(event)、条件变量(cond)、一个驱动设备、xnregister(xnregister的访问也互斥)…..。

二、优先级倒置

下面介绍优先级倒置也称优先级反转,会在下一篇文章分析xnsynch,如何解决优先级倒置问题。

1. 什么是优先级倒置

在基于优先级调度下,会出现下面情况(例子中的信号量为二值信号量与互斥量等效).

图中,三个任务t1、t2、t3的优先级分别是高、中、低。低优先级任务t3通过获取信号量来获取一些资源。t3运行一段时间后,t1就绪抢占t3得到运行,一段时间后t1需要相同信号量保护的资源时,t1由于获取不到信号量而阻塞。被t1抢占的t3得到继续运行。接着低优先级任务t3受到中优先级任务t2的抢占,t2的抢占导致t3迟迟无法释放信号量,这种情况可能会持续存在,最终导致高优先级任务t1无限期阻塞。在这种情况下,优先级发生了翻转,任务t2总是先于任务t1运行。(xenomai中优先级数值越大,优先级越高)

这就是优先级反转转问题(Priority Inversion and Priority Inheritance),即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。

2. 优先级反转解决办法

通过上图可知,只要t3不被中优先级任务抢占,尽快释放信号量就行了,所以在t1阻塞期间需要给t3一个足够高的优先级。避免优先级反转有优先级天花板优先级继承两种办法。

优先级天花板是当任务申请某资源时, 把该任务的优先级提升到可访问这个资源的所有任务中的最高优先级, 这个优先级称为该资源的优先级天花板。

优先级继承是当任务t1 申请共享资源S 时, 如果S正在被任务t3 使用,通过比较任务t3 与t1的优先级,如发现任务t3 的优先级小于t1的优先级, 则将任务t3的优先级提升到t1的优先级,等t3 释放资源S 后,再恢复任务t3 的原优先级。xenomai内核使用该方式,优先级反转后的示意图如下。

如上图所示,通过优先级继承,在t1被阻止的时间内将t3的优先级提升到t1的优先级来解决优先级反转,这样可以保护t3和间接t1免受t2的抢占。

以上为单个互斥信号的情况,在真实环境中,往往是多个信号量、多个任务,下图为多个任务与多个互斥信号量交互的示例:

① 低优先级为10的任务t3获取信号量s1;

② 任务t3获取信号量s2;

③ 任务t2抢占运行后尝试获取信号量s1时阻塞;

④ 任务t3继承t2的优先级30继续执行;

⑤ 优先级为90的t1抢占t3;

⑥ 任务t1尝试获取信号量s2阻塞;

⑦ 任务t3继承t1的优先级90继续执行;

⑧ 任务t3释放信号量s1,优先级继续保持为90;

⑨ 任务t3释放信号量s2,并恢复优先级10;

⑩ 任务t1获取信号量s2抢占运行。

目录
相关文章
|
3月前
|
存储 人工智能 安全
操作系统的心脏:内核深度解析
【8月更文挑战第13天】 在数字世界的每一次跳动中,都能感受到操作系统内核的强大生命力。本文将带你走进操作系统的核心——内核,揭示它如何协调和管理计算机硬件资源,保证软件运行的高效和稳定。从内核的定义和功能,到它的结构和设计哲学,再到现代操作系统中的创新与挑战,我们将一起探索这个让计算机系统“活着”的秘密所在。
56 3
|
4月前
|
缓存 Java 调度
Java并发编程:深入解析线程池与Future任务
【7月更文挑战第9天】线程池和Future任务是Java并发编程中非常重要的概念。线程池通过重用线程减少了线程创建和销毁的开销,提高了资源利用率。而Future接口则提供了检查异步任务状态和获取任务结果的能力,使得异步编程更加灵活和强大。掌握这些概念,将有助于我们编写出更高效、更可靠的并发程序。
|
6月前
|
机器学习/深度学习 人工智能 负载均衡
深度解析:Linux内核调度策略的演变与优化
【5月更文挑战第30天】 随着计算技术的不断进步,操作系统的性能调优成为了提升计算机系统效率的关键。在众多操作系统中,Linux因其开源和高度可定制性而备受青睐。本文将深入剖析Linux操作系统的内核调度策略,追溯其历史演变过程,并重点探讨近年来为适应多核处理器和实时性要求而产生的调度策略优化。通过分析比较不同的调度算法,如CFS(完全公平调度器)、实时调度类和批处理作业的调度需求,本文旨在为系统管理员和开发者提供对Linux调度机制深层次理解,同时指出未来可能的发展趋势。
|
2月前
|
存储 算法 安全
操作系统的心脏:内核深入解析
本文将带您走进计算机的大脑—操作系统内核,探索它如何管理硬件资源、提供系统服务,并确保多任务高效运行。文章以浅显易懂的语言,逐步揭示内核的神秘面纱,从基础概念到实际应用,让您对操作系统的核心组件有更深的理解。
88 5
|
2月前
|
存储 资源调度 监控
操作系统的心脏:内核深度解析
在数字世界的庞大机器中,操作系统扮演着至关重要的角色。而作为操作系统核心的内核,其重要性不言而喻。本文将深入浅出地探讨操作系统内核的基本概念、主要功能和工作原理,以及它如何影响计算机的整体性能和稳定性。我们将从内核的设计哲学出发,逐步深入到内核的各个组成部分,包括进程管理、内存管理、文件系统和设备驱动等关键模块。最后,文章还将讨论当前操作系统内核面临的挑战和未来的发展趋势。通过这篇文章,读者将获得对操作系统内核更深层次的理解,从而更好地把握计算机系统的运行机制。
59 1
|
2月前
|
存储 资源调度 算法
操作系统的心脏:内核深入解析
本文将带你走进操作系统的核心—内核,通过浅显易懂的语言解释什么是内核、它如何工作以及为什么它对整个系统至关重要。我们将从内核的定义和功能出发,逐步深入到它的结构和设计哲学,最后探讨内核在现代计算环境中面临的挑战和未来发展方向。无论你是计算机新手还是有一定基础的学习者,这篇文章都会为你揭开操作系统内核的神秘面纱。
60 3
|
2月前
|
人工智能 并行计算 安全
探索操作系统的心脏:内核深度解析
在数字世界的每一次跳动中,都能感受到一个强大而隐形的力量在默默支撑着一切——这就是操作系统的内核。本文将带你走进这个神秘而又强大的核心世界,从内核的设计哲学到它的架构布局,再到它如何与硬件、软件协同工作,以及面对现代挑战时的应对策略。我们将一起探索那些让操作系统能够高效、安全运行的秘密,解锁内核的奥秘,理解它对整个计算生态的重要性。准备好跟随我们的脚步,深入操作系统的核心,一窥究竟吧!
40 0
|
3月前
|
算法 安全 调度
操作系统的心脏:内核深度解析
【8月更文挑战第12天】 本文将带你进入操作系统的核心—内核,探索其设计、功能和工作原理。我们将通过通俗易懂的语言和生动的比喻,让你轻松理解这个复杂但至关重要的主题。无论你是计算机科学的初学者,还是有一定基础的开发者,这篇文章都将为你提供新的视角和深入的理解。让我们一起揭开操作系统内核的神秘面纱,探索它的奥秘吧!
38 3
|
3月前
|
自然语言处理 计算机视觉 Python
VisProg解析:根据自然语言指令解决复杂视觉任务
VisProg是一个神经符号系统,能够根据自然语言指令生成并执行Python程序来解决复杂的视觉任务,提供可解释的解决方案。
43 0
|
3月前
|
存储 资源调度 安全
操作系统的心脏:内核深度解析
本文将带你深入操作系统的核心—内核,探索其如何作为系统的中枢神经,协调硬件与软件之间的复杂交互。我们将从内核的基本概念出发,逐步揭示其设计哲学、关键组件以及在现代计算环境中的作用。通过这篇文章,你将获得对操作系统内核工作原理的深刻理解,并认识到它在维护系统稳定性和性能中的关键角色。

推荐镜像

更多