日期:2014-05-16 浏览次数:20691 次
Linux2.6以后支持内核抢占,在开发过程中内核抢占经常会造成一些竞态问题,分析起来比较麻烦,所以有必要总结一下触发抢占的因素和时机。
一、触发抢占的因素
1、进程调用sleep或exit等函数进行状态切换,这些函数通过系统调用进入内核会主动调用schedule。
2、在时钟中断处理程序检查到进程时间片用完,置位need_resched。
3、在中断处理程序或者系统调用中主动调用schedule。
4、在中断处理程序或者系统调用中由于唤醒等动作导致更高优先级的进程进入就绪状态,设置need_resched标志。
5、在中断处理程序或者系统调用中主动置位need_resched。
二、抢占发生的时机
1、在中断处理或系统调用完成后,返回用户态或内核态时检查到need_resched被置位,发生抢占。
2、在相关操作的调用点触发schedule直接被调用,从而发生抢占。