首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

linux 内核自旋锁解决方法

2013-01-06 
linux 内核自旋锁 在kernel中获取自旋锁之前都要先禁止内核抢占,请问这是为什么?如果不禁止,会有什么后果?

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

[解决办法]
这样给你举个例子,比如你现在使用的自旋锁LOCK1,如果你不在获取自旋锁之前进程禁止内核抢占,那么当你获取这个自旋锁LOCK1后,当发生了一个内核抢占,假如这个内核抢占代码也是获得一个自旋锁LOCK1,那么就会处于饥渴导致的死锁状态
[解决办法]

引用:
这个怎么会死锁啊,顶多是效率不高,内核抢占代码会由于获取不到锁而放弃处理器的呀,这本来就是自旋锁的设计理念。楼上说的不对吧!谢谢!请指教!

说的感觉有点道理,但自旋锁本身也就是会不断的去获取锁,如果这里是用的不禁止中断的方式获取自旋锁锁,应该不会导致死锁,还是会被调度器调度出去,但是多核就不清楚了,可能会出问题。会有效率损失,但严重点就会导致崩溃了。如果这里是用的禁止中断的方式获取自旋锁,那就一定会发生死锁,因为之前的那个线程获取了锁,现在这个线程获取不到锁然后还关了中断,调度器不能调度到之前那个线程,之前那个线程等待调度器调度它,而这个线程等待之前那个线程释放自旋锁,这样就形成了死锁。

热点排行