相信没听说过进程和线程概念的人应该很少,作为程序运行的实体,我们每天都在不停地创建、运行进程和线程。
Windows NT基于内核级线程模型,所有的线程都由内核管理调度,这个调度由内核的叫做Dispatcher分发器(也叫Scheduler调度器)的部件完成进行。进程的调度则由位于执行体的进程管理器来完成。
Dispatcher管理着线程的列表,以及各种时钟,如下图所示,Windows Server 2003也就是Windows NT 5.0具有一个大的Dispatcher Lock,下面管理着多个Timer Lock。Lock锁是一个共享/同步机制,同一时间只能有一个拥有者获得一个锁,并获得锁代表的系统资源。锁的概念让多线程的编程模型变的简单,然而却不利于并行运行,因为在一个拥有者获得资源的时候,其他用户只能等待,无所事事。Windows Server 2003确保了同一时间只能由一个线程来修改相关的状态,以及定时器:
到了Windows Server 2008(也就是NT 6.0),修改各种定时器终于不再需要先获得Dispatcher的锁了,分散的锁让2008的多线程性能有所提升。如同配置的终端服务器上,2008可以比2003支持30%多的并发用户
Windows Server 2008相对Windows Server 2003在锁上面的改进不算太大,没有动到筋骨,然而Windows Server 2008 R2上的变动可就大了:Windows Server 2008 R2彻底去掉了Dispatcher的锁。
在Windows Server 2008 R2上,以往的单个Dispatcher锁被更细小的、以对象为单位的小锁代替,同时还有很多的操作是无锁化的,这些都彻底提升了多线程的运行性能。
去掉Dispatcher锁是2008 R2支持更多逻辑处理器的根本原因之一,Server 2008只能支持64个逻辑处理器,Server 2008 R2则能支持到256个,并且随着逻辑处理器的增加,性能具有着接近线形的提升
*一个逻辑处理器同时只能运行一个线程
除了去掉Dispatcher的锁之外,Windows Server 2008 R2还去掉了内存管理器(位于执行体)的PFN的锁,PFN是Physical Frame Number的意思,它跟踪着所有内存页面的状态,去掉这个锁之后,多个线程将可以同时分别对不同的内存页面进行操作,这也是提高多线程并发运行能力的一个重要改进。如下面连接所示,Windows 7的系统性能提升虽说有着图形架构上改进的因素,然而内核上的变动也是有影响的。锁的改动同时对Windows 7和Windows Server 2008 R2都有效。