首页 > 其他分享 >RT-Patch学习

RT-Patch学习

时间:2024-08-12 23:29:56浏览次数:9  
标签:RT 优先级 Patch 学习 任务 内核 Linux 抢占

RT 是什么

在标准的 Linux 内核中,内核不是完全可抢占的(not fully preemptible)。虽然 Linux 内核支持一些程度的抢占(如在用户空间任务之间的抢占),但在内核态执行关键代码(如持有锁时),内核通常是不可抢占的。这意味着在某些情况下,特别是在处理复杂内核任务时,高优先级的任务可能不得不等待较长时间,直到当前的内核任务完成。

内核抢占指的是在操作系统内核中,当一个高优先级任务需要运行时,低优先级任务可以被暂停(抢占),高优先级任务立即获取 CPU 的控制权。抢占的程度直接影响操作系统响应外部事件的速度。

RT-Preempt 补丁是为 Linux 内核设计的,它将标准的 Linux 内核改造成一个几乎完全可抢占的内核。补丁通过修改内核代码路径,减少或消除内核中的不可抢占部分,使得内核任务可以在更多场景下被抢占。具体来说,RT-Preempt 补丁对内核中的锁机制进行了调整,将大多数“禁用抢占”的区域变成可以被抢占的区域,使得高优先级的任务可以在任何时刻获取 CPU 的控制权。

在一个完全可抢占的内核(例如应用了 RT-Preempt 补丁的 Linux 内核)中,即使内核态正在运行某个任务,只要有一个高优先级的任务准备好执行,操作系统调度器可以暂停当前的内核态任务,切换到高优先级的任务。

普通 linux RT 改进

想要实现 RTLinux 有两种方法

  1. 加一个内核:通过在 Linux 内核与硬件中断之间增加一个可抢先的实时内核,把标准的 Linux 内核作为该实时内核的一个优先级。它可以被实时进程抢断,正常的 Linux 进程仍可以在 Linux 内核上运行,这样既可以使用标准分时操作系统即 Linux 的各种服务,又能提供低延时的实时环境。RT�Linux 是采用双内核法改造 Linux 实时性的典型代表。
  2. 打 patch:通过打补丁的方式,对内核的进程调度、中断服务程
    序等代码进行修改与优化,提高系统的实时性能

我们可以通过应用 RT-Preempt 补丁,将标准的 Linux 内核转换为一个完全可抢占的内核。LinuxWiki 地址

自内核版本 v2.6.11 以来,每个主线 Linux 内核的长期稳定版本都提供 PREEMPT_RT 补丁。大多数 Linux 内核的长期稳定版本都有偶数子版本号。

RT 技术基础

必须抢占当前正在运行的低优先级任务,以便让实时关键任务运行。抢占取决于任务的调度策略规则。实时系统的另一个重要方面是保证实时任务独占使用某些资源。

中断线程化

Wiki 地址

在标准 Linux 内核中,中断服务例程(ISR)是在硬中断上下文中执行的。在这个上下文中,硬件中断被禁用。这意味着在处理 ISR 的过程中,系统不会响应其他硬件中断,直到当前的中断处理完。硬件中断被禁用的同时,也意味着内核抢占和软中断(soft interrupts)也被禁用。软中断是内核中较低优先级的中断类型,通常用于延迟处理任务。禁用抢占和软中断确保了当前 ISR 的处理不会被其他任务打断,但这也会影响系统的实时性,因为高优先级任务可能无法及时执行。

线程化中断也是 RT-patch Linux 使 Linux 实时化的主要工作,其主要目标是通过将中断处理过程转化为可调度的内核线程,从而提升系统的实时性。

中断处理分为两部分:

  • 上半部: 上半部的处理依然在硬中断上下文中执行,这部分处理的工作量最小,主要处理紧急任务,如清除硬件中断标志或简单的数据读取。
  • 下半部: 下半部的工作则被转化为一个独立的内核线程来执行。这意味着它可以被操作系统调度,具有优先级管理,并且不会阻塞其他更高优先级任务的执行。

优先级继承

Wiki 地址

优先级继承(Priority Inheritance) 是解决 优先级翻转(Priority Inversion) 问题的一种机制

优先级翻转是指在一个多任务操作系统中,低优先级任务因为占用了某种资源,而导致高优先级任务被迫等待,从而让一个中等优先级的任务获得了执行机会,最终造成系统实时性下降的一种现象。

RT-Preempt 补丁通过优先级继承机制有效解决了优先级翻转问题。在这种机制下,当高优先级任务需要被低优先级任务持有的资源时,低优先级任务将继承高优先级任务的优先级,从而能够尽快完成其任务并释放资源。这种机制确保了高优先级任务不会因为等待资源而被中等优先级任务的执行延迟.

