服务器 频道

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

  Windows 7/Server 2008 R2的用户级线程调度实现其实不是一个发生在内核层面上的改进,因为它并没有去掉内核级线程调度。User Mode Scheduling,用户级调度,就和教科书上说的一样,通过避免频繁切换进内核来降低进程切换的消耗,从而获得很好的运行性能,同时避免一些内核的锁操作获得更好的并发性能。

  可能知道的人很少:Windows NT一直提供了用户级线程的支持,它被称为Fiber,中文名叫做纤程。Fiber就是纤维的意思,把它叫做纤程的确很妙,纤程是比线程更细小的运行实体,一个线程可以分成多个纤程来运行。实际上,在Windows NT当中,程序的运行层次有四个:Task任务、Process进程、Thread线程、Fiber纤程。不过中间两个用的最多,两头的用的最少。


Fiber,和传统的用户级线程一样,缺点就是内核并不知道它的存在,而只知道线程的存在(因为Windows NT基于内核级线程模型),当一个Fiber执行一个堵塞自己的系统调用的时候,它堵塞住了整个线程乃至所有其它的纤程,这样内核就会挑选其他的线程运行,当堵塞解除的时候内核并不知道如何返回对应的纤程,因为内核只保留了线程的状态而不没有纤程的状态,基于这样的原因,纤程很少有人使用
 

在Server 2008 R2上,实现了用户级线程调度,而不是之前的那样,仅仅提供了用户级线程而没有提供相关的调度机制。用户级线程调度通过彻底分离线程的内核模式部分和用户模式部分,并分别提供一个调度器来实现。实际上Server 2008 R2提供了一个内核/用户级线程混合的调度模型,类似的系统有历史上的Mach;使用用户级线程调度的还有5.x~7.x版本的FreeBSD
 

传统的WinNT内核级线程调度,一个线程可以在用户模式和内核模式间切换,因此在两个模式下都具有相关的运行状态

老的模型在切换线程时,会同时切换内核和用户模式下的状态,而用户级线程调度上,不同的线程切换平时只是在用户模式进行切换,只有在进入内核模式的时候,才切换对应的状态,从而获得了用户级线程低消耗的好处
  不过遗憾的是,UMS用户级线程调度只有在64位上提供,也就是Windows 7 x64和Windows Server 2008 R2上可用,Windows 7 32位没有这个功能。
0
相关文章