虽然知道的人不多,但是人们其实对ISR和DPC应该都有过最直接的感受:在老的机器当中进行大量的IDE磁盘操作时,或者以超高的速度下载资料时,人们会感受到系统的响应将会明显变慢,甚至就像死掉了一样——有时候会真正的死掉。在这个时候,用户可以观察到程序占用的CPU,真相就是,CPU都被ISR和DPC占用了。ISR和DPC通常包含在驱动程序内,由硬件厂商提供,DPC可以抢占普通的线程,设计不好的驱动程序将会导致很糟糕的用户体验,以及性能。
1:设备触发一个中断,引发Trap Handler处理
2:等待Interrupt Dispatcher处理
3:进入ISR中断服务例程处理
4:较低IRQL的中断或者较高IRQL的中断中不需要立即执行的部分则加入DPC队列
5:高IRQL的中断立即进行处理
6:高优先级的事务都处理完之后,Thread Dispatcher(就是前面去掉了一个大锁的那个,这个锁也影响到了DPC)在普通线程切换重新获得控制权的时候产生一个DPC软中断
7:控制权交给DPC Dispatcher
8:开始处理DPC队列
9:DPC完成
2:等待Interrupt Dispatcher处理
3:进入ISR中断服务例程处理
4:较低IRQL的中断或者较高IRQL的中断中不需要立即执行的部分则加入DPC队列
5:高IRQL的中断立即进行处理
6:高优先级的事务都处理完之后,Thread Dispatcher(就是前面去掉了一个大锁的那个,这个锁也影响到了DPC)在普通线程切换重新获得控制权的时候产生一个DPC软中断
7:控制权交给DPC Dispatcher
8:开始处理DPC队列
9:DPC完成
到了Windows Server 2008 R2,DPC相关的处理也有了改进,如下文所示,不得不说,这个Tech·ED 2009的中文文档翻译非常糟糕,几乎面目全非。有条件的应该观看最后给出的英文原稿:
在Server 2008 R2之前,虽然每一个处理器上面都可以运行DPC,但是具有一个统一的DPC定时器,以及对应的定时器的锁,它运行在系统的CPU0上,显然,这是一个瓶颈,特别是在虚拟化应用场景下,多个虚拟机的DPC定时器也都依赖于这个独特的CPU0。在Server 2008 R2之上,但一的DPC定时器队列被拆散成多个队列,并运行在多个CPU上。具有大量IO硬件,以及虚拟机的系统将会获得明显的益处,遗憾的是,这个改动只对2008 R2有效,Windows 7无法享受到。这也是在多CPU、大量设备的系统中Server 2008 R2比Windows 7更好的一个原因之一。对于一些高端发烧友而言,2008 R2是一个值得推荐的选择。*对于路过的Linux专家,必须得说,Linux 2.6有类似的机制,虽然没有一个像Windows这么一致的层次驱动程序架构。因此Linux的异步I/O显得略微粗糙一些。