另一个进程在旋转锁定时处理器上的中断
问题描述:
我的代码中有一个自旋锁,它在两个线程之间共享。当一个线程持有锁而另一个线程试图获得锁时,第二个线程将继续在处理器上旋转。那么如果在线程正在旋转锁的处理器上发生中断,会发生什么?另一个进程在旋转锁定时处理器上的中断
我已经使用spin_lock()
来取锁而不是spin_lock_irqsave()
,因为我不想在本地处理器上禁用中断。
当我在内核中检查spin_lock()
函数的代码时,我发现默认情况下禁用抢占并且没有任何IRQ。所以我认为中断将优先于纺线。那么自旋锁是一个非睡眠锁的意义是什么?
答
那么如果在线程正在旋转锁的处理器上发生中断会发生什么?
中断发生。没有理由不这样做。中断返回后,该过程将回到旋转。
那么自旋锁是一个非睡眠锁的含义是什么?
这意味着,等待要释放的锁的线程将运行一个严格的循环来检查锁状态,而不是让其他线程使用处理器进入休眠状态。
睡眠是当线程产生处理器时发生的事情,或者是由于请求的资源不可用或由于被抢占而造成的。因为这将是一个线程持有自旋锁去睡觉灾难:
占先为持有自旋锁(不线程正在旋转等待锁注)线程关闭。设想一个双CPU系统,其中一个线程持有一个锁,另一个线程正在旋转,第一个线程换出第三个线程,该线程也尝试获取该锁。突然你有两个线程在旋转,系统将有效停止,直到其中一个线程被换出。在最坏的情况下,系统会死锁。
自旋锁可以禁用中断,因为允许中断例程获取自旋锁。如果中断试图获取由运行在同一处理器上的线程持有的旋转锁,则该处理器将会死锁。
这里是学习更多关于自旋锁的好资源。
在中断服务程序返回后它会继续旋转吗? – joop