以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 最新动态 & 业界新闻 』  (http://bbs.xml.org.cn/list.asp?boardid=35)
----  Windows NT 5.0的核心和性能改变 --Windows NT 5.0 最大可支持32G内存  (http://bbs.xml.org.cn/dispbbs.asp?boardid=35&rootid=&id=48098)


--  作者:卷积内核
--  发布时间:6/6/2007 5:18:00 PM

--  Windows NT 5.0的核心和性能改变 --Windows NT 5.0 最大可支持32G内存
Windows NT 5.0引入了对VLM(超大内存)、作业对象、PnP、WDM和WMI(Windows管理
接口)等的支持,受到用户的欢迎,本文主要介绍这些新技术。
VLM支持
在介绍VLM之前,让我们首先回顾一下Windows NT内存管理的进化过程,下图所示的是
从Windows NT 3.x和4.0使用的存储寻址结构:
@@0361700.JPG;图1@@
因为Windows NT 3.x和4.0是标准的32位操作系统,32位指针能够访问的最大空间范
围是232,也就是4GB。但用户的应用程序并不能使用所有的4GB空间,如上图所示,4GB的上
半部分:从0x80000000到0xFFFFFFFF共2GB的空间属于系统空间,操作系统的所有进程都运
行在系统空间中。从0x00000000到0x7FFFFFFF属于用户空间,但最上层驻留的是系统的动
态链接库,这包括kernel32.dll、user32.dll、ntdll.dll等。用户真正能够使用的空间
应该少于2GB。通过把内核空间和用户空间分开,Windows NT大大地增强了可靠性。
当微软试图向大型企业应用发展时,2GB的应用程序空间已经渐渐不够用了。于是在
Windows NT Server 4.0企业版发布时,其中的一个新特性就是3GB用户空间的调整。如下
图所示:
@@0361701.JPG;图2@@
在Windows NT Server 4.0企业版中,内核空间被缩小到1GB,多出来的空间归用户使
用,这样用户空间增加到了3GB。由于系统动态链接库的位置不变,所以用户这3GB空间并
不是连续的,中间有一个"洞"。
但随着计算机软硬件的飞速发展,当今许多大型数据库的容量达到了几百个GB,对内
存的需求也大大地增加,如果把数据都缓存在物理内存中,系统的响应速度将大大提高。
为了更好地参与企业应用,Windows NT Server 5.0对DEC Alpha平台提供了VLM支持。因
为Alpha平台的所有指针和寄存器都是64位的,因此Windows NT 5.0能够访问超过4GB的内
存空间,最多可以达到32GB。最上部的2GB空间是系统空间,最下部的2GB空间是用户空间
,中间有28GB用户空间。但所有这些空间只有使用64位指针才能访问到,也就是对NT的32
位指针进行64位的符号扩展,Visual C++ 5.0的Alpha版本的编译器能够自动进行这种转
换。还需要注意的是,中间的28GB内存空间是不可交换的,也就是说必须物理上配置28GB
内存,而不能利用硬盘上的页交换文件来进行模拟,此外VLM的I/O只能支持异步和非缓存
I/O。
对VLM的访问是通过VLM API来实现的,这些API是原有的虚拟内存管理API的扩展。但
使用的指针和参数都是64位的,下面是其中的一部分:
VirtualAllocVlm MapViewOfFileVlm
VirtualFreeVlm UnmapViewOfFileVlm
VirtualProtectVlm ReadProcessMemoryVlm
VirtualQueryVlm WriteProcessMemoryVlm
ReadFileVlm
GlobalMemoryStatusVlm
WriteFileVlm
Move/Copy/Fill/ZeroMemoryVlm
最后,WINNT.H为支持64位操作定义了两个新的标志位:SEC-VLM和IMAGE-FILE-LARGE
-ADDRESS-AWARE。当使用超过4GB的内存空间时,调用VirtualqueryVlm将返回SEC-VLM标
志。如果把IMAGE-FILE-LARGE-ADDRESS-AWARE标志置位,则告诉系统本程序使用的是64位
的API调用。
作业对象
作业对象是Windows NT 5.0进入企业应用的标志之一,是NT新的一个内核对象,与线
程和进程有相似的特性。我们可以把一系列相关的进程集合在一起,关联到一个可以进行
整体管理的作业对象上。作业对象可以被命名、共享和设置访问许可,关联在作业对象中
的进程有继承性,即作业对象中任何进程的子进程也属于同一个作业对象。类似于磁盘配
额,我们可以把一个应用程序的所有进程关联到一个作业对象中,通过对作业对象加以各
种限制(CPU时间、RAM分配、安全性等),我们可以实现对应用程序完全的控制、管理和跟
踪,这对管理CGI这类不是自己编写的应用程序是非常有用的。
我们可以通过调用CreateJobObject和OpenJobObject函数来创建和打开一个作业对
象,当作业对象生成时,里面没有相关联的进程。为了把一个进程和一个作业对象关联起
来,首先我们把这个进程挂起,然后调用AssignProcessToJobObject函数把进程关联到作
业对象中,最后解除挂起。当终止一个作业对象时,我们调用TerminateJobObject函数,这
时与作业对象关联的所有进程都被终止。此外,关联的建立是单向的,也就是说关联建立
后就不能打破。
我们可以使用SetInformationJobObject函数来对一个作业对象及其相关联的进程设
置限制,也可以用QueryInformationJobObject函数查询对作业对象设置的限制。这些限
制包括:
·PerProcessUserTimeLimit 限制一个线程在用户模式下的执行时间,系统周期性地
对每一个作业中的进程进行检查,如果一个进程累计的执行时间超过了限制,进程将被终
止。
·PerJobUserTimeLimit 限制一个作业对象在用户模式下的执行时间,如果作业对象
中所有进程在用户模式下执行的时间超过限制,则所有的进程都被终止,并且此时其它的
进程也不能被关联到这个作业对象中,除非重新设置限制。
·MinimumWorkingSetSize和MaximumWorkingSetSize 设置作业对象中所有进程使用
的最小和最大的内存容量。
·ActiveProcessLimit 指定一个作业对象中活动进程的最大数目。如果在把一个进
程关联到作业对象的过程中,活动进程计数器的值超过了限制,则进程被终止,关联失败。
·CPU Affinity 在多CPU环境下,指定作业对象中进程的CPU亲和性(Affinity),即对
每个CPU指定在它上面运行的进程的集合。
·PriorityClass 指定与作业对象相关的所有进程的优先级。
此外,作业对象在用户方面还有相应的限制。
在安全性的限制方面,Windows NT 5.0中每个进程使用的是受限制的令牌,作业对象
中的进程不可能得到一个管理员的令牌,也就是不可能拥有管理员的权力。此外,还可以
通过为作业对象中的进程指定一个特定的令牌(如一个GUEST令牌)来限制安全性。最后,
我们还可以设置一个过滤器从令牌中去掉特定的权力或SID。
Critical Section 和Spin Count
这两个概念出现在多线程编程中。在多线程应用程序中,如果两个或者多个线程同时
访问同一个资源(全局变量,公共数据成员、句柄等),将会出现不可预料的结果,因此存在
不同线程之间资源访问的同步问题。
为了确保任何时候只有一个线程能够存取共享资源,我们需要设置一个Critical Se
ction对象,Critical Section对象一次只能被一个线程所拥有。例如,如果多个线程需要
执行文件I/O,每个线程在执行文件I/O之前必须请求Critical Section,当一个进程拥有
Critical Section时,其它的线程由于不能获得Critical Section因而不能进行文件I/O
,只有排队等待Critical Section的释放。我们用这种方法实现了资源访问的同步。
在Windows NT 4.0 SP3和Windows NT 5.0中,微软引入了Spin Count的概念。我们可
以通过函数SetCriticalSpinCount为一个进程设置一个数值(由Spin Count表示),当一个
进程申请Critial Section失败后,我们可以让它在用户模式下等待一个Spin Count所指
定的时间间隔,而不是立即进入内核状态。因为在等待结束后,等待进程往往会发现Crit
ical Section已经被释放,这样就避免了用户模式和内核模式之间的状态转换。由于Spi
n Count的等待时间间隔远远小于进行状态转换的时间间隔,Spin Count提高了应用程序
的响应速度。在Windows NT 5.0(SMP系统)的堆分配中,缺省就设置了Spin Count。
Scatter / Gather I/O
Windows NT 5.0还提供了一对新的文件API:ReadFileScatter和WriteFileGather。
这两个API主要应用于文件系统和内存之间拷贝多个页面大小的数据区时,它们可以减轻
磁盘I/O的负担。
WriteFileGather接收多个指向内存中不同数据区的指针,把它们"集合"在一起,然后
将这些内容作为一个整体写到文件中。ReadFileScatter从文件系统中读取数据,然后把
它们"分散"到内存中预先建立的不同数据区里。
Scatter /Gather I/O的好处是我们不再需要为数据的传输准备一块"中间缓存区",
它能够提高SQL Server的性能。需要注意的是这只应用于非缓存及异步I/O调用中。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms