是啥让内核/操作系统实时?
Posted
技术标签:
【中文标题】是啥让内核/操作系统实时?【英文标题】:What makes a kernel/OS real-time?是什么让内核/操作系统实时? 【发布时间】:2014-04-10 01:54:14 【问题描述】:我正在阅读this 文章,但我的问题是笼统的,我的想法如下:
-
可以仅仅因为内核具有实时调度程序就将其称为实时内核吗?或者换句话说,假设我有一个 linux 内核,如果我将默认调度程序从
O(1)
或 CFS
更改为 real time scheduler
,它会成为 RTOS 吗?
是否需要硬件支持?一般来说,我见过具有 RTOS(例如 VxWorks、QNX)的嵌入式设备,这些设备是否有任何特殊规定/硬件来支持它们?我知道 RTOS 进程的运行时间是确定性的,但是可以使用 longjump/setjump 在确定的时间内获取输出。
非常感谢您对此的一些意见/见解,如果我对某些事情有误,请纠正我。
【问题讨论】:
所有“实时”意味着中断延迟(中断被禁用的时间)保证小于某个指定的微秒数。换句话说,内核保证它可以以某个最大频率(1/maxlatency)响应传入的外部事件。为了保证这一点,需要对所有中断处理路径进行大量仔细的编程和测试。如何实现这一点的实际细节将取决于内核架构。 @Jim:那么,它需要硬件支持吗? @JimGarrison:您能否将您的评论复制到答案中? 【参考方案1】:实时的具体描述是进程有最小的响应时间保证。这对于应用程序来说通常是不够的,甚至不如确定性重要。这对于现代功能丰富的操作系统来说尤其难以实现。考虑:
如果我想在精确的时间点控制某些硬件或机器,我需要能够在这些特定时刻生成命令信号,通常具有远亚毫秒的精度。一般来说,如果你编译让我们说一个 C 代码运行一个等待“半毫秒”并执行某些操作的循环,等待时间不完全是半毫秒,它有点多,因为常见的操作系统处理这个的方式,是他们将进程搁置至少直到正确的时间过去,之后调度程序可能(在某个时候)再次拿起它。
严重的问题不是时间 t 不完全是半秒,而是无法提前知道它还有多少。这种不准确性不是恒定的,也不是确定性的。
这在进行物理自动化时会产生令人惊讶的后果。例如,如果不通过内核接口使用专用硬件并告诉他们您真正想要多长时间的步长,就不可能使用任何典型的操作系统准确地控制步进电机。正因为如此,单个 AVR 模块可以准确地控制多个电机,但 Raspberry Pi(在时钟速度方面绝对超过 AVR)在任何典型的操作系统中都无法管理超过 2 个。
【讨论】:
【参考方案2】:在做了一些研究,与人们交谈(Jamie Hanrahan,Juha Aaltonen @linkedIn Group - 设备驱动专家),当然还有来自@Jim Garrison 的意见,我可以得出以下结论:
用 Jamie Hanrahan 的话来说——
是什么让内核成为实时的? 实时操作系统的必要条件 -
保证外部中断与中断处理程序启动之间的最大延迟的能力。
请注意,最大延迟不必特别短(例如微秒),您可以使用实时操作系统来保证绝对最大延迟为 137 毫秒。
实时调度程序是一种提供(对开发人员)完全可预测的线程调度行为 - “接下来运行哪个线程”。
这通常与响应中断的保证最大延迟问题不同(因为中断处理程序不一定像普通线程那样调度),但通常需要实现实时应用程序。实时操作系统中的调度程序通常实现大量的优先级。而且它们几乎总是实现优先级继承,以避免出现优先级倒置的情况。
那么,保证中断延迟和线程调度的可预测性是很好的,那么为什么不让每个操作系统都实时呢?
因为适合通用用途(服务器和/或台式机)的操作系统需要具有通常与实时延迟保证不一致的特性。
例如,实时调度程序应该具有完全可预测的行为。这意味着,除其他外,开发人员为各种任务分配的任何优先级都应由操作系统单独处理。 这可能意味着一些低优先级的任务最终会被长时间饿死。但是 RT OS 不得不耸耸肩说“这就是开发人员想要的”。请注意,为了获得正确的行为,RT 系统开发人员必须非常担心任务优先级和 CPU 关联性等问题。
通用操作系统正好相反。您希望能够在其上添加应用程序和服务,几乎总是由许多不同的供应商编写的东西(而不是像大多数 R-T 系统那样是一个紧密集成的系统),并获得良好的性能。也许不是绝对最好的性能,但很好。
请注意,“良好的性能”不仅仅通过中断延迟来衡量。特别是,您希望 CPU 和其他资源分配通常被描述为“公平”,而用户或管理员甚至应用程序开发人员不必担心线程优先级和 CPU 关联性和 NUMA 节点等问题。一项工作可能比另一项更重要,但在通用操作系统中,这并不意味着第二项工作根本不应该获得任何资源。
所以通用操作系统通常会在同等优先级的线程之间实现时间分片,并且它可能会根据线程过去的行为调整线程的优先级(例如,CPU hog 可能会降低其优先级;I/O 绑定线程可能会提高其优先级,因此它可以保持 I/O 设备工作;CPU 匮乏的线程可能会提高其优先级,因此它可以不时地获得一点 CPU 时间)。
内核是否可以仅仅因为它具有实时调度程序而被称为实时?
不,RT 调度程序是 RT 操作系统的必要组件,但您还需要操作系统其他部分的可预测行为。是否需要硬件支持?
一般来说,硬件越简单,其行为就越容易预测。所以 PCI-E 比 PCI 更难预测,PCI 比 ISA 更难预测,等等。有一些特定的 I/O 总线被设计为(除其他外)易于预测,例如中断延迟,但如今使用商品硬件可以满足许多 R-T 要求。【讨论】:
好资源(来自内核开发者的谈话)-Kernel Recipes 2016 - Who needs a Real-Time Operating System (Not You!) - Steven Rostedt 另一个 - Kernel Recipes 2016 - Understanding a Real-Time System (more than just a kernel) - Steven Rostedt以上是关于是啥让内核/操作系统实时?的主要内容,如果未能解决你的问题,请参考以下文章