当另一个进程正在旋转以获取锁时中断处理器

Interrupt on a processor while another process is spinning for lock

我的代码中有一个自旋锁,由两个线程共享。当一个线程持有锁而另一个线程试图获取锁时,第二个线程将继续在处理器上旋转。那么如果线程正在为锁旋转的处理器发生中断会发生什么?

我使用 spin_lock() 获取锁而不是 spin_lock_irqsave() 因为我不想禁用本地处理器上的中断。

当我检查内核中spin_lock()函数的代码时,我发现默认情况下禁用抢占并且没有任何IRQ。所以我假设中断将优先于旋转线程。那么自旋锁是非睡眠锁的意义是什么?

So what will happen if an interrupt happens on the processor where the thread is spinning for the lock?

中断将会发生。没有理由不这样做。中断后 returns,进程将返回自旋。

So what will be the meaning of spin lock being a non sleeping lock?

这意味着,等待锁被释放的线程将运行一个紧密的循环检查锁状态,而不是进入休眠状态让其他线程使用处理器。

当线程由于请求不可用的资源或由于被抢占而让出处理器时,就会发生休眠。

对于持有自旋锁的线程禁用抢占(注意:不是正在自旋等待锁的线程)因为这对于持有自旋锁的线程来说是一场灾难自旋锁进入睡眠状态。想象一个有两个 CPU 的系统,其中一个线程持有一个锁,另一个线程在锁上自旋,第一个线程换出第三个线程,第三个线程也尝试获取锁。突然你有两个线程在旋转,系统将有效地停止,直到其中一个被换出。在最坏的情况下,系统会死锁。

自旋锁可以禁用中断,因为允许中断例程获取自旋锁。如果中断试图获取由同一处理器上的线程 运行ning 持有的自旋锁,则该处理器将被死锁。

这里是学习更多自旋锁的好资源。

http://www.makelinux.net/ldd3/chp-5-sect-5