2017-03-27 54 views
5

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

我已经使用spin_lock()来取锁而不是spin_lock_irqsave(),因为我不想在本地处理器上禁用中断。

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

+1

在中断服务程序返回后它会继续旋转吗? – joop

回答

5

那么如果在线程正在旋转锁的处理器上发生中断会发生什么?

中断发生。没有理由不这样做。中断返回后,该过程将回到旋转。

那么自旋锁是一个非睡眠锁的含义是什么?

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

睡眠是当线程产生处理器时发生的事情,或者是由于请求的资源不可用或由于被抢占而造成的。因为这将是一个线程持有自旋锁去睡觉灾难:

占先为持有自旋锁(线程正在旋转等待锁注)线程关闭。设想一个双CPU系统,其中一个线程持有一个锁,另一个线程正在旋转,第一个线程换出第三个线程,该线程也尝试获取该锁。突然你有两个线程在旋转,系统将有效停止,直到其中一个线程被换出。在最坏的情况下,系统会死锁。

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

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

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

+0

您是否意味着当有中断时,ISR将被执行,并且自旋线程将不能在该处理器上旋转?如果是,那么当ISR(中断服务程序)执行时,那个旋转线程的状态是什么?感谢上述答案,这个后续问题将完成我的查询。 – Saturn

+0

中断会发生什么情况是正在运行的线程跳转到中断服务例程,当ISR完成时,它将返回到正在运行的线程中之前的位置。即它恢复旋转。 – JeremyP

+0

ISR执行时有关线程状态的任何想法? – Saturn

相关问题