每个中断处理程序都需要自旋锁吗?

时间:2013-08-24 17:55:11

标签: c linux linux-kernel

在ULK的第5章中,作者声明如下:

  

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

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

所以我的问题是,在一个具有多个cpu的现代系统上,对于你要编写的每个中断处理程序,它将会读取&写一些数据,总是需要自旋锁?

5 个答案:

答案 0 :(得分:7)

在执行中断处理程序时,内核在中断控制器上显式禁用该特定中断行,因此一个中断处理程序不能同时执行多次。 (但其他中断的处理程序可以同时运行。)

答案 1 :(得分:4)

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

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

许多其他同步方法,来自每个CPU数据,仅使用原子操作访问共享数据,甚至是读取 - 更新 - 更新变体,可用于保护共享数据。

答案 2 :(得分:0)

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

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

虽然下面有两种情况,中断处理程序需要自旋锁。

  1. 请注意,当来自设备和IRQ线路的中断时,该内核会禁用该内核上的所有其他中断,也会禁用其他内核上的该设备中断。来自其他设备的中断可以来自其他核心。
  2. 因此可能存在一种情况,即为不同的设备注册相同的中断处理程序。 例如: - 的request_irq(A,FUNC,..); reqest_irq(B,FUNC,..); 对于设备,调用中断处理程序func。 对于设备B,调用相同的中断处理程序func。 因此,在这种情况下应使用自旋锁以防止升高条件。

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

答案 3 :(得分:0)

section 4.6 of Understanding the Linux Kernel, 3rd Edition by Marco Cesati, Daniel P. Bovet告诉你答案。 实际的中断处理程序由.then(() => { console.log("----E----\n" + JSON.stringify(itemList, null, 4) + "\n" + JSON.stringify(priceList, null, 4) + "\n----E----"); let cmd = require("./itemsPROCESS.js"); cmd.run(transfer, msg, args, itemList, priceList); }); 处理。 handle_IRQ_event阻止任何其他CPU同时访问irq_desc[irq].lock

答案 4 :(得分:-1)

如果关键数据是由中断处理程序和你的进程(可能是内核线程)共享,那么你需要保护你的数据,因此需要自旋锁.spinlock的常见内核api是:spin_lock()。 还存在这些api的变体,例如spin_lock_irqsave()可以帮助避免在获取/保持旋转锁时可能遇到的死锁问题。请通过以下链接查找主题的详细信息: http://www.linuxjournal.com/article/5833