内核是抢占性的,即内核中的进程在任何时刻都可能停下来,以便另一个具有更高优先权的进程运行。
所以内核抢占代码使用自旋锁作为非抢占区的标记。
如果当前进程持有一个自旋锁,内核就不能抢占该进程。
内核抢占和SMP所面对的问题相同。
1. 可以通过preempt_disable() 来禁止内核抢占,每次调用都必须有一个相应的 preempt_enable().:
preempt_disable();
//临界区
preempt_enable();
2. 抢占计数 --- preempt_count()
preempt_count() 存放着被持有锁的数量 和 preempt_disable()调用次数。
如果计数是0,内核就可以进行抢占,如果为1 或更大的值,内核就不会进行抢占。
这个计数非常有用,它是一种对原子操作和睡眠都很有效的调试方法。