服务器 频道

到底改进了什么?Win7/2008 R2核心剖析

  估计知道DPC(Deferred Procedure Call,延迟过程调用)的人不多,不过对驱动程序架构有了结的人应该会知道,Windows NT的硬件中断处理和其它系统有些不同,它分为两个部分,一个是直接的ISR(Interrupt Service Routine,中断服务例程),以及DPC。重要的如电源失效、运算出错、硬件时钟等硬件中断必须立即进行处理,它们触发后将通过ISR中断等级较低的处理过程得到优先执行,而一些不怎么重要的硬件中断则不会立刻执行,而是会放在另外一个队列当中,稍后有空的时候再来执行,这将可以降低频繁的高等级中断导致其它中断等待时间过长、响应过慢的问题,如下图所示:

根据IRQL(Interrupt Request Level中断请求等级)来排序硬件的重要性,数字越大,等级越高,其中断执行就越优先;DPC和通常的线程调度属于同一个等级

  虽然知道的人不多,但是人们其实对ISR和DPC应该都有过最直接的感受:在老的机器当中进行大量的IDE磁盘操作时,或者以超高的速度下载资料时,人们会感受到系统的响应将会明显变慢,甚至就像死掉了一样——有时候会真正的死掉。在这个时候,用户可以观察到程序占用的CPU,真相就是,CPU都被ISR和DPC占用了。ISR和DPC通常包含在驱动程序内,由硬件厂商提供,DPC可以抢占普通的线程,设计不好的驱动程序将会导致很糟糕的用户体验,以及性能。


ISR/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完成

  到了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显得略微粗糙一些。
0
相关文章