2013-08-24 47 views
10

在ULK的第5章笔者状态如下:每个中断处理程序都需要自旋锁吗?

” ......每个中断处理程序序列化相对于本身,也就是说,它不能执行多个并发因此,访问数据结构。不需要同步原语“

我不明白为什么中断处理程序在具有多个内核的现代CPU上”串行化“。我想可能同一个ISR可以同时在不同的内核上运行,对吧?如果是这样的话,如果你不使用自旋锁来保护你的数据,它可能会出现竞争状态。

所以,现代系统与多个CPU上,每一个中断处理你会写会读&写一些数据,是自旋锁总是需要我的问题?

回答

7

执行中断处理程序时,内核明确地禁止中断控制器中的特定中断线,因此一个中断处理程序不能同时执行多次。如果关键数据的B/W的中断处理程序和您的过程(可能是一个内核线程)共享(的其他中断处理程序可以同时运行,虽然)。

+0

我认为,它只会对执行该处理程序的CPU禁止中断,但对其他CPU禁止该中断。是对的吗? – Eugene

+1

它在中断控制器上禁止中断线本身。在同一CPU上的其他*中断是否被禁用是体系结构特定的。 –

-1

,那么你需要保护你的数据,因此自旋锁是必需的。自旋锁的常见内核API是:spin_lock()。 这些api也有变体,例如spin_lock_irqsave(),它可以帮助避免了同时获得一个可能面临的僵局问题/保持自旋locks.Please经过以下链接找到对象的细节: http://www.linuxjournal.com/article/5833

+0

-1:要么解释为什么在这里需要'spin_lock_irqsave',或者放弃它。无论如何,它并不回答这个问题。 –

4

澄清:根据CL。下面的注释 - 内核确保不会触发中断处理程序为相同的中断但是如果您有多个注册中的相同中断处理程序多个中断比下面的答案是,我相信是正确的。

你是对的,相同的中断处理程序可以在多个核心上同时运行,并且共享数据需要被保护。然而,自旋锁不是唯一的,当然也不总是推荐的方法。

许多其他同步方法(从每个CPU数据),只使用原子操作访问共享数据,甚至读取 - 复制 - 更新变体可用于保护共享数据。

+2

这是错误的;内核明确地阻止相同的中断处理程序在多个内核上同时运行。当仅从中断处理程序访问数据*时,仅当不同处理程序共享相同数据时才需要锁定。 ULK是正确的;和[LDD](http://lwn.net/Kernel/LDD3/)是正确的(“你将永远不会看到两个处理器同时处理相同的IRQ”,第10章)。 –

+0

@CL。我可能解析了这个问题,但我认为他是在不同的内核上询问相同的中断*处理程序*,而不是针对相同的中断。 我知道内核阻塞了中断线,但是AFAIK明白没有什么能够阻止同一个中断处理程序被多次注册,如果它被注册来处理不同的中断。 – gby

+0

@gby明白了你的观点。谢谢! – Jun

0

中断处理程序中不总是需要自旋锁。

请首先注意一件事 - 当中断控制器上发生特定设备的中断时,该中断在中断控制器处因此在该特定设备的所有内核中被禁用。所以,同一个设备的中断不能同时出现在所有的CPU上。 所以在正常情况下,不会因为代码不可重入而需要任何自旋锁。

尽管在中断处理程序中需要使用哪种自旋锁,但有两种情况。

  1. 请注意,当中断来自设备和IRQ线,即内核禁用该内核的所有其它中断,也为其他核心也该设备中断。来自其他设备的中断可能会在其他内核中出现。

因此,可能出现这样的情况,其中针对不同设备注册了相同的中断处理程序。例如: request_irq(A,func,..); reqest_irq(B,func,..);用于设备的 调用中断处理函数func。设备B的 调用相同的中断处理函数func。 因此,在这种情况下应该使用自旋锁来防止升高状况。

  1. 当在中断处理程序中使用相同的资源时,还有一些在进程上下文中运行的其他代码。 例如: - 有资源A 因此,可能会出现这样的情况:一个内核在中断模式下运行,中断处理程序正在修改资源A和其他核心在进程上下文中运行,并且也在修改某些资源其他地方。 因此,为了呈现该资源的提升条件,我们应该使用自旋锁。
相关问题