而在keinsertqueuedpc函数中判断是否发出dpc中断请求时,也需要做更复杂的逻辑判断。
对dpc对象目标处理器就是当前处理器的情况,可以和前面单处理器时一样处理,直接发送dpc中断请求;但对于dpc对象目标处理器是其他处理器的情况,就必须使用kiipisend函数发送ipi(interprocessor interrupt)中断,通知目标处理器执行动作。此ipi中断是介于系统掉电中断(power_level)和时钟中断之间的特殊irql,专门用于在多处理器情况下协调多个处理器的工作。
此外就是在多处理器情况下,各种对dpc队列的操作都需要用此处理器控制块的dpc队列自旋锁保护起来,避免同步问题。
由此我们可以看到,实际上dpc队列是每个处理器一个的,我们完全可以将某个dpc对象绑定到某个处理器上,实现类似线程亲缘性(thread affinity)的效果,优化在多处理器环境下的性能。但这同时也带来一个问题,就是isr程序可以和dpc回调函数同时被调用,某种程度上也造成了开发复杂度的增加,具体处理方法请参考ddk中相关文档。
kernel-mode driver architecture\design guide\servicing interrupts\dpc objects and dpcs