Real Time Linux简介

2023-11-13

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官方网站等多方资料,综合整理,如有侵权,联系删除!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Real Time Linux简介 的相关文章

  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在线程创建和退出时调用函数?

    include
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • 西普部分CTF题目(web)(持续更新)

    1 菊花 题目地址 http www simplexue com ctf examctfdetail 729 点击 我是吊死 进入sim php页面 post参数为id 提示需要net framework 9 9 用burp拦截 修改use
  • JS 实现抛物线动画案例

    相信大家都有浏览过 很多购物网站购物车的添加商品动画 今天 我们就手写一个简单的抛物线动画 先上案例 一 绘制页面 我们这里简单实现 一个按钮 一个购物车图标 样式这里直接跳过 最终dom结构 div class container div
  • eclipse 编译dubbo2.8.4 源码

    第一步 准备工作 下载dubbox的源代码 下载地址 https github com dangdangdotcom dubbox 第二步 编译源代码 maven编译工具 打开CMD命令窗口 切换到dubbox源代码的所在文件夹 E wor
  • Java——数据结构之顺序表

    文章目录 Java 数据结构之顺序表 1 顺序表的简单了解 2 接口的实现 1 创建初始变量 2 打印顺序表 3 添加元素 4 判断是否包含元素 5 查找元素的下标 6 获取 pos 位置的元素 7 更新pos 位置的元素值 8 删除元素
  • pip install报错 [ImportError]: DLL load failed while importing _socket:参数错误

    pip install 时报错 ImportError DLL load failed while importing socket 参数错误 开始以为是虚拟环境的问题 换了虚拟环境还是不行 百度到了解决办法 Win7系统需要安装KB253
  • Spring系列——Spring MVC配置文件

    Spring系列 Spring MVC配置文件 一 前端控制器DispatcherServlet 二 RequestMapping注解 1 使用方法 1 1 标注在方法上 1 2 标注在类上 2 RequestMapping注解的属性 3
  • 机器视觉入门之路(三九--A,霍夫变换(hough transform)寻找直线,c++)

    xy坐标系直线 y kx b 请看图 假定红色线段上的所有样本点 100个 都满足上面的直线方程 a图 也就是说 红色的点 x1 y1 x2 y2 x3 y3 x98 y98 x99 y99 x100 y100 带入方程 只能求出一个k值和
  • Redis入门(一)

    第1章 NoSQL 1 1 NoSQL数据库 1 1 1 NoSQL是什么 1 NoSQL Not Only SQL 意即 不仅仅是SQL 泛指非关系型的数据库 2 NoSQL不拘泥于关系型数据库的设计范式 放弃了通用的技术标准 为某一领域
  • 圆相交 马蹄集

    圆相交 难度 白银 0时间限制 1秒 巴占用内存 64M 输入2个圆的圆心的坐标值 x y 和半径 判断2个圆是否相交 输出YES或者 NO 格式 输入格式 输入整型 空格分隔 每行输入一组信息 输出格式 输出YES或者NO Created
  • 《计算机组成原理实验》 多周期CPU

    计算机组成原理实验 多周期CPU 前言 这是中山大学2018年计算机组成原理实验中多周期CPU的实验报告 仿真与写板的内容暂略 所有源代码 包括写板 已经上传至我的github当中 欢迎大家访问 github个人主页 https stara
  • wxWidgets多线程及事件传递

    前言 最近忙着写项目 wxWidgets计划还有wxWidgets日志系统的拦截重定向 剩下一些比较杂的知识点 想到哪写到哪 比如进程间通信 调用外部程序后结束本程序 用于升级程序 集成带窗口的ActiveX 创建单进程程序等 这些文档上基
  • 分享66个HTML&CSS源码,总有一款适合您

    HTML CSS源码 分享66个HTML CSS源码 总有一款适合您 下面是文件的名字 我放了一些图片 文章里不是所有的图主要是放不下 大家下载后可以看到 源码下载链接 https pan baidu com s 1AeVqON7byvt
  • 常用的HDFS操作

    常用的HDFS操作 利用Hadoop提供的shell命令完成任务 1 向HDFS中上传任意文本文件 如果指定的文件在HDFS中已经存在 由用户指定是追加到原有文件末尾还是覆盖原有文件 2 从HDFS中下载指定文件 如果本地文件与要下载的文件
  • C++BUG: [Error] invalid array assignment

    C BUG Error invalid array assignment 1 Introduction 2 memcpy 函数原型 功能 头文件 返回值 与strcpy的区别 实例 1 Introduction 在使用数组给数组赋值时 会出
  • INADDR_ANY的用法

    INADDR ANY就是指定地址为0 0 0 0的地址 这个地址事实上表示不确定地址 或 所有地址 任意地址 一般来说 在各个系统中均定义成为0值 例如MontiVista Linux中在 usr include netinet in h定
  • 个人跨境电商要多少钱?新手怎么做跨境电商?

    近几年 随着跨境电商的迅速发展 所以很多人都跃跃欲试 想开始从事跨境电商行业 但是想要加入跨境行业的话 我们就得需要先提前了解清楚个人做跨境电商需要多少钱 今天就给大家讲一下个人做跨境电商所需的花费和新手做跨境电商的五大法则 1 平台费用
  • C# 基础知识 (一).概念与思想篇

    在C 中有一些我自己认为比较独特的知识点 这些知识点是我经常使用的知识 但对它们的了解还是比较少的 所以通过查找资料学习 总结了这些独特的知识点并简单叙述 第一篇主要是一些概念和思想方面的知识 后面还有C 其他篇的文章 一 C 概念 C 语
  • 计算机网络知识点——第一章

    基本概念 一 计算机网络的概念 计算机网络 是 互连 自治的计算机集合 是将一个分散且具有独立功能的 计算机系统 通过通信设备与线路连接起来 由软件实现资源共享和信息传递的系统 二 计算机网络的功能 1 数据通信 连通性 2 资源共享 硬件
  • servlet多线程的根本原因在于服务器端servlet是单实例的。

    servlet多线程的根本原因在于服务器端servlet是单实例的
  • Real Time Linux简介

    目录 1 Real Time Linux 2 PREEMPT RT 3 Threaded IRQs 中断线程化 4 Xenomai 1 Real Time Linux 标准的Linux内核中不可中断的系统调用 中断屏蔽等因素 都会导致系统在