Sat*_*urn 7 c linux-device-driver linux-kernel spinlock
我的代码中有一个自旋锁,它在两个线程之间共享.当一个线程持有锁而另一个线程试图获得锁定时,第二个线程将继续在处理器上旋转.那么,如果线程正在旋转锁定的处理器上发生中断,会发生什么?
我习惯spin_lock()拿锁而不是spin_lock_irqsave()因为我不想在本地处理器上禁用中断.
当我检查spin_lock()内核中函数的代码时,我发现默认情况下禁用抢占,而不是任何IRQ.所以我假设中断将优先于旋转线程.那么自旋锁是非睡眠锁的意义是什么?
那么,如果线程正在旋转锁定的处理器上发生中断,会发生什么?
中断将发生.它没有理由不这样做.中断返回后,该过程将返回旋转状态.
那么自旋锁是非睡眠锁的意义是什么?
这意味着,等待锁被释放的线程将运行一个紧密循环来检查锁状态,而不是进入休眠状态以让其他线程使用处理器.
休眠是当线程由于请求资源不可用或由于被抢占而产生处理器时发生的情况.
对于持有旋转锁的线程禁用抢占(注意:不是正在旋转等待锁的线程),因为对于持有旋转锁进入休眠状态的线程来说,这将是一场灾难.想象一个双CPU系统,其中一个线程持有一个锁,另一个线程在其上旋转,第一个线程被交换出第三个也尝试获取锁的线程.突然你有两个线程旋转,系统将有效地停止,直到其中一个被换出.在最坏的情况下,系统将陷入僵局.
自旋锁可以禁用中断,因为允许中断例程获取自旋锁.如果中断试图获取由同一处理器上运行的线程保持的自旋锁,则该处理器将处于死锁状态.
这是学习旋转锁更多信息的好资源.
http://www.makelinux.net/ldd3/chp-5-sect-5
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |