Linux内核能做到硬实时吗?

短篇快速阐述一个问题。Linux内核可以做到硬实时吗?
不能?
为什么?
因为Linux从调度一个实时进程到该实时进程实际投入运行之间的时间不可控,因此无法给予有硬实时需求的可预期延迟


调度了一个实时进程,仅仅意味着它可以运行,并不意味着它实际运行了。两方面权衡,一方面调度一个进程说的是在该进程自己的立场上它可以运行了,另一方面,它能不能投入运行还要取决于当年正在运行的进程是否允许它立即运行,也即站在其它进程的立场上,是否同意RT进程运行。请看下面的例子:

这里写图片描述

进程A进入了一个spin lock保护的临界区,这意味着该CPU在current离开临界区之前无法发生进程切换了,但是并不阻止中断的发生,假设中断发生了,且在中断处理中唤醒了RT进程B,此时的B虽然是实时进程,但仍然不能运行,因为临界区不允许进程切换,中断结束,RT进程B待命,等待进程A离开临界区之后,立即投入运行!如果临界区很宽,那么RT进程B将会等待相当久的一段时间…

  那么如何对Linux内核增加硬实时保证呢?

  很简单,首先,将中断线程话,保证它不再占用任意上下文,这保证了即便是中断被RT进程抢占了,也不会连累无辜的被它占用了内核栈的进程,其次,将普通进程中使用的spin lock改成可以睡眠的mutex,这样就可以保证在唤醒RT进程后立即使其投入运行。Linux的实时补丁就是干这个的。


小Tips:
spin lock需要关中断吗?
如果中断程序中需要锁该自旋锁,那么只需要关掉本地中断即可。要明白,中断时针对CPU的,而自旋锁是针对一个标志位的,关掉了本地中断可以保证本地CPU不会再触动自旋锁的标识,但是其它CPU依然可以在锁的标志位上自旋等待,这并不会造成死锁,因为本地CPU总会释放锁的。

A:这皮鞋能便宜点吗?
B:不能,这个进价贵。
A:你不是人。

A:这鞋子能跳舞吗?
B:【呱唧,呱唧,….】
A:不一般,我喜欢,日泰皮鞋!

原文链接: https://blog.csdn.net/dog250/article/details/78373490

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Linux内核能做到硬实时吗?

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/407241

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午10:30
下一篇 2023年4月26日 上午10:30

相关推荐