Real Time Linux简介

1、 Real Time Linux

  标准的Linux内核中不可中断的系统调用、中断屏蔽等因素,都会导致系统在时间上的不可预测性,对硬实时限制没有保证。目前,针对 real-time Linux 的修改有两种成功的方案。一是直接修改Linux 内核,使其直接具有 real-time 能力;另一是先运行一个 real-time 核心,然后将Linux 内核作为该 real-time 核心的 idle task(空闲任务)来运行。前者称为 PREEMPT-RT kernel,后者称为 dual kernel(如RTLinux、Xenomai等)。

实时操作系统又分为硬实时和软实时:
·硬实时要求在规定的时间内必须完成操作,硬实时系统不允许超时。
·在软实时里面处理过程超时的后果就没有那么严格。

  PREEMPT_RT是Linux内核的一个实时补丁。

  Xenomai是一种采用双内核机制的Linux 内核的强实时扩展。优先级高于Linux 内核,它负责处理系统的实时任务。

2、 PREEMPT_RT

  PREEMPT-RTPatch的核心思想是最小化内核中不可抢占部分的代码,同时将为支持抢占性而必须要修改的代码量最小化。对临界区、中断处理函数、关中断等代码序列进行抢占改进。

  PREEMPT_RT补丁的技术细节:
(1) 高分辨率定时器

高分辨率计时器允许精确的定时调度,并消除了计时器对定期调度程序滴答(jiffies)
的依赖性。

(2) 中断线程化,减少ISR处理时的关中断时间

PREEMPT_RT修补程序强制采用线程中断处理程序的机制。因此,所有中断处理程序都在
线程上下文中运行,除非它们用IRQF_NO_THREAD标志标记。这种机制也可以在Linux主
线内核中强制使用,而无需通过内核命令行选项PREEMPT_RT补丁。但是结果行为略有不同。

(3) rt_mutex

主线 Linux 内核中的所有互斥体都被 rt_mutexes 所取代。rt_mutex实现优先级继承
以避免优先级反转。这也适用于睡眠自旋锁和 rwlock。但是,信号量的持有者可以被抢
占,但不参与优先级继承。

在如下的情况下会发生优先级翻转:
	* 低优先级的任务A获取到一个资源,比如一个锁(L)。
	* 中优先级任务B开始执行,抢占了任务A。
	* 高优先级任务C尝试获取资源L。因为中优先级的任务B抢占了任务A,(任务A无法
	释放锁L)那么高优先级的任务就会阻塞。

	优先级翻转是实时系统中必须解决的问题,它可能导致一个高优先级任务被无限期推
迟执行。
	PREEMPT_RT中使用优先级继承来解决优先级反转,核心思想是:高优先级任务暂时
将其优先级赠与拥有临界资源()的低优先级任务,从而快速运行加快A对锁的释放。

	此处优先级继承是变化的:比如,又有一个优先级更高的任务D也尝试获取锁L,那么
任务C和A的优先级都会暂时提升为任务D的优先级。优先级继承的持续时间是非常短暂的。
因为一旦低优先级任务A释放了锁,它马上就会失去短暂提升的优先级,然后将锁交给任务C。
PREEMPT_RT在一段时间内仅仅允许一个任务读持有读写锁/semaphore(信号量)。允许该任
务递归获取该锁。尽管丧失一些灵活性,却使得优先级继承变得切实可行。

	优先级继承使得高优先级任务可以及时地获取锁和semaphore,即便是锁或semaphore
已经被低优先级的任务获取。PREEMPT_RT的优先级继承提供短暂的继承,这是高优先级任务
突然要获取低优先级任务的锁所需要的。compat_semaphore和compat_rw_semaphore可以
用于不需要semaphore优先级继承的事件类的使用场合

(4) RCU

Read-copy update (RCU) 是一种 200210 月被引入到内核当中的同步机制。通过允许
在更新的同时读数据,RCU 提高了同步机制的可伸缩性(scalability)。相对于传统的在
并发线程间不区分是读者还是写者的简单互斥性锁机制,或者是哪些允许并发读但同时不 允
许写的读写锁,RCU 支持同时一个更新线程和多个读线程的并发。RCU 通过保存对象的多个
副本来保障读操作的连续性,并保证在预定的读方临界区没有完成之前不会释放这个对象。

RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制
读取数据的时候不对链表进行耗时的加锁操作。这样在同一时间可以有多个线程同时读取该链
表,并且允许一个线程对链表进行修改(修改的时候,需要加锁)。RCU适用于需要频繁的读
取数据,而相应修改数据并不多的情景,例如在文件系统中,经常需要查找定位目录,而对目
录的修改相对来说并不多,这就是RCU发挥作用的最佳场景。

只有当设置了CONFIG_PREEMPT时,主线 Linux 中的 RCU 机制才可抢占(抢占模型:“低延
迟桌面”)。PREEMPT_RT抢占模型都使用抢占式 RCU 机制。此外,PREEMPT_RT补丁消除了
所有中间状态的RCU处理,并且仅在自己的线程中处理它。

(5) Sleeping spinlocks 睡眠自旋锁

在非 PREEMPT-RT 抢占模型中,自旋锁映射到原始自旋锁上。某个任务因为等待另一个
任务持有的自旋锁而进行旋转,直到持有自旋锁的任务释放它。抢占在原始自旋锁上下
文中处于禁用状态。在PREEMPT_RT自旋锁被映射到睡眠自旋锁上,而原始自旋锁保留其
行为。由于等待睡眠自旋锁进入睡眠状态的任务,并在释放自旋锁时被唤醒。在休眠自
旋锁上下文中,抢占未被禁用。

3、Threaded IRQs 中断线程化

在新的机制中,中断虽然还会打断实时进程,但中断处理程序所执行的操作仅仅是唤醒中断线
程,原本的中断服务程序主体放到一个内核线程中延迟执行,这样中断执行的速度就很快也很
确定,实时进程被打断后可以迅速再次运行,而中断服务程序会在实时进程挂起之后被系统
调度执行。

4、Xenomai

  Xenomai 是一种采用双内核机制的Linux 内核的强实时扩展。由于Linux 内核本身的实现方式和复杂度,使得Linux 本身不能使用于强实时应用。在双内核技术下,存在一个支持强实时的微内核,它与Linux 内核共同运行于硬件平台上,实时内核的优先级高于Linux 内核,它负责处理系统的实时任务,而Linux 则负责处理非实时任务,只有当实时内核不再有实时任务需要处理的时候,Linux 内核才能得到运行的机会。

  Xenomai 基于Adeos(Adaptive Domain Environment for Operating System)实现双内核机制。Adeos 是扩展Linux 的基础环境,Adeos 的设计目标是为操作系统提供一个灵活的、可扩展的自适应环境,在这个环境下,多个相同或不同的操作系统可以共存,共享硬件资源。

  目前,Adeos 是基于Linux 内核实现的,主要的应用是在Linux 的实时化方面,使基于Linux 的系统能满足强实时的要求(例如Xenomai 和RTAI3.2 以上版本都是基于Adeos 实现的)。在基于Adeos 的系统中,每个操作系统都是在独立的域内运行(但不一定所有的域实现的都是操作系统,也可以是完成其它功能的软件实体),每个域可以有独立的地址空间和类似于进程、虚拟内存等的软件抽象层,而且这些资源也可以由不同的域共享。

  Adeos 的主要工作就是管理硬件的中断,根据域的优先级依次执行相应域的中断服务程序,从而驱动域内的系统运行;同时,Adeos 还提供域之间的通信机制实现域的调度等。

  为了实现对中断的管理和域之间的优先级控制,Adeos 使用了中断管道(Interrupt Pipe)的概念。Adeos 通过中断管道在不同的域之间传播中断,而且提供了相应的机制可以让域改变自己在中断管道中的优先级。

  Xenomai 在Adeos 系统中的域优先级高于Linux 域,每当中断到来之后,Adeos先调度Xenomai 对该中断进行处理、执行中断相应的实时任务,只有当Xenomai 没有实时任务和中断需要处理的时候,Adeos 才会调度Linux 运行,这就保证了Xenomai的中断响应速度和实时任务不受Linux 的影响,从而提供了实时系统的可确定性。

  Xenomai 实时内核为开发强实时应用提供了丰富的功能,主要包括实时线程调度与管理、用户空间实时任务支持、线程同步服务、时钟服务、中断服务、动态内存申请和实时对象注册服务等。

本文章参考了百度百科、他人技术网站、知乎、Linux官方网站等多方资料,综合整理,如有侵权,联系删除!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嵌同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值