linux内核--自旋锁的理解( 二 )

中断控制是按代码访问临界区的不同而在编程时选用不同的变体,有些API中有,有些没有 。
而抢占控制和自旋锁标志控制依据内核配置(是否支持内核抢占)和硬件平台(是否为SMP)的不同而在编译时确定 。如果不需要,相应的控制代码就编译为空函数 。对于非抢占式内核,由自旋锁所保护的每个临界区都有禁止内核抢占的API,但是为空操作 。由于UP系统不存在物理上的并行,所以可以阉割掉自旋的部分,剩下抢占和中断操作部分即可 。
【linux内核--自旋锁的理解】到这里其实就可以解释为什么我开始的实验现象和预想的完全不同了:
由于UP系统(在不配置CONFIG_DEBUG_SPINLOCK的情况下),根本就没有自旋锁控制的部分,多次获得自旋锁是可能的(这种编程本来就是错误的,只是我想看错误的现象而已) 。
对于其中的一点疑惑:
1、在有禁用中断的版本中,既然已经禁用了中断,在本处理器上就不会被打断,禁用抢占是否多余?
(1)禁用了中断可以避免因为中断引起的抢占调度,但是如果在自旋锁保护的临界区中存在 preempt_disable();和 preempt_enable();对 。这样在preempt_enable();就会引发抢占调度 。
(2)避免SMP系统中别的处理器执行调度程序使得本处理器的进程会被调度出去 。?????
对于这个问题我不是很确定,还有深入研究调度系统后才会有准确的答案 。




推荐阅读