实时内核要求与Linux实时化路径
1. 实时内核的常见要求
1.1 细粒度可抢占内核
实时行为要求系统能够尽早且恰当地对内部和外部事件做出反应。因此,实时内核需要能够尽快从低优先级上下文切换到需要关注的高优先级任务。这个切换所需的时间被称为抢占粒度,而等待重新调度发生的最长时间则定义了内核的最坏情况调度延迟。
早期的Linux 2.4系列通过不同的补丁来解决这个问题,在核心代码中引入了任务调度的机会。之前,新任务只能在内核上下文退出时才能被调度,也就是说,只要内核正在处理系统调用或其他用户空间请求所需的活动,就不会停下来让新任务运行。
Robert Love提出的可抢占内核支持是一种广为人知的方法,该方法在Linux 2.5开发阶段被合并到主线内核,现在是Linux 2.6的标准特性。它平均而言显著提高了可抢占性。然而,任务之间的并发仍然不理想,因为只要系统上的任何任务持有任何独占资源,内核抢占就会全局禁用,即使没有其他任务会竞争相同的资源。因此,只有平均延迟有所改善,最坏情况延迟仍然不符合硬实时要求。
用交通类比来说,就像是整个城市(Linux内核)只有一个交通信号灯(抢占禁用锁),每当有一辆车(任务)穿过城镇的任何一个十字路口(独占资源)时,就会阻挡所有车辆(任务)。解决这个限制的方法是让每个独占资源的获取和释放真正独立于其他资源,这也是PREEMPT_RT努力的一个基本方面。
1.2 严格执行任务优先级
即使有了细粒度可抢占内核,被抢占的低优先级任务可能会持有独占资源很长时间,导致请求相同资源的高优先级任务严重延迟,这就是优先级反转的例子。由于独占资源遍布Linux内核,遇到优先级反转