专栏名称: 智能车情报局
聚焦智能汽车关键技术与创新产品
目录
相关文章推荐
BioArt  ·  专家点评Nature | ... ·  2 天前  
BioArt  ·  Neuron | ... ·  2 天前  
gooood谷德设计网  ·  Aedas|深圳中冶大厦 ·  3 天前  
51好读  ›  专栏  ›  智能车情报局

自动驾驶背后的“大脑”——实时操作系统详解

智能车情报局  · 公众号  ·  · 2024-04-07 10:51

正文


智猩猩与智东西将于 4月18-19日 在北京共同举办 2024中国生成式AI大会 爱诗科技创始人王长虎,启明创投合伙人周志峰,Open-Sora开发团队潞晨科技创始人尤洋,「清华系Sora」生数科技CEO唐家渝,万兴科技副总裁朱伟,优必选研究院执行院长焦继超等40+位嘉宾已确认带来演讲和报告,欢迎报名。


先需要我们思考的是, 什么样的情况下,我们才需要实时系统

资源,还是资源

这里我要以我的亲身经历来举例,刚来自动驾驶公司的时候,为了调试方便,直接拿 了一台服务器放到车上做实验。一段时间之后,问题来了,有人分析了一个接管的问题,说是由于任务不能实时调度,导致车辆出现问题了。乍听起来好像挺有道理的,于是我决定一探究竟,上车,启动软件,分析服务器的性能问题,测试完成之后,我很震惊的回到了工位,久久不能平静。

大家都知道自动驾驶有定位、感知、规划、控制等几个模块,算上其它任务,充其量不过十几个线程,而问题在于车上服务器的核心算上超线程有30多个,也就是说, 即使一个任务一个核心也是足够的 ,还有十几个核心可以划水,事实也是如此车上的CPU占用率还不到20%,因此当听到有人说调度不及时的时候我是惊讶的。

真实情况如何呢

当然真实情况下,linux确实可能出现上述问题,这个我们后面再分析。但我想表达的是,如果一个系统负载非常低,只要操作得当,是不会有实时性问题的,例如一个快递工厂,有5个工人,每次只来3个包裹,那么明显这些包裹都可以及时处理,不会出现延误。


当然在人手紧张的情况下,有10个包裹,但是只有5个工人,假设现在新来了一个包裹,而且这个包裹的优先级很高,要及时送走,这时候就需要考虑实时性问题了。也就是说在 系统资源有限的情况下,我们才更需要考虑实时性问题,当系统资源非常充足,实时性问题没有那么紧迫。
再回到之前的问题,当优先级很高的包裹来了,这时候5个工人都在工作,那么怎么办呢?你可以打断1个工人,让他优先处理这个包裹,然后优先级高的包裹被实时发送出去了。

因此实时系统很重要的一个特性就是 任务能够被抢占 ,前面提到了资源受限,因此所有的工人极有可能都在工作,当优先级高的任务到来的时候,优先级高的包裹要优先保证调度,因此它能够抢占工人,让工人优先处理它。


支持抢占

上面的例子很好理解,大部分情况下,快件比普通件会优先处理,你也会优先收到快件,但操作系统还不一样,接下来我们来分析2种情况。


当2个线程要共同访问一段资源的时候,就会加上锁,来保证同时 只有一个线程占用这段资源 ,在访问结束之后,然后释放锁,其它的线程获得锁之后,就可以访问这段共享资源了。那么锁在实时系统中会出现什么问题呢?例如线程A是实时线程,线程B是非实时的,但是线程B抢占了锁,线程A激活之后,发现获取不到锁,因此陷入休眠,问题来了!!!本来实时线程的优先级比非实时线程的优先级高,但是由于锁,导致实时线程得不到调度,实时线程就不实时了,因此为了保证抢占, linux的实时内核引入了可以休眠的spinlock ,也就是说,当线程A发现B占用了锁,操作系统也可以让B休眠,从而执行线程A。

问题完美的解决了,但我又好奇sleep spin lock的实现,假设线程B已经获取了锁,实际上它是可以修改临界区的,这样即使线程A抢占了锁,但临界区的值已经改变,或者只改了一半,这时候我们怎么保证线程A获取数据的正确性呢?由于这里我们主要讨论实时性,关于sleep spin lock的实现咋们就暂且不表。

中断

中断的引入主要是为了提高外设的效率,例如键盘可能很久没有输入,如果让CPU不停的循环检测键盘是否有输入,会占用大量的CPU时间,而这样的外设有很多,例如串口、网口、USB、鼠标、键盘等等。于是操作系统就引入了中断机制,也就是说当 外设有消息要发送给CPU的时候,就触发中断,CPU接收到中断,然后根据中断号,执行不同的中断处理程序 ,例如串口的中断号是4,当串口收到消息的时候就触发中断4,CPU接收到了中断4,然后触发串口中断处理程序。

那么中断对实时性造成哪些影响呢?例如一个实时任务正在执行,这时候来了一个中断,CPU于是放弃当前任务,跳转到中断处理程序,中断处理完成之后,再接着处理之前的任务,系统也变得不实时了,也就是说中断也会导致实时性的问题。

解决问题的办法有2个, 一是绑定中断到其它的核心 ,而不要让中断均衡分布在所有核心之上,这样就不会因为中断而导致实时线程被打断;二是 修改中断处理机制 ,linux实时内核也是这么做的,由于原理我也没有详细看,这里也暂且不表。

优先级

最后,我们再回到之前的问题,当一个系统资源充足的情况下,大概率是不会出现实时性问题的,但锁和中断在极小概率的情况下,即使资源足够,也会导致实时性问题。当我们引入了优先级和抢占之后,可以解决上述问题,但是否就一定能够保证实时呢?

假设我们有5个任务,这5个任务的优先级一样,都是实时线程,那么新来了1个实时任务,由于优先级一样,它只能等待或者进行时间片轮转,这种情况下的实时性问题,还是需要增加资源,因为实时性不是银弹,一个很差的CPU,只要上实时系统就能都保证实时性,那么我们为什么还要不停的提高芯片的性能呢?

总结一下,实时性不是什么银弹, 而是在系统资源紧张的情况下(不能超出限度),实时系统通过支持抢占,能够保证优先级高的线程能够优先调度, 从而保证系统的实时性。

2024中国生成式AI大会预告


智猩猩和智东西将于4月18-19日在北京举办2024中国生成式AI大会(GenAICon 2024)。主会场将进行开幕式、大模型专场、AI Infra专场和AIGC应用专场;分会场将进行具身智能技术研讨会、AI智能体技术研讨会和中国智算中心创新论坛。欢迎报名参会~






请到「今天看啥」查看全文