为什么Linux不是实时操作系统

简介: 本文探讨了Linux为何不是实时操作系统(RTOS)。实时性关乎系统对事件的确定性响应时间,而Linux虽能保证调度执行的实时任务,但无法确保中断响应时间、中断处理时间和任务调度时间的确定性。中断响应时间受中断屏蔽时间影响,Linux中无法确保;中断处理时间因不支持中断嵌套而不确定;任务调度时间虽快,但调度点的限制影响实时性。Linux的定位是通用操作系统,追求平均性能而非绝对实时性。为改善实时性,Linux提供了不同抢占模型,如可抢占内核(Low-Latency Desktop)和PREEMPT-RT补丁,后者接近硬实时但牺牲了吞吐量。PREEMPT-RT正逐渐成为Linux实时增强的标准。

[TOC]

一、什么是实时操作系统(RTOS)?

可参见本博客之前的文章:

什么是实时

实时的分类

常见的RTOS

latency和jitter

总结一下,实时其实说的是系统响应事件需要的时间的确定性,时间必须确定,打死都不能超过这个时间。

二、linux为什么不是实时操作系统?

为了确保系统的实时性,即事件响应产生结果的时间准确性,可以将整个事件响应过程的延迟拆解为若干个组成部分如下。只有各个部分的响应时间都具有确定性,整体的响应时间才能得到保证。

而操作系统仅能保证系统层面时延,也就是完成实时任务的调度执行,至于你的实时任务执行时间确不确定,还取决于你的软件算法设计,然后输出计算或控制结果,即最后结果输出的确定性。

img

对操作系统延时进行分解,可分解为系统延时=中断响应延时+中断处理延时+调度延时+进程切换延时,所以我们一一来看,linux为什么不实时?

中断响应时间

中断响应时间是指从接收到中断信号到操作系统做出响应,并完成进入中断服务例程所需要的时间。

实时操作系统的意义就在于能够在确定的时间内处理各种突发的事件,而中断是这些事件、系统抢占调度的触发点,中断何时得到处理反应了系统的基本实时性能,因而衡量嵌入式实时操作系统的最主要、最具有代表性的性能指标参数无疑是中断响应时间。

中断延迟时间=最大关中断时间+硬件开始处理中断到开始执行中断服务例程第一条指令之间的时间。通俗地说:中断产生到内核执行中断处理程序第一条指令的时间。影响该指标的最大因素是中断屏蔽时间。

那么任何条件下,linux中断响应时间确定吗(也就是最大中断屏蔽时间确定吗)?全球这么多开发者一起开发,linux支持这么多外设驱动,谁的驱动屏蔽中断执行多久谁知道呢?

中断处理时间

响应中断后,开始执行中断处理函数,不同的中断处理所需要的时间不同,那linux的中断处理延时确定吗?Linux由于不支持中断嵌套,执行中断处理时关中断,所以,该时间同样未知!不同的板子,不同的外设,不同的驱动程序设计,中断处理需要的时间均不一样。

任务调度时间

那一个事件产生,完成中断处理,下一步唤醒与该事件相关的任务。现在要找到下一个使用cpu的任务,如果系统中有成千上万个任务,linux从中选择运行的任务的时间要多少,这个调度过程的时间确定吗? 这就是为什么要有不同调度类和调度算法,不同调度类之间还要有不同的优先级,EDF调度类>RT调度类>完全公平调度调度类>idle调度类。不过Linux不同调度类的调度算法时间复杂度均为O(1),选择下一个运行的任务很快,所以linux的实时问题不是出在这,而是什么时候能调度的问题!!!

任何操作系统的调度追求2个目标:吞吐率大和延迟低,但这个目标是相互矛盾的。调度和上下文切换过程本身也是要CPU时间的,频繁的上下文切换会导致CPU时间的浪费,降低系统的吞吐量,

