编写实时进程需要满足的条件:

1. 进程采用实时调度策略以及实时优先级 

2. 锁内存,确保不会出现缺页错误从而不能满足实时性需求

3. 预分配堆栈,防止堆栈错误导致实时性得不到满足 

参考资料 :

https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO#A_Realtime_.22Hello_World.22_Example

http://lwn.net/Articles/146861/

http://www.ibm.com/developerworks/cn/linux/l-rcu/

linux实时补丁 RT patch:

1、将中断转化为线程

上半部的工作:IRQ

下半部的工作:内核线程,tasklet,softirq

softirq:内核会唤醒一个ksoftirqd线程 ,RT patch让所有的softirq运行于ksotfirq线程下。存在问题:所有的softirq都具有一样的优先权,而且每个cpu只有一个线程在处理这些softirq。

tasklet:区别于softirq。同一个softirq可以同时运行在两个不同的cpu之上,而tasklet不能。所以,tasklet必须使用上锁机制,以防止任何全局数据或者其他资源的并行存取,而tasklet不必这么做;换言之,tasklet不必是可重入的。

内核线程:开销比tasklet和softirq大。在非实时内核中,softirq和tasklet无法被具有任何优先级的任何线程抢占。所以采用内核线程的操作将更加灵活。

2、将硬件中断请求转换为线程

硬件“中断请求”:是一种会随附IRQ的中断,它的持续时间是从中断抢占cpu到ISR返回到cpu进行正常的处理。显然我们无法避免硬件中断抢占cpu,但是RT patch将优先权逆转的时间缩短到最低限度。当一个中断被触发时,ISR所做的事情就是屏蔽中断线以及唤醒中断服务线程。

3、中断与cpu亲和性

一个IRQ线程的cpu亲和性由中断本身的cpu亲和性决定。所以,如果想要设定中断服务线程的亲和性,只需要设定中断的亲和性。在中断被触发之前,线程的亲和性不会被更新为中断的亲和性。

#cat /proc/irq/XX(irq number)/smp_affinity

可以使用taskset设置或者查看cpu的亲和性

# taskset -p pid

#taskset -p cpumask pid