1.实时系统的概念
1.1什么是实时操作系统
什么是实时操作系统?接触过嵌入式的小伙伴可能会知道,实时操作系统是指在嵌入式领域广泛应用的各类RTOS(Real Time Operating System)。其中最具代表性的有国外的μC/OS-III、FreeRTOS、Vxworks等,国内的代表有RT-Thread和LiteOS。
在这些众多的RTOS系统里面既有开源的也有商业的,同时还有一些是行业专用的,比如enea公司推出的OSE系统就是通信行业早期的基站设备应用比较广泛的系统。无论是开源或是商业,这类系统都有一个最显著的特点,就是它们都具有很高的实时性。也是因为这个特点,它们都被集中应用在了嵌入式领域,特别是工控领域,例如工业制造控制、导弹飞机导航、电力设备监控等。历史上有很多著名的航空航天设备都使用到了实时的操作系统。比如登陆火星的凤凰号、好奇号火星探测器,它们所采用的操作系统就是美国WindRiver公司推出的Vxworks。那什么是系统的实时性呢?Linux系统在嵌入式领域也有大量使用,那Linux系统支不支持实时性呢?
1.2 Linux实时性、软实时和硬实时
实时性指的是一个操作系统能够在规定的时间点内完成指定的任务操作,一旦超过这个时间点会对整个系统带来不可估量的后果。与此相对的是一般操作系统,它更注重用户体验,系统偶尔卡顿不会给用户带来灾难性后果。实时性反映了一个系统行为控制的精准能力,具体体现在定时器的精准度高,中断响应及时以及系统的行为固定且可预估等。Linux系统最初是按照分时系统设计并推出的,再加上在历史版本中使用的调度算法目的是公平的分配和使用各种系统资源,保证CPU被各个进程公平的使用,所以早期并不支持实时性。但是在后来的2.6版本开始,加入了内核抢占的功能,使它的实时性得到了提升,在某种程度上具备了软实时的能力。软实时指的是系统对于时限要求并不是十分的严格,在一些情况下允许系统超限完成。举个例子,我们在PC机上使用鼠标操作,偶尔会出现卡顿延迟,这种情况除了让我们抓狂影响使用体验之外并不会给我们带来严重的影响,大家平时在使用电脑时遇到鼠标图标转圈圈同时界面不响应操作就是一个例子。再比如视频信号采集,偶尔丢失几个数据帧,并不会对视频最后的播放带来严重的画面缺失。但是硬实时就不一样,它对操作系统的行为有着严格的时限要求,超出时限往往会带来灾难性后果。比如在我们日常生活中使用的汽车都配备了安全气囊,汽车在发生激烈碰撞时可能会在0.2s内停下,那就要求气囊在0.02s内充气完毕并弹出,超出这个时间乘客可能就会面临生命危险。再比如导弹防御系统,当敌方导弹来袭时拦截系统必须做出100%的精准反应并计算出弹道轨迹进行拦截,稍有延迟就会造成拦截失败,这种后果是不可接受的。这就是硬实时系统和软实时系统的区别。但是由于Linux系统内核过于庞大且模块众多,内核中仍然有不少影响实时性的因素,比如使用大量自旋锁、中断禁止、时钟粒度等,使其距离 us 级别的控制精度还有很大的距离。 但是也不能因此认定Linux系统今后就不能用于实时控制领域。
其实Linux内核一路发展过来,在历史的版本主线中仍然有很多技术公司或者大牛为了提升Linux系统的实时性而努力着,他们或是在某个版本上发布实时补丁,或是对内核进行一定程度上的改造,具体的代表有RTLinux、RTAI(Real-Time Application Interface)和Xenomai等。RTLinux全称叫做AReal-Time Linux,它由美国新墨西哥矿业及科技学院的V. Yodaiken开发。RTLinux采用了双内核的做法,可以说是开创了双内核法的先河。简单理解就是系统中存在两个内核,