车载诊断技术 发表于 2023-2-27 22:34:26

车载软件的核心:操作系统关键技术---实时任务调度解析

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。
老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:

物质的贫穷能够摧毁你一生的尊严,精神的贫穷能够耗尽你几世的轮回。人生没有白走的路,没有白读的书。你触碰过的那些文字,会在不知不觉间帮你认识这个世界,会悄悄帮你擦去脸上的肤浅和无知。虽然读书不一定让你功成名就,不一定让你前程锦绣,但它能让你说话有道理,做事有余地,出言有尺度,嬉闹有分寸,读书和赚钱是人生最好的修行,前者让人不惑,后者让人有尊严。

本文主要分享关于车载操作系统中关键技术——车载软件的核心:操作系统关键技术实时任务调度解析。
实时任务调度技术
在汽车应用领域,不可避免地要应对两类实时任务。
一类被称为硬实时任务,这类任务无论在什么样的情况下都必须在规定的截止时间内执行完毕,否则会造成不可接受的后果(如因碰撞传感器引发的安全气囊弹出);
另一类为软实时任务,这类任务也规定了严格的截止时间,但是偶尔超过了时间门限也不会引发严重的后果,如触摸屏交互,即使反应时间超限导致应用体验不好,也不会酿成安全事故。
实时任务又可分为周期性任务,偶发任务(通常是硬实时)和非周期任务(通常是软实时)。无论是哪种车用操作系统,都面临着多个软硬实时任务(进程 / 线程)同时争夺有限资源的问题,需要操作系统内核提供合适的调度机制来满足硬实时任务截止时间要求,在此基础上,还需要满足其他系统和应用指标(周转时间,资源占用效率)。操作系统内核的任务调度机制通常可分为两大类 - 抢占式和非抢占式。
-> 1、非抢占调度方式是指当一个低优先级任务获得了处理器执行资源后,即使内核知道有更高优先级的任务在等待处理器资源,仍然会让这个低优先级任务继续执行,直到当前任务完成或发生某种事件而进入阻塞态时,才会把处理器资源分配给当前最高优先级的任务。虽然这种调度方式比较简单,但它不适合于分时系统,也不适合于实时系统。

-> 2、抢占式调度方式是指当一个低优先级任务正在处理器上执行时,如果有更高优先级的任务出现需要使用处理器资源,内核会立即暂停正在执行的任务,将处理器资源分配给当前更高优先级的任务。这种方式对提高系统的实时性和响应效率有明显的好处,但也要遵循一定原则,否则可能因为频繁切换任务而降低处理器效率,或者让低优先级任务等待时间过长影响系统整体性能
很显然,车用领域的操作系统内核都必须支持基于任务优先级的抢占式调度方式。内核任务调度系统设计的核心是如何为每个任务定义合适的优先级,以保证包括任务截止时间在内的各项系统性能指标都能得到满足。

为了简化系统设计,有的简要架构系统(如 uC/OS-II)甚至规定所有任务的优先级都不同,任务的优先级也同时唯一标识了该任务本身,但在复杂系统下这个方法不太适用。
通常我们会将系统中所有的任务按照一定的优先级定义划分为若干个不同优先等级的多级队列(Multi-Level Queue,MLQ,优先级相同的任务放在一个队列中,高优先级任务队列优先得到服务,当高优先级队列为空或阻塞时,低优先级队列才能得到服务。此外,还需为每个任务队列采用合适的任务调度策略来决定哪个任务该优先获得资源(一般会采用FIFO和RR机制)。MLQ方法中,系统性能表现主要依赖于对任务优先级的合理定义。

针对 MLQ 调度策略可能带来的低优先级任务饥饿(长时间得不到服务)和优先级反转问题(高优先级任务所需资源被低优先级任务锁住),又出现了多级反馈队列(Multi-level Feedback Queue,MLFQ)调度机制,这一机制采取了动态调整任务优先级的策略,MLQ机制的基础上采用了短任务优先级策略,同时还会对任务的运行时间做评估,即统计每个任务已经执行了多长时间,并据此判断此任务是长任务还是短任务,然后调整对应任务的优先级,被判断为长任务的优先级会被逐次调低。为避免低优先级任务长期得不到服务,还可以定时/不定时将所有任务优先级提到最高,再根据任务实际运行长短动态逐渐调整优先级。
对于周期性实时任务,除了上述 MLQF 方法外,还可使用速率单调(Rate-Monotonic, RM)策略。这种策略是要预先知道任务的周期,并根据周期静态地为每个任务分配一个优先级:任务的周期越短,意味着截止时间要求越迫切,优先级越高。RM 策略还可以支持抢占式调度,高优先级的任务可以抢占低优先级的任务。此外,RM 也可以引入动态优先级变化机制,增加调度策略的调度能力。RM 方法由于优先级固定,实现简单,带来的任务时延固定,成为解决周期性实时任务最佳策略。
在实时性任务调度中,还可以采用最早截止时间优先(Earliest Deadline First, EDF)策略。这种策略和 RM 类似,只是该策略是根据任务的截止时间来动态分配任务优先级。
另外,还有一种分区调度机制,该机制将处理器算力按一定比例分隔成几个区(比如 70%,30%),然后把不同线程分到这些分区里按上述调度策略进行调度。当分区里的处理器资源预算被用完以后,该分区里所有可执行线程都会被 “停住” ,直到预算恢复。为了提高处理器利用率,降低分区资源的空置率,同样可以采取 “自适应分区调度” 机制来改进调度性能,即定时计算各分区的算力闲置情况,在分区算力有富裕时,“自适应” 允许把多出来的算力 “借给” 需要更多算力的分区。
需要指出的是,内核硬实时调度机制只是支撑硬实时任务的一部分,整个任务的实时性还需要依赖于应用本身的设计,例如在 AUTOSAR CP 中还提出了通过将应用和 CPU 核(多核情况下)绑定,禁止动态分配内存的方法来保证应用运行的确定性。
总之,从技术发展趋势看,上述的这些基于优先级的抢占式进程调度机制通过一定程度的 “动态”优化,都能很好地在满足硬实时任务的截止时间要求的基础上,照顾到软实时业务和其他非实时业务的性能需求,达到系统最优化,因此在现有的简要架构、宏内核以及微内核架构中都被广泛支持。
搁笔分享完毕。
愿你我相信时间的力量,
做一个长期主义者!

页: [1]
查看完整版本: 车载软件的核心:操作系统关键技术---实时任务调度解析