下面举一个优先级反转的例子

  1. 低优先级任务 L 先获得了某个共享资源的锁,并开始执行。
  2. 这时,高优先级任务 H 变得可运行,并试图获取 L 已经占用的锁,但由于 L 持有该锁,H 必须等待 L 释放锁。
  3. 然而,另一个 中等优先级任务 M 在 H 等待时也变得可运行,因为 M 的优先级高于 L 且无需该锁,它将抢占 L 的执行时间。这导致 L 无法继续执行,从而无法释放 H 需要的锁。

要解决这个问题,我们需要一个技术叫做优先级继承:

  1. 通过提高持有资源的低优先级任务 L 的优先级来解决优先级翻转的问题。
  2. 当高优先级任务 H 需要一个资源,而该资源正被低优先级任务 L 持有时,L 将继承 H 的优先级。这样 L 就可以优先于中等优先级任务 M 执行,从而尽快释放资源。
  3. 一旦 L 释放了资源,它的优先级将恢复到原来的低优先级,H 重新获得该资源并继续执行。

标签:RT,优先级,Patch,学习,任务,内核,Linux,抢占
From: https://www.cnblogs.com/studyinglover/p/18355916

相关文章

  • Day 41 动态规划 Part09 开始炒股
    动态规划解题步骤确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组121.买卖股票的最佳时机这道题虽然自己做出来了,但是做了后面的题再回头看它就有了不一样的理解。curMin更重要的代表了一种状态,代表遍历到当前时间时最低的股......
  • 机器学习——完整的基础概念学习,机器学习分类
    机器学习——完整的基础概念学习,机器学习分类一、机器学习与深度学习机器学习与深度学习的区别和联系机器学习是人工智能的一个分支,它使计算机能够通过学习数据和模式来自动改进和优化算法。相比之下,深度学习是机器学习的一个子集(是机器学习的一种),它依赖于类似于人脑的神......
  • WSL学习笔记
    WSL学习笔记适用于Linux的Windows子系统(WSL)是Windows的一项功能,可用于在Windows计算机上运行Linux环境,而无需单独的虚拟机或双引导。WSL旨在为希望同时使用Windows和Linux的开发人员提供无缝高效的体验。本笔记主要介绍WSL2。WSL的版本区别WSL有两个版......
  • 【知识宝库】打造编程学习“知识宝库”:高效笔记策略与整理艺术
    在编程学习的征途上,每一位探索者都渴望拥有一座坚实的知识宝库,那里收藏着解决问题的钥匙、创新思维的火花以及深入技术的阶梯。而构建这样一座宝库,高效且系统的笔记记录与整理方法无疑是不可或缺的基石。本文将带您深入探索如何打造个性化的编程学习笔记系统,让知识不再是散落......
  • HarmonyOS NEXT 学习笔记6--prop装饰器-单向传递
    1.代码:@Entry@ComponentstructComponentQuestionCase{@Statemoney:number=999999;build(){Column(){Text('father:'+this.money)Button('存100块').onClick(()=>{this.money+=100})......
  • 学习Linux第十八天:高级的编程
    structFILE{}流: FILE*   数据从文件当中流入和流出所体现出来的字节   流叫做流   流的分类:      二进制流:2001\n         二进制数据的流      文本流:         ASCII码数据的流\n\t FILE结构定......
  • DEVCON初级使用教程结构,你可以根据自己的需求深入学习每个部分。深入了解 DEVCON 的中
    DEVCON(DeviceConsole)是一个用于管理Windows设备驱动程序和设备的命令行工具。它提供了一个用于列出、启用、禁用、安装、卸载和更新设备驱动程序的接口。以下是一个DEVCON初级使用教程的大纲,帮助你了解如何开始使用这个工具。DEVCON初级使用教程大纲1. 介绍什么是DEVCON?......
  • 前端小白编程学习之整理笔记篇
    如何高效记录并整理编程学习笔记?在编程学习的海洋中,高效的笔记记录和整理方法就像一张珍贵的航海图,能够帮助我们在浩瀚的知识中找到方向。如何建立一个既能快速记录又易于回顾的笔记系统?如何在繁忙的学习中保持笔记的条理性?让我们一起探讨如何打造属于自己的编程学习“知识宝......
  • UE5学习笔记12-为角色添加蹲下的动作
    一、一点说明    1.蹲下使用了ACharacter类中Crouch();函数,函数功能是先检查是否存在运动组件,将bool类型的变量变为true,该变量代表是想要蹲下。      2.通过源码可知存在是否蹲下的bool变量bIsCrouched如图,如果对:1有疑问请搜索C++位域二、代码实现 ......
  • Quartz 更新调度不生效
    前提调度表中已有一个日历调度计划jobkey为triggerKey,因为系统时间出错导致NEXT_FIRE_TIME不对想通过更新调度来修正NEXT_FIRE_TIME更新不生效踩坑(一)使用StartNow而不是StartAtITriggertrigger=TriggerBuilder.Create().WithIdentity(jobName,groupName)......