Windows 2000的可靠性
Windows 2000作为新一代的网络操作系统家族,无论在性能上还是可靠性上都有了质的飞跃。在Windows
2000中,微软已经针对可能影响可靠性的软硬件和系统管理问题专门进行了加强。Windows
2000在三个主要的方面改进了可靠性。首先,对结构进行了修改,主要目的在保护操作系统的内核和共享内存,因此增强了系统的稳定性。第二,开发了新的工具可以帮助开发者创建更可靠的代码。第三,Windows
2000包含了新的管理特性可以提高可靠性。在本文中将对这些增强和新特性进行专门介绍
介绍
对操作系统来说,用户的主要需求就是系统的可靠性。我们平常提到的可靠性实际上指的是两个方面的操作系统特性:可靠性和可用性。在提到操作系统的时候,可靠性是指一台服务器如何相容的运行应用程序和服务而尽量少的发生错误,可靠性越高就表示系统发生错误的机会越少;而可用性是指系统可以使用的时间,可用性高就表示系统可用使用的时间多,因为日常维护和意外错误导致的宕机时间就少。可靠性可以通过减少潜在的系统失败的原因来提高,而可用性则可以通过解决宕机的原因来解决。简而言之,一个可靠的和可用的系统很少失败,在关机后也很容易重新启动
Microsoft® Windows® 2000
操作系统家族在硬件、软件和系统管理方面进行了增强以解决可用性和可靠性的问题。微软利用内部和从客户处搜集的大量数据来分析引起Windows
NT 4.0失败的原因。这些信息帮助微软增强了Windows 2000的稳定性和可靠性,并且帮助微软开发了工具,这些工具可以帮助管理员更快得分析问题,以及更快得从不可避免的失败中恢复。
Windows 2000
在三个主要方面提高了可靠性和可用性:对操作系统进行基本的改进,帮助开发人员创建可靠的代码,提供管理员提高系统可用性的新的工具。
首先,通过结构的修改,操作系统的稳定性得到了增强,结构的修改主要集中在保护操作系统的内核和共享内存上面。包括:
? 内核模式的写保护,这有助于阻止错误的代码干涉操作系统的工作。
? Windows 文件保护,阻止新的软件安装替代了基本的系统文件。
? Windows 2000 使用Driver Signing (驱动程序数字签名)来识别通过了Windows
Hardware Quality Labs
测试的驱动程序,并且在用户将要安装没有数字签名的驱动程序时对用户提出警告。
第二,新的工具可以帮助开发人员创建更可靠得驱动程序。例如,一个公共的驱动程序问题的来源是不正确的使用共享内存。Pool
Tagging 和 Guard Pages
特性使得跟踪内存使用更加简单,因此可以帮助开发人员对设备驱动程序进行调试。Driver
Verifier 和 Device Path Exerciser
工具可以让开发人员检查错误分类,而在以前这些问题在测试环境中很难发现。
第三,Windows 2000
包括了新的管理特性,这些特性和增强改进了可用性。其中最重要的是减少了要求系统重新启动的维护功能的数目。关键的诊断过程运行的更快速,例如进行硬盘检查或者在系统失败时创建一个关于内存使用的详细报告。另外的几个改进减少了关机和重新启动的时间。
本文将对这些改进在技术方面做一个全面的介绍
系统结构和内存使用
可靠性和可用性的改进的核心是对操作系统和内存的保护。许多会引起系统不稳定的问题主要是由于对操作系统内核(在内核中执行着基本的系统服务)的意外的影响,。因为内核控制着整个操作系统,所以影响内核的代码错误对可靠性有极大的影响。影响内存的错误也是不稳定的一个经常的来源。
Windows 2000操作系统提供了一个应用程序运行的环境。它包含了一系列的小软件组件,它们在一起工作来执行任务。每一个组件提供了一系列的功能来作为系统其它部分的接口。这些模块提供了访问CPU和其他硬件资源的方式。操作系统还提供了使程序和组件可以互相通信的机制。
核心模式和用户模式
Windows 2000 将执行代码分为以下两种模式
用户模式
用户模式中的软件在没有特权的状态下运行,对系统资源只有有限的访问权限。例如,软件不能直接访问硬件。Windows
2000基础的应用程序和被保护的子系统运行在用户模式下。被保护的子系统运行在自己的空间内,不会互相干涉。
核心模式
在核心模式中,软件可以访问所有的系统资源,例如计算机硬件和敏感的系统数据。核心模式中的软件构成了操作系统的核心,它们可以分为如下几组:
? Executive(执行体)
包含为环境子系统和其他执行体组件提供系统服务的系统组件。它们执行的系统任务包括输入/输出,文件管理,虚拟内存管理,资源管理,以及进程内部通信等等。
? Device drivers(设备驱动程序)
将组件的调用(例如,请求打印机)翻译为硬件操作。
? Hardware abstraction layer(HAL,硬件抽象层) 将Windows 2000 Executive
的其它部分与特定的硬件分离开来,使操作系统与多处理器平台相兼容。
? Microkernel(微内核)
管理微处理器。它执行一些重要的功能,例如调度,中断,以及多处理器同步等。
内存模型
Windows 2000
增添了新的特性以解决因为共享内存的不同的处理方式引起得问题。要理解这些改进,就要先理解Windows
2000是如何管理内存的。
Windows 2000 使用虚拟内存管理器来管理虚拟内存和物理内存。
虚拟内存指操作系统如何使内存对应用程序可以使用。Windows 2000
支持4GB的虚拟内存。其中2GB为核心模式使用,另外2GB为核心模式和用户模式共同使用。
物理内存指计算机中安装的内存芯片。虚拟内存管理器(VMM)使用内存映射表来跟踪每一个进程使用的虚拟内存地址以及这些地址引用得实际数据在物理内存中的位置。为了让多个应用程序可以共享内存空间,VMM使用一个叫做PAGING的进程在物理内存和硬盘之间交换内容。这些被交换的内容叫做page
files.
可靠性改进
由于提供预先检测,阻止了应用程序、服务或设备驱动程序对内存的不正确使用,Windows
2000提高了可靠性。操作系统可以非常出色的管理应用程序以及系统的错误,使得系统不会宕机。另外,为了保证一个程序的失败不会导致影响操作系统或者其他应用程序的运行,其他的子系统与应用程序被隔离在单独的内存空间中。
在Windows 2000中对可靠性的改进主要在三个领域:结构改进,核心模式代码开发工具,以及用户模式代码开发工具。
结构改进有助于保护操作系统核心模式操作。这些改进包括:
? 核心模式写保护
? Windows 文件保护
? 驱动程序数字签名
核心模式写保护
为了保护操作系统中的每一部分不会受其它部分的错误的影响,Windows
2000在内核部分和设备驱动程序中添加了写保护和只读部分,正象Windows
NT总是有用户模式应用程序和动态连接库一样。
为了提供这种保护,物理内存映射标志出包含代码的内存页面,保证它们不能够被覆盖,即使是操作系统也不能。这样就阻止了核心模式软件破坏了其他核心模式软件。这些特性在缺省情况下是激活的,当然如果用户和开发人员愿意的话,可以关闭这些特性。
Windows 文件保护
在Windows 2000以前的Windows版本中,安装软件可能覆盖共享的系统文件(例如,DLL,和可执行文件)。如果系统文件被覆盖,系统性能就会变得不可靠,程序的行为就会混乱,操作系统可能会失败。
Windows 文件保护在安装前检查原来的系统文件的版本。这样就保证象.sys,
.dll, .ocx, .ttf, .fon, .exe等系统文件不会被替代。Windows
文件保护在后台运行,保护所有的由Windows 2000安装程序安装的文件。它检测其他程序要替换或删除一个被保护的系统文件的企图。Windows
文件保护检查文件的数字签名来确定新文件是否为正确的版本。如果这个文件的版本不正确,Windows文件保护就从dllcache目录,网络安装路径或者Windows
2000光盘中替换这个文件。如果Windows文件保护找不到合适的文件,它就会提示用户输入正确的路径。Windows文件保护还会将替换文件的企图写入事件日志。
缺省情况下,Windows文件保护是被激活的,只允许在安装下面的软件时替换被保护的系统文件:
? 使用Update.exe安装Windows 2000 Service Packs
? 使用Hotfix.exe
? 使用Winnt32.exe进行操作系统升级
? Windows Update
? Windows 2000 Device Manager/Class Installer
驱动程序签名
驱动程序签名有助于提高驱动程序的质量,因为它允许Windows 2000和Windows
98通知用户他们安装的驱动程序是否通过了微软的认证程序。驱动程序签名将一个加密的数字签名附加在通过了Windows
Hardware Quality Labs (WHQL) 测试的代码文件上。.
如果驱动程序运行在Windows 2000和Windows 98操作系统中,那么给驱动程序签名则是WHQL测试的一部分。数字签名与独立的驱动程序包结合在一起,Windows
2000可以识别它。这种认证证明用户使用的驱动程序是经过微软测试的那个驱动程序,如果在该驱动程序被放在HCL中后被修改过,Windows
2000就会通知用户。
驱动程序允许三种反应:Warn,Block,Ignore.
? Warn
在被安装的驱动程序没有数字签名的情况下,让用户了解,并且让用户决定是否安装。Warn还让用户可以选择安装一个被保护的驱动程序文件的没有签名的版本。
? Block 禁止安装所有的没有签名的驱动程序。
? Ignore 允许安装所有文件,不管这些程序是否有数字签名。
缺省情况下,Windows 2000 以Warn方式发布。
核心模式代码开发
如前所述,软件可以被分为两类:用户模式软件和核心模式软件。那些有助于程序员创建可靠的用户模式的应用程序的开发工具对开发核心模式代码的程序员来说就不合适了。因为编写核心模式代码由特定的要求,Windows
2000 Server中的可靠性的改进就包括专为核心模式开发人员使用得开发工具。
设备驱动程序是核心模式代码,它将操作系统和硬件联系到一起。为了使系统的性能达到最大,核心模式代码没有应用程序那样的内存保护机制。相反,操作系统充分信任核心模式代码没有错误。这就是为什么为了与其他的驱动程序和操作系统组件安全的协调工作,这些驱动程序和核心模式代码必须遵循复杂的规则的原因。一点点偏差就会导致其他核心模式的错误。
某些核心模式代码错误在测试阶段就可以发现。但是,像内存不足等错误,则可能经过很长时间才能导致系统崩溃,因此要找到在那儿产生的错误非常困难。另外,对驱动程序开发人员来说,要完全测试核心模式代码也是非常困难的,因为要模拟驱动程序将会碰到的整个环境是非常困难的。
为了解决这些问题,Windows 2000 Server
增加了下面的特性和工具来帮助开发人员创建更高质量的驱动程序:
? Pool Tagging
? Guard Pages
? Driver Verifier
? Device Path Exerciser
Pool Tagging
Windows NT 4.0
内核包含完全共享的内存池,它被分配给各个任务,当不再需要时内存被返回给内存池。如果设备驱动程序发生错误的话,这种共享内存方式就会带来问题。一个经常发生的错误就是让核心模式组件对分配给它的内存以外的内存空间进行写操作。这样做将会引起另外的核心模式组件崩溃,从而导致系统失败。
另一个经常会发生的错误是为一个驱动程序的进程分配了内存,但是在进程结束后却没有释放,这种情况会产生内存不足的问题。内存不足经常导致系统挂起---挂起的时间依赖于当时的环境。例如,一个请求了很少量的驱动程序,没有释放掉它的内存将会花很长时间才能消耗掉整个内存池。
所有的这些错误可能很难被跟踪。为了帮助开发人员发现并且修复这些错误,微软在Windows
2000中增加了Pool Tagging,或者称为(Special Pool)。这个工具在Windows NT
4的Service Pack 4中就存在了。
Guard Pages
Guard Pages 工具创建了Special Pool (Pool Tagging)的边界。这些内存页面让开发核心模式代码的开发人员能够发现覆盖代码的错误。当程序分配内存区域,然后又要在该区域之内进行写操作时就会发生这种错误。而使用了Guard
Page,当程序请求内存区域时,操作系统将内存区域从页面内存的边界开始分配。然后,操作系统就映射下一个页面为Guard
Page,并且设置这些页面,使得代码不能够访问它们。如果程序试图对这些内存区域进行写操作的话,它会碰到Guard
Page,而这些页面是不能写的,系统将产生一个硬件错误,从而导致系统失败。这种引导出的失败警告开发人员,他们的应用程序的写操作超出了范围。
Driver Verifier
Driver Verifier 是Windows 2000内核中增加的一系列的检查。这些检查有助于发现核心模式中包含的错误。因为Driver
Verifier
影响性能,因此不应该连续使用,也不应该在实际环境中使用。在测试新的应用程序或者在实际环境中为后面的重复使用进行配置时,这是理想的工具。Driver
Verifier
在进行技术支持时也非常有用,例如有一个特定的驱动程序被怀疑引起系统崩溃了。Driver
Verifier 还包含一个Verifier.exe文件,这是一个用来管理driver verifier设置的图形界面的工具。
Driver Verifier
测试特定的错误条件集合,当发现新的可能的错误模式时,这些错误就被添加到测试集合中。Driver
Verifier可以测试下面几种类型的错误:
? Memory corruption. 要想用Driver Verifier发现内存错误,必须保证驱动程序的所有内存都来自于Special
Pool。Driver Verifier 检查类似于spinlocks,
使用未初始化的变量以及内存错误等等的错误。
? Writing to pageable data.
这种测试寻找那些以提高的中断级别或者具有spinlock访问可以交换的资源的驱动程序。这是一个致命的错误,但是只会发生在一个具体的工作环境中。为了测试这个错误,当一个驱动程序得到spinlock或者提高了中断级别时,Driver
Verifier
就会使所有的可交换的代码,数据,和内存池无效。如果驱动程序试图写这些可交换的代码,硬件将生成一个页面错误提示驱动程序试图写无效的数据。
? Handling memory allocation errors.
一个经常发生的编程错误是在核心模式不能为驱动程序分配请求的内存时,驱动程序中没有适当的代码处理这种情况。在过去,驱动程序编程人员不能强迫内核返回内存分配失败。因此,他们缺少创建好的测试环境的能力。Driver
Verifier可以配置将随机的内存分配错误映射到特定得驱动程序。
Device Path Exerciser
Device Path Exerciser (Devctl)测试设备驱动程序如何处理错误。它利用各种各样的用户模式I/O接口同步或者异步调用驱动程序,并且测试驱动程序如何处理错误的请求。例如,它可能连接到网络驱动程序并且请求它回卷磁带。可能连接到打印驱动程序并且请求它重新同步通信线路。或者,它也可能使用一个错误的缓冲区请求某个设备功能。这样的测试帮助开发人员使得驱动程序在错误的条件下更强壮
用户模式代码开发
Windows 2000 包括一个新的工具---PageHeap。它可以帮助开发人员在开发非核心模式代码的时候找到内存访问错误。
PageHeap
Heap(堆)指的是用于临时存放代码的内存。堆错误在应用程序开发中是一个经常遇到的问题。最典型的发生堆错误的情况是一个应用程序分配了一个特定大小的内存块,但是却在该范围之外进行写操作。另一个发生错误的原因是正在写的内存块已经被释放掉了。在这些情况下,可能会出现两个应用程序写同一部分内存,从而导致系统失败。Windows
2000中新添加的PageHeap特性就可以帮助开发人员发现它们的内存错误。
当PageHeap
被激活时,该应用程序的所有的堆分配被放到内存中,这样堆的边界就与虚拟内存的边界排在一起了。与堆相邻的虚拟内存页面被设置为NO_ACCESS。在该应用程序中对堆后面的空间的访问就会立刻引起错误,这就可以在一个调试工具中被捕获,开发人员就可以找到出错的代码。
在释放堆时,过程与之类似。PageHeap修改释放的应用程序虚拟页面为NO_ACCESS,这样,如果应用程序试图读写该内存时就会发生访问错误。
如果为一个应用程序运行PageHeap特性,应用程序要比正常时运行得慢,并且需要更多的虚拟内存,因为每一个堆的分配都需要两个完整的虚拟内存页面。随着应用程序对堆的使用的增加,可能需要增加系统的虚拟内存的大小,否则会出现虚拟内存不够的错误信息。除非系统有相当大的虚拟内存,否则建议不要同时运行两个以上的激活了PageHeap特性的应用程序。
可用性的改进
Windows 2000中对可用性的改进减少了为了正常的维护工作而导致系统离线的时间。它还提高了恢复速度,增强了数据存储功能。
既然系统失败是不可避免的,管理员就必须能够快速的备份重要的数据,在系统崩溃时能够迅速抽取信息以确定发生错误的原因---不管这个问题是硬件的,操作系统的,还是第三方的产品。相似的,企业级的关键任务的应用程序还需要能够在发生错误的情况下快速的保存关键的
|