【前言】
同一个功能/命令从发起到执行的时间,在不同的场景和平台上可能会产生很大的差异,这个差异性可以称之为时效性。时效性影响着决策的生效时间,也决定了决策在特定时间内是否有效。进而在嵌入式领域中,不但要强调速度快(相比之下时效性更优异),还要求有时间上的确定性。
本文将聚焦嵌入式场景应用,分享一些目前业内关于操作系统的硬实时技术。
【实时性】
操作系统分为实时操作系统和分时操作系统,对于分时操作系统来说,计算机资源会平均地分配给系统内所有的任务,各项任务需要花多长时间来完成并不重要;而在实时操作系统之中,需要确定每个任务在多长时间内可以完成。所以,实时和分时操作系统最大的不同在于 “时限”这个概念。
显然很多应用场景都需要满足时限的需求,比如炎热的夏天,我们在车内开了空调,总会希望马上就出风,而对于某些安全性更高的操作,比如安全气囊,更是不能有丝毫的耽误。所以实时系统就是要保证“正确的时间完成正确的事”。
继而有了硬实时和软实时的概念,顾名思义硬实时系统就是有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误,比如前文提到的安全气囊,哪怕晚打开1秒钟,都会影响到生命安全。但软实时相比硬实时则可以允许稍微超出规定的时间,比如手机刷剧偶尔的声音画面延迟毕竟不会危害到生命安全。
细心的朋友可能会问,所谓的“正确的时间”是多久?答案是不确定的。比如要点亮一个LED灯,运行到这个指令的时候有些其他的中断产生,到执行这个命令的时候就产生了一些延迟,有的程序延迟10ms,有的延迟1ms,有的10us。
如果需求是最多2ms内必须执行,那10ms的是软实时,1ms和10us的是硬实时。如果需求是最多20us内必须执行,那10ms和1ms的是软实时,10us的是硬实时。所以软硬实时得看具体需求。
那么想要做到真正的硬实时一定是“越快越好,而且是没有最快只有更快”,与此同时还要在更快的时间内做“正确的事”。所以分时也好,软实时、硬实时也罢,他们的区别,其实并不是单纯以速度为标准的,而是还需要结合确定性的概念。
那么如何在正确的时间内保证确定性?接下来我们分享一些行业内的技术研究。
【操作系统硬实时技术研究】
1、自旋锁可抢占、可睡眠
自旋锁是多核操作系统设计中是最重要的一种数据保护机制。但是在传统操作系统实现中,自旋锁在保护数据临界区时,等待获得自旋锁的CPU核会自旋忙等,这对于低延迟的数据操作有很大的性能提升效果,但是对实时运行任务的实时性有很大影响。同时,自旋锁在临界区范围内,会关闭抢占,这进一步降低了系统实时性。因此在强实时性操作系统设计时,必须要对传统自旋锁的实现进行优化改造,需要设计并实现可高优先级抢占和可睡眠的的自旋锁。
2、中断线程化
中断在操作系统的设计中也至关重要,中断的优先级比进程高,一旦中断进入系统,无论是普通进程还是实时进程,都会被中断处理程序打断。如果在中断上下文处理任务较多就会对实时进程造成不确定性影响。为了解决这些实时性相关问题,在中断顶半部的设计中,则可以引入中断线程化的机制。在新的机制中,中断虽然还会打断实时进程,但中断处理程序所执行的操作仅仅是唤醒中断线程,原本的中断服务程序主体放到一个内核线程中延迟执行,这样中断执行的速度就很快也很确定,实时进程被打断后可以迅速再次运行,而中断服务程序会在实时进程挂起之后被系统调度执行。
3、优先级反转及优先级继承
对于强实时操作系统的一个基本要求就是基于优先级的抢占系统。保证优先级高的线程在“第一时间”抢到执行权,是实时系统的第一黄金准则。但是这种基于优先级抢占的系统,有一个可怕的情况要关注,就是“优先级反转”(Priority Inversion),简单来说,就是有低优先级的线程占据了CPU,阻塞了高优先级线程的执行。“优先级反转”是几乎每一个实时操作系统的噩梦,因此在操作系统产品的开发过程中,需要确保有效解决和防止优先级反转问题;解决优先级反转的基本手段,是引入优先级继续协议。
传统服务器操作系统为了保证吞吐量,一般不会实现优先级继续协议,因为优先级继续协议会对系统吞吐量有一定影响。而在汽车操作系统中,实时性的需求优先级更高,因此引用优先级继续协议以提升系统整体实时性。
4、增加调度点:中断返回+开抢占
操作系统的调度点的多少,明显会加速高优先级任务的抢占时间,能够有效的提升基于优先级可抢占调度策略任务的实时性;
5、任务迁移数量限制
在多核操作系统设计中,负载均衡技术对于高效利用cpu资源是非常重要的,但是在负载均衡时,一次性迁移过多的任务,会导致系统长时间持有调度相关的锁,影响实时任务的及时调度,降低系统整体实时性。因此合理的设计负载均衡中任务迁移的数量和算法有非常重要的作用。
6、进程切换优化:延迟进程堆栈清理等
操作系统进程切换过程中,会对切换出去的进程进行寄存器、栈空间等的维护工作,这些工作执行的时间明显对下一个进程被调度的时间有着明显的延迟作用,因此对相应工作的延迟操作,对cpu进程切换的速度有着明显的提升效果。
延迟清理进程堆栈的负责影响是会延迟释放进程堆栈占用的内存,但是在汽车操作系统中,不会频繁的进行进程创建、退出操作,并且进程数量可控,系统内存也不是现代计算机的瓶颈,因此这样的优化措施并不会带来明显的副作用。
7、延迟抢占
操作系统设计过程中需要解决不必要的无效抢占,无效的抢占对cpu上下文切换会带来巨大的消耗,对实时性、确定性有很大的影响;
8、强隔离技术
强实时操作系统都是基于优先级的调度策略,从而来保证实时性要求高的任务得到优先调度,但是在实际的应用中会发现,存在中断或者存在多个高优先级任务的情况不在少数,同样会对操作系统的关键任务的实时性和确定性有一定的干扰,因此在设计操作系统过程中,具备这种实时性干扰识别和关键任务和中断的隔离技术也显得非常重要。
【结语】
国科础石致力于打造完整的“操作系统内核+中间件”基础软件整体解决方案及覆盖汽车软件开发全生命周期的软件工程工具产品。在操作系统领域,实时性的提升也是重要的课题之一,为此我们推出了基于开源Linux版本进行实时性提升的础光Linux产品。与此同时,我们也会平衡好系统性能、易用性,可靠性,安全性等其他维度,力求打造出更满足行业需求的产品。
后续小编也会继续分享更多层面的技术研究,想要了解更多础光Linux产品可参看往期内容或登录开源社区。
往期内容
础光操作系统开源社区:
https://gitee.com/kernelsoft