Linux是通用操作系统(GPOS), 其定位是尽量缩短系统的平均响应时间,提高吞吐量,注重操作系统的整体功能需求,达到更好的平均性能。(过度追求响应时,过多的上下文切换把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降),所以规定在哪可以调度很重要,也就是我们说的调度点或者抢占点。

说白了,调度也是一段代码,一个函数,什么时候可以调用这个函数呢?不同的抢占模型抢占点不同,目前linux主线提供了3种抢占模型。

1、No Forced Preemption(Server)

img

img

早期linux为追求最大吞吐量,只能在内核态返回用户态时中断处理返回用户态时进行调度,也就是整个内核态执行的过程中都不能抢占,那外部事件产生到p3任务执行,这时间就可大了去了,完全没有确定性可言。

这是传统的抢占模型,目标是使吞吐量最大化。大多数时候提供良好的延迟,但是没有保证,可能偶尔出现长的延迟。这种模型主要用于服务器和科学计算系统。如果希望使内核的处理能力最大化,不考虑调度延迟,那么应该选择这种模型。

2、Voluntary Kernel Preemption(Desktop)

img

img

后来呢,为降低系统整体的响应时间,加入了自愿调度,也就是我是内核开发者,我在开发这个驱动或者子系统的时候,我觉得这里我占用CPU太久了,我主动加一行代码调用might_resched()增加抢占点,让别的任务执行一下,相比No Forced Preemption P3事件响应时间明显减少了,这种方式对吞吐量几乎没影响。

img

3、Preemptible Kernel(Low-Latency Desktop)

img

img

可抢占内核,就是内核态执行过程中,除了临界区以外的所有内核代码可抢占,也就是在上面的基础上增加了中断处理返回内核态(内核态抢占)的抢占点。

提供了很低的响应延迟,最坏情况的延迟时间是几毫秒,代价是稍微降低吞吐量和稍微增加运行时开销。相比Voluntary Kernel Preemption,从事件发生到高优先级的p3到得到运行之间的时间更少了。

这种模型主要用于有毫秒级别延迟需求的桌面系统和嵌入式系统(linux 2.6 以上),比如音视频处理。

img

那为什么到这linux还不是一个硬实时操作系统呢?因为增加了中断处理返回内核态的抢占点,内核态中,只要不是关中断的地方,都可能发生抢占,这时候内核开发就变复杂了,任何内核代码都要考虑不同的上下文会不会有重入/死锁问题,多核下死锁的问题,进而增加了更多的临界区,这些临界区是不能抢占的。

所以就算linux启用可抢占内核,还有很多临界区和机制是默认不能抢占的,spinlock默认禁止抢占(整个内核态有10万+地方使用),同时硬中断的执行时间不确定,软中断总是抢占应用上下文等等影响任务调度时间的地方。

4、Full Real Time Preemption(PREEMPT-RT)

也就是我们说的实时补丁,linux实时化的方案之一。

img

使能RT补丁,即PREEMPT-RT,得到硬实时kernel,几乎任何地方都可以发生抢占,这种模型主要用于延迟要求为100微秒或稍低(几十微秒)的实时系统。 降低吞吐量、增加更多运行时开销。

PREEMPT-RT起源于2004年,包含了hrtimer、优先级翻转、可抢占RCU、中断线程化、Full Tickless、EDF调度等等这些机制来保证系统的整体实时性,其中的90%多特性已经进入主线内核。

(1)仓库http://git.kernel.org/cgit/linux/kernel/git/rt/linux-rt-devel.git

(2)仓库http://git.kernel.org/cgit/linux/kernel/git/rt/linux-stable-rt.git

img

目前PREEMPT-RT已成为Linux实时增强的标准,不久的将来会完全合入Linux主线,不需要再打补丁。

Ubuntu于2022年10年推出了Ubuntu官方维护的preempt-rt分支,尝鲜详见【原创】Ubuntu Pro RealTime linux(Ubuntu22.04 安装PREEMPT-RT实时内核)

上下文切换时间

