我的代码中有一个自旋锁,它在两个线程之间共享。当一个线程持有锁而另一个线程试图获得锁定时,第二个线程将继续在处理器上旋转。那么如果在线程旋转锁定的处理器上发生中断会发生什么呢?
我使用spin_lock()
来取锁而不是spin_lock_irqsave()
,因为我不想在本地处理器上禁用中断。
当我检查内核中spin_lock()
函数的代码时,我发现默认情况下禁用抢占,而不是任何IRQ。所以我假设中断将优先于旋转线程。那么自旋锁是什么意思是非睡眠锁?
答案 0 :(得分:6)
那么如果在线程正在为锁定而旋转的处理器上发生中断会发生什么?
中断将会发生。没有理由不这样做。中断返回后,该过程将返回旋转状态。
那么自旋锁是什么意思是非睡眠锁?
这意味着,等待释放锁的线程将运行紧密循环来检查锁状态,而不是进入休眠状态以让其他线程使用处理器。
休眠就是当一个线程由于请求资源不可用或由于被抢占而产生处理器时发生的事情。
对于持有旋转锁的线程禁用抢先(注意:不正在旋转等待锁定的线程),因为对于持有自旋锁的线程来说,这将是一场灾难睡觉。想象一个双CPU系统,其中一个线程持有一个锁,另一个线程在其上旋转,第一个线程被交换出第三个也尝试获取锁的线程。突然你有两个线程旋转,系统将有效地停止,直到其中一个被换出。在最糟糕的情况下,系统将陷入僵局。
自旋锁可以禁用中断,因为允许中断例程获取自旋锁。如果中断试图获取由同一处理器上运行的线程保持的自旋锁,则该处理器将处于死锁状态。
这是学习旋转锁更多信息的好资源。