是否可以在linux中的多处理器系统上同时运行同一中断的多个实例? 如果不可能,为什么我们需要使用自旋锁在中断处理程序之间进行同步?
由于 卡塔斯
答案 0 :(得分:1)
Is it possible to run multiple instances of a same interrupt simultaneously on a multi processor system in linux?
中断处理程序通常是序列化的。意思是,只有一个处理程序实例正在运行(在任一处理器上)。当它正在运行时,如果再次生成相同类型的中断,则仅在当前中断完成后对其进行处理,从而进行序列化。虽然"这个"处理程序由其中一个核心执行,其他核心可能是不同实例的服务处理程序。
Why do we need to synchronize between interrupt handlers using spin locks?
即使在这种情况下也要使用自旋锁,因为必须保护数据不受某些其他线程的影响(例如,下半部分,用户读/写处理函数等)。 场景可能是这样的:
my_ISR()
{
lock(&l);
// data is accessed here
unlock(&l);
}
my_other_thread()
{
lock(&l);
// same data is accessed here
unlock(&l);
}
答案 1 :(得分:0)
在SMP架构上,高级可编程中断控制器( APIC )用于将来自外设的中断路由到CPU。
APIC,基于
的 1。路由表(中断亲和性设置为特定处理器),
2.中断的优先级,
3. CPU上的负载
例如,考虑在IRQ第32行接收到中断,这通过APIC,中断被路由到特定的CPU,现在考虑CPU0,这个中断线被屏蔽,直到ISR被处理,这意味着你将如果正在执行ISR,则不会获得相同类型的中断
一旦处理完ISR,只有中断线未被屏蔽以备将来中断