您是不是需要一个实时操作系统来确保您的程序永远不会脱离 CPU?
Posted
技术标签:
【中文标题】您是不是需要一个实时操作系统来确保您的程序永远不会脱离 CPU?【英文标题】:Do you need a realtime operating system in order to ensure your program is never taken off the CPU?您是否需要一个实时操作系统来确保您的程序永远不会脱离 CPU? 【发布时间】:2021-04-20 03:59:57 【问题描述】:如果我要编写一个程序,并且我想保证程序永远不会看到一个实例,在它运行之后,它会从 cpu 中踢出,直到程序终止,我需要一个 RTOS 还是有一个在常规的 linux 操作系统上获得这种体验的方式。
示例: 假设我们正在运行一个无头 Linux 机器并以用户或 root 身份运行程序(例如从传感器读取 SPI 数据,侦听 http 请求),并且有理由相信除了与机器几乎没有其他交互单个独立脚本正在运行。
如果我想确保我运行的进程永远不会从我的 cpu 中移除,即使是片刻也不会错过有价值的传感器信息或传入的 http 请求,这是否需要实时操作系统来保持这种保证?
由用户/root 运行的程序的进程优先级是否足以不被启动? 是否需要一个实时操作系统来保证我们的程序永远不会见证它从 cpu 中启动的时刻?我知道需要实时操作系统来保证事件的硬限制和硬期限。我也知道,在常规操作系统上,由操作系统决定优先级和调度。
如果这是在错误的堆栈中,请告诉我。
【问题讨论】:
有一些方法可以满足您的需求。例如,如果你想不中断地读取 HTTP 响应,也许 DPDK 或 XDP 对你有好处。 我更笼统地说,非实时操作系统有可能保证在用户空间调用的程序可以保留在 cpu 上 一般来说,如果您在简单的桌面操作系统(如 linux 或 Windows)上“正常”运行应用程序,您将不会错过 SPI/网络 I/O 完成。您的应用有何不同? 如果您的应用正在等待 SPI/网络,为什么它需要 CPU?为什么会被“开打”?如果就绪线程数小于核心数,则不会出现 CPU 短缺,因此不会发生抢占。我不明白你的问题:( @MartinJames 如果我正在运行一个正在处理或记录来自 SPI 的数据的程序,并且我想确保我的程序永远不会离开 CPU,直到我告诉它这样做我需要一个 RTOS。本质上,问题是关于“您是否需要一个 RTOS 来确保在用户空间中调用的程序永远不会脱离 cpu” 【参考方案1】:您是否需要在固定的时间范围内对传感器读数采取行动?这个动作应该有多复杂?如果您只需要永远不会错过读数并且可以缓冲它们 - 只需在非实时设备和传感器之间添加微控制器或 FPGA。
此外,即使使用未打补丁的 Linux,您也可以确保一些软实时约束。您可以将进程固定到 CPU 并避免在其中使用任何系统调用 - 以 100% CPU 利用率代替旋转和轮询,然后内核可能永远不会触及它。确保进程二进制文件和所有动态库(如果有)都在 RAM 磁盘上(以避免分页)并禁用交换。
【讨论】:
我将更多地研究将进程固定到可能是关键的 CPU。在我提出的问题的情况下,我很好奇是否可以配置程序调用,这样您就可以保证它永远不会从 CPU 启动,这样您就可以继续读取有价值的数据,而不会错过常规操作系统上的重要读取。我发现在中间添加一个微控制器很有价值,并且在某种程度上更类似于实时系统 @KevinCrum '这样您就可以继续阅读有价值的数据,而不会错过常规操作系统上的重要读取' ??这就是中断、驱动程序、缓冲区、队列和线程的用途。为了可靠地处理 I/O,您不需要用户进程/线程“始终在 CPU 上”。现代抢占式内核的存在主要是为了获得良好的 I/O 性能。也许我还是不明白你的要求:(: 感谢马丁您的时间和想法。我想我提出的示例妨碍了有关确保进程在程序调用期间保持在 cpu 上的问题。 @MartinJames 一些传感器不会在没有先收到请求的情况下为您提供连续读数。这些请求需要以稳定的时间间隔发送。想想旋转编码器、IMU 等设备。您不能只是坐在那里等待它们填满您的 DMA 缓冲区,您必须以更复杂的方式进行交互。 另外,一般来说,如果您需要有保证的响应时间,实时系统不应该依赖中断和抢占式多任务。例如,在高频交易系统中,通常使用用户空间以太网,以 100% 的 CPU 利用率进行轮询,而不是等待中断。这消除了上下文切换的不可预测成本,并且几乎可以保证一旦有一个字节,您就会立即知道并能够立即对其采取行动。在微秒甚至纳秒计算的地方,它是无价的。以上是关于您是不是需要一个实时操作系统来确保您的程序永远不会脱离 CPU?的主要内容,如果未能解决你的问题,请参考以下文章