linux 内核抢占分析
在 Linux 2.6 以后版本的 Linux 内核中,一个内核任务可以被抢占,从而提高系统的实时性。这样做最主要的优势在于,可以极大地增强系统的用户交互性,用户将会觉得鼠标单击和击键的事件得到了更快速的响应。
Linux 2.6 以后的内核版本还是存在一些不可抢占的区间,如中断上下文、软中断上下文和自旋锁锁住的区间,如果给 Linux 内核打上 RT-Preempt 补丁,则中断和软中断都被线程化了,自旋锁也被互斥体替换,Linux 内核变得能支持硬实时。
如下图所示,左侧是 Linux 2.4,右侧是 Linux 2.6 以后的内核。在 Linux 2.4 的内核中,在 IRQ1 的中断服务程序唤醒 RT(实时)任务后,必须要等待前面一个 Normal(普通)任务的系统调用完成,返回用户空间的时候,RT 任务才能切入;而在 Linux 2.6 内核中,Normal 任务的关键部分(如自旋锁)结束的时候,RT 任务就从内核切入了。不过也可以看出,Linux 2.6 以后的内核仍然存在中断、软中断、自旋锁等原子上下文进程无法抢占执行的情况,这是 Linux 内核本身只提供软实时能力的原因。
上文摘抄自《Linux设备驱动开发详解:基于最新的Linux 4.0内核》
说一下自己的理解:
从上图可以看出(从左往右看),普通任务执行了系统调用,系统调用进入了irq1任务,irq1任务进入了irq2任务,当irq2任务完成后,在唤醒rt任务时,2.4需要等待系统调用完成,而2.6中是立即运行的,这说明rt任务和系统调用在同时竞争cpu的使用权,并且还竞争过了获得了cpu的使用权
所以2.6中是将系统调用和rt任务放在了同一水平面,而不是像2.4 ,默认系统调用优先级比rt任务高
如果将系统调用比作中断服务函数,那么这个是不是就是中断的线程化。