linux 内核自旋锁
在kernel中获取自旋锁之前都要先禁止内核抢占,请问这是为什么?如果不禁止,会有什么后果?
个人觉得后果是,如果不禁止,内核可以抢占,当前进程获取锁是原子的,所以获取锁成功,然后,此时如果来了一个中断,CPU停下手中的活去处理中断,中断返回后,如果内核可以抢占,不排除有跟高优先级的进程在这个时候抢占cpu,如果这样的情况发生,并且此更高优先级的进程也要用到我们最初使用的锁,那么这个时候因为锁已经我们之前的进程获取则,这个更高级的进程实际上强占了cpu也没有用,由于锁的原因,它还得放弃锁,待调度器重新调用到我们之前的进程并且此进程释放锁之后,它才能继续往下走,所以,本人觉得,获取自旋锁之前禁止内核抢占只是出于效率,免得重新调度考虑,也不会有什么严重错误出现吧,请各位方家指正,如有错误,请各位不吝赐教,分析一下这种情形!谢谢!
[解决办法]
单核CPU没什么问题,主要是多核的情况下,如果不禁止抢占,会被调度到别的cpu上,带来缓存miss的问题,另外,spinlock实现基于特定的体系架构,在忙等获取锁的时候,都会锁住memory bus, 如果进程上下文被改,可能会有pagefault的错误。
[解决办法]
这样给你举个例子,比如你现在使用的自旋锁LOCK1,如果你不在获取自旋锁之前进程禁止内核抢占,那么当你获取这个自旋锁LOCK1后,当发生了一个内核抢占,假如这个内核抢占代码也是获得一个自旋锁LOCK1,那么就会处于饥渴导致的死锁状态
[解决办法]