LITMUSRT 是 Linux 内核的实时扩展,专注于多处理器实时调度和同步。修改了 Linux 内核,以支持零星任务模型、模块化调度器插件和基于预留的调度。包括集群、分区和全局调度进程,并且还支持半分区调度。
自 2006 年以来,LITMUSRT 一直由 Björn Brandenburg 持续维护,并积极开发到 2017 年。截至 2018 年,目前没有计划将其重新定位到更新的 Linux 内核版本。
Linux 内核补丁 + 用户空间接口 + 追踪工具
在实际条件下实现实用的多处理器实时系统研究
为什么实施『教科书式』调度进程很困难? 除了通常的内核乐趣:受限环境、特殊 API、难以调试……
如果你正在做内核级别的工作,不管怎样…
如果您正在开发实时应用…
如果你的主要关注点是理论和分析…
调度器:一个函数,在每个时间点将一组就绪作业中的元素映射到一组 M 个处理器上
作业分配仅在响应明确定义的计划事件 (或在众所周知的时间点) 时更改
每个处理器仅在本地调度自己
LITMUSRT 项目的主要目的是为应用实时系统研究提供一个有用的实验平台。为此,LITMUSRT 在内核中提供了抽象和接口,简化了多处理器实时调度和同步算法的原型设计 (与修改『普通』Linux 内核相比)。
作为次要目标,LITMUSRT 作为概念验证,展示了如何在当前硬件上实现可预测的多处理器调度进程和锁定协议。最后,我们希望 LITMUSRT 的部分内容和“经验教训”可以作为蓝图或灵感来源,为其他实施工作(包括商业和开源)找到价值。
让实时系统研究人员的工作更轻松
功能足够完整和稳定,实用:评估无法运行实际工作负载的系统毫无意义
LITMUSRT 是一个稳定且经过测试的研究系统,它运行良好,但我们没有资源来维持严格的 QA 制度,因为它是一个适合安全或关键任务应用的生产质量系统 (就像大多数研究项目一样)。
此外,LITMUSRT 的 API 并不『稳定』,也就是说,接口和实现可能会在发布之间毫无征兆地发生变化。POSIX 合规性不是目标;LITMUSRT-API 提供备用系统调用接口。
虽然我们的目标是遵循 Linux 编码标准,但 LITMUSRT 的目标不是合并到主流 Linux 中。相反,我们希望 LITMUSRT 中的一些原型思想最终可以在 Linux 或其他内核中得到采用。
LITMUSRT 的当前版本是 2017.1,基于 Linux 4.9.30。它于 2017 年 5 月 26 日发布,包括用于以下调度策略的插件:
应用可调度性分析 + 在考虑开销下 + 快速启动开发
在主线 LITMUSRT 中维护: Global EDF、Clustered EDF、Partitioned EDF、Partitioned Fixed-Priority (FP)、Partitioned Reservation-Based (polling + table-driven)、Pfair (PD2)
外部分支和补丁/文献研究专用原型:…
主旨:您需要的调度器可能已经可用 (几乎) 永远不要从头开始:如果您需要实现一个新的调度进程,可能存在一个很好的起点 (例如,具有相似的结构) 大量基线:至少,LITMUSRT 可以为您提供有趣的基线进行比较
最小的静态跟踪点 + 二进制重写 (JMP ↔ NOP) + 每个处理器,免等待缓冲区 使用实际开销评估您的工作负载!
Built on top of feather trace: 任务参数 + 上下文切换和阻塞 + 工作发布、截止日期和完成
如何解决? 不能只是关闭中断 -> 使用统计过滤器 -> 但是哪个过滤器呢?-> 如果存在真正的异常值怎幺办? 自 LITMUSRT 2012.2 以来:
跟踪处理器间中断 (IPI):
在 LITMUSRT 中,只需运行 ftcat -c 即可自动测量补偿未对齐的时钟源
有没有想过 Pfair 时间表在现实中是什么样子的? 简单!只需用 sched_trace 记录时间表并运行 st-draw!
注意:这是来自 4 核机器的真实执行数据,不是模拟![颜色表示 CPU 身份]
int wait_for_ts_release (void);
: 任务在同步释放之前处于休眠状态
int release_ts (lt_t *delay);
: 在 <延迟> 纳秒后触发同步释放延迟>
LITMUSRT 还支持非零相位/偏移:在任务系统发射后,会发射一些已知的偏移量
可以对异步周期性任务使用可调度性测试
简化的接口、更丰富的任务模型、大量可运行的代码可供模仿
支持真正的全局调度
低开销非抢占式部分:非抢占式旋转锁,无需系统调用。
免等待抢占状态跟踪
使用 TRACE () 调试跟踪:广泛支持 Qemu 的『printf () 调试』
SCHED_LITMUS『class』激活五个调度器插件(或其他自定义的插件),LITMUSRT 任务具有最高优先级。
可以在运行时命令行界面通过指令 setsched xxx
切换调度器插件,但仅当没有实时任务被运行才可以
插件直接管理实时任务
Linux 内核补丁 ➔ litmus-rt
用户空间接口 ➔ liblitmus
代码追踪工具 ➔ feather-trace-tools
C API (task model + system calls) + user-space tools
➔ setsched
, showsched
, release_ts
, rt_launch
, rtspin
/proc/litmus/*
/dev/litmus/*
每个实时任务映射每个 (私有) 进程页面
第二个目标,截至 2016.1
透明使用: liblitmus 负责一切
在 Linux 中,每个进程都有一个处理器关联掩码 Xth bit set ➜ process may execute on core X
大多数 LITMUSRT 插件都忽略了亲和掩码。 特别是,主线版本中的所有插件都这样做。 Global is global; partitioned is partitioned
Recent out-of-tree developments Support for hierarchical affinities [ECRTS’16]
由于资源有限,我们不可能支持和测试所有 Linux 功能
x86 和 ARM 以外的体系结构
在虚拟机管理进程上运行
CPU 热插拔
处理器频率缩放
与 PREEMPT_RT 集成
C-EDF: Clustered EDF
DMPO: Deadline Monotonic Priority Ordering
FPPS: Fixed-Priority Preemptive Scheduling
GSN-EDF: Global EDF with synchronization support
MSRP: Multiprocessor Stack Resource Policy MrsP: Multiprocessor resource sharing Protocol
OPA: Audsleys Optimal Priority Assignment RPA: Robust Priority Assignment
RBS: Reservation-Based Scheduling P-RES: Partitioned Reservation-Based Scheduling
PSN-EDF: Partitioned EDF with synchronization support P-FP: Partitioned Fixed-Priority PD2 (PFAIR) : with either staggered or aligned quanta
SPO: Slack-based Priority Ordering