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

一、xenomai 资源管理简要

同步:任务间的直接制约关系,A要继续执行需要B完成某一个操作操作才能继续进行。

互斥:任务间的间接制约关系,A访问了资源B就不能去访问,必须等A访问完了才行。

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

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

  • 访问控制。与资源状态与任务调度高度联系,决定了资源可用时优先唤醒哪个线程。。
  • 资源的保存。各种资源在内核中的保存形式,内核必须提供一种机制,方便任务能快速查找访问的共享资源,例如两个任务件间通过命名信号量(sem)来进行同步时,需要能通过name(bind操作时)快速定位到任务访问的资源,并将其与操作的任务联系起来。

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

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

内核对象管理xnregistry分析,请关注本博客后续文章内核对象管理—xnregistry

xenomai内存管理,请关注本博客后续文章xenomai实时系统内存池管理--xnheap

xenomai调度管理,请关注本博客后续文章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抢占运行。

【原创】xenomai内核解析--同步互斥机制(一)--优先级倒置的更多相关文章

  1. xenomai内核解析---内核对象注册表—xnregistry(重要组件)

    1. 概述 上篇文章xenomai内核解析--同步互斥机制(一)--优先级倒置讲到,对于所有内核对象: xnregistry:保存内核对象,提供内核对象存储和快速检索. xnsynch:资源抽象,提供 ...

  2. 【原创】xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 1.概述 上篇文章xenomai内核解析--实时IP ...

  3. 【原创】xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(二)--实时与非实时关联(bind流程)

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 1.概述 上篇文章介绍了实时端socket创建和配置 ...

  4. 【原创】xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. 1. 引出问题 上一篇文章xenomai内核解析--双核系统调用(一)以X86处理器为例,分析了xenomai内核调用的流程, ...

  5. 【xenomai内核解析】系列文章大纲

    xenomai内核解析 本博客为本人学习linux实时操作系统框架xenomai的一些记录,主要剖析xenomai内核实现,以及与linux相关的知识.方便读者定位具体文章,现列出本博客大纲,后续会陆 ...

  6. Linux中同步互斥机制研究之原子操作

    操作系统中,对共享资源的访问需要有同步互斥机制来保证其逻辑的正确性,而这一切的基础便是原子操作. | 原子操作(Atomic Operations):    原子操作从定义上理解,应当是类似原子的,不 ...

  7. xenomai内核解析之信号signal(二)---xenomai信号处理机制

    xenomai信号 上篇文章讲了linux的信号在内核的发送与处理流程,现在加入了cobalt核,Cobalt内核为xenomai线程提供了信号机制.下面一一解析xenomai内核的信号处理机制. 1 ...

  8. 【原创】xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1.概述 1.概述 [原创]实时IPC概述 [ ...

  9. 【原创】xenomai内核解析--实时IPC概述

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 1.概述 2.Real-time IPC 2. ...

随机推荐

  1. Spring Boot 整合 Apollo

    简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...

  2. Java wait 和 sleep 的区别

    一.区别 sleep 来自 Thread 类,和 wait 来自 Object 类 sleep 方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或方法 wait,notify和 ...

  3. 【原】二进制部署 k8s 1.18.3

    二进制部署 k8s 1.18.3 1.相关前置信息 1.1 版本信息 kube_version: v1.18.3 etcd_version: v3.4.9 flannel: v0.12.0 cored ...

  4. CLR垃圾收集器

    CLR GC是一种引用跟踪算法,大致步骤如下: 1.暂停进程中所有的线程: 2.标记阶段,遍历堆中的所有对象,标记为删除,然后检查所有活动根,如果有引用对象,就标记那个对象可达,否则不可达: 3.GC ...

  5. 入门大数据---Map/Reduce,Yarn是什么?

    简单概括:Map/Reduce是分布式离线处理的一个框架. Yarn是Map/Reduce中的一个资源管理器. 一.图形说明下Map/Reduce结构: 官方示意图: 另外还可以参考这个: 流程介绍: ...

  6. dart快速入门教程 (1)

    1.环境搭建 1.1.dart简介 Dart 是一种 易于学习. 易于扩展.并且可以部署到 任何地方 的 应用 编程 语言.Google 使用 Dart 来开发 大型应用.flutter使用dart语 ...

  7. vue基础入门(3)

    3.组件基础 3.1.什么是组件? 3.1.1.理解组件 前端组件化开发是目前非常流行的方式,什么是前端组件化开发呢?就是将页面的某一部分独立出来,将这一部分的数据.视图.以及一些控制逻辑封装到一个组 ...

  8. P2220 [HAOI2012]容易题【快速幂】

    题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定 ...

  9. [源码解析]Oozie来龙去脉之提交任务

    [源码解析]Oozie来龙去脉之提交任务 0x00 摘要 Oozie是由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是Hadoop平台的开源的工作流调度引擎,用来管理Hadoop ...

  10. web前端开发入门全套学习方法路径,兼职在家做网站也能月入上万!

    前端学习路径 1.WEB前端快速入门 在本阶段,我们需要掌握 HTML 与 CSS 基础,当然,也包含 H5 和 C3 的新特性.这个部分内容非常简单,而且非常容易掌握.相信你也更愿意学习这个部分,毕 ...