那下一个运行的任务选出来了,linux完成上下文切换需要多久?得益于现在的CPU针对性优化设计,linux上下文切换时间是很短的,与处理器架构相关。

本文介绍Linux为什么不实时,然后介绍了preempt-rt,除preempt-rt外,Linux还有其他实时化方案,下篇文章介绍Linux主流实时方案,各有优劣,若感兴趣,详见实时linux方案概述

参考链接

Real-Time Linux Wiki

https://blog.csdn.net/fightingskyer/article/details/118877564

目录
相关文章
|
1月前
|
Ubuntu 物联网 Linux
从零安装一个Linux操作系统几种方法,以Ubuntu18.04为例
一切就绪后,我们就可以安装操作系统了。当系统通过优盘引导起来之后,我们就可以看到跟虚拟机中一样的安装向导了。之后,大家按照虚拟机中的顺序安装即可。 好了,今天主要介绍了Ubuntu Server版操作系统的安装过程,关于如何使用该操作系统,及操作系统更深层的原理,还请关注本号及相关圈子。
|
7月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
6月前
|
存储 Linux iOS开发
【Linux】冯诺依曼体系与操作系统理解
本文深入浅出地讲解了计算机体系的两大核心概念:冯诺依曼体系结构与操作系统。冯诺依曼体系作为现代计算机的基础架构,通过中央处理器、存储器和输入输出设备协同工作,解决了硬件性能瓶颈问题。操作系统则是连接硬件与用户的桥梁,管理软硬件资源,提供运行环境。文章还详细解析了操作系统的分类、意义及管理方式,并重点阐述了系统调用的作用,为学习Linux系统编程打下坚实基础。适合希望深入了解计算机原理和技术内幕的读者。
157 1
|
1月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
179 0
|
1月前
|
Unix 物联网 Linux
都什么年代了,你还不懂啥是Linux操作系统
至于华为鸿蒙操作系统是不是独树一帜,这个留给各位阅读本文的网友们来讨论
57 0
|
1月前
|
安全 Linux iOS开发
linux属于什么操作系统
Linux是一种自由和开放源代码的操作系统,具有高度的灵活性和可定制性。与常见的操作系统如Windows和macOS相比,Linux具有自由、安全和稳定等优势。Linux已广泛应用于服务器、桌面电脑、超级计算机和嵌入式设备等领域,并且在未来的发展前景广阔。由于其自由和开放源代码的特性,Linux还促进了计算机技术和社区的发展,为全球的计算机用户提供了更多的选择和可能性。
|
1月前
|
安全 Ubuntu Unix
关于Linux操作系统,你必须要知道的事
我们可以看到无论是Debian还是Buildroot都有各自的特点,为客户提供了更大的选择空间和灵活性,大家可以根据自己的需求选择合适的版本来满足终端用户的体验和功能需求。从平技术将会一直关注更多更安全、灵敏、易于开发的Linux版本,做好适配工作,不断为客户带来“简单开发、方便应用”的使用体验。
|
1月前
|
安全 Ubuntu Linux
如何安装Linux操作系统?
此时,您可以选择重新启动计算机,然后从硬盘上的Linux系统启动。以上是一个大致的安装过程。请注意,不同的Linux发行版可能会在细节上有所差异,因此在进行安装之前,请确保您阅读并理解了相应发行版的安装指南或文档。
|
1月前
|
Ubuntu Linux 开发者
Linux发行版比较:选择适合你的操作系统
在做出选择之前,建议您先在虚拟机或双系统环境中尝试不同的发行版,根据自己的体验和需求做出决策。选择适合自己的Linux发行版是一个个人化和主观的过程,最重要的是找到符合自己需求和喜好的发行版,让您在使用Linux系统时感到舒适和方便。
|
1月前
|
Ubuntu Unix Linux
玩机强化技能,动手安装Ubuntu Linux操作系统
(13)Ubuntu重启过程中,你将在关机画面中看到提示文字“Please remove the installation medium, then press ENTER:”,按下“Enter”键即可重启电脑。