本讲座编号为TNQ 400-02,我是David Solomon,在接下来的两个小时中我们将讨论如何透过外表去观察Windows 2000和Windows NT 4.0,以便理解其内部运行机制以及如何在系统级别中实现这些机制,同时还将理解在系统中运行的进程。这个讲座的目的在于:当你感觉在NT系统中从性能的立场或从行为的立场上某些事情好像出错时给予你帮助;使你能够更近一些的观察系统外壳之下的部分并且理解CPU时间如何进行分配。如果系统运行速度慢,告诉你什么正在运行、为什么以及如何从应用程序执行中分离操作系统时间。
这个讲座假设你已经熟悉基本的操作系统概念,如进程的概念、多任务的概念、虚拟内存、分页等等;并且你是一个有经验的NT用户——不必是一名系统管理员,但至少应是一个权威的NT用户。
这个讲座结束后,你将能够使用一系列不同的工具来观察进程内部的活动,以便发现哪个文件被打开、IO操作的来源和目标、哪些动态连接库(DLL)正在由一个进程使用以及它们是从磁盘上的何处装入的、有关进程安全性的一些细节。
像我提到的那样,本讲座的目的之一是能够解释CPU时间。因此,如果CPU正在运行,那么它正在做什么并且为什么这样做呢?时间花费在那里以及如何被占用:是由操作系统、设备驱动程序、执行体还是应用程序所使用呢?理解NT操作系统上运行内容的另一个方面,是知道存在哪些系统进程。因此,如果某事务正在运行并且它不是由你所运行的,那么它是NT的一部分。正在运行的进程的作用是什么,并且你如何能够追踪到其占用CPU时间的可能原因呢?其中一个方面是由Windows NT 系统进程组成的Windows NT 服务,有时,正在运行的服务进程向后映射到哪些管理员通过管理界面可以看到的服务并不是非常清楚。
最后,我们来密切关注存在于系统进程这一非常特殊的进程中的粒度水平,该系统进程包含特殊种类的驱动程序线程运行片段和NT片段,而且,由于这种特殊进程的存在,促使我们务必深入钻研以理解进程中的哪些片段正在运行及其原因。
这有为本次讲座准备的路线图。首先我将对有关工具及其来源进行简明概述。这将是一堂高度依赖工具的讲座,而我将在此使用支持工具包、资源工具箱及Internet上获取的部分工具。接着,我们将从三个角度来观察NT系统活动:首先是进程和线程,接下来是中断时间及其在NT中的服务与解释机理,最后,再对系统进程树进行遍历。
最后的题目是一种我们不希望发生、却又经常遇到的进程活动,即当进程死亡时看到Dr. Watson信息时的情况。我们将看到是什么导致了Dr. Watson,你能进一步得到哪些信息,以及你应如何应对这些输出。
首先让我们先看一看工具。这是一个关于本次讲座所使用到工具的总概括。性能监视器——它理所当然地在对NT系统活动的观察中发挥关键性作用。我们还将看到一些注册表键。注册表是NT用来对其自身进行配置的系统数据库,因此,它包括了有助于理解程序在何处运行、来自何处,以及将服务名称映射到映像名称上的信息。接下来,我们将探究两个来自于支持工具包中的进程观察工具……对于初次接触Windows 2000的人而言,该支持工具包在NT 4.0中并不存在。曾经有一个NT 4.0资源工具包的有限子集,它与Service Pack 4.0相捆绑并称作Windows NT资源工具箱支持工具,该工具包在Windows 2000中已经更名为Windows 2000支持工具,以此来消除在它与资源工具之间存在的混淆概念。它是每个Windows NT和Windows 2000销售版本的组成部分。它存在于支持工具文件夹中。它使用一个适当的安装程序来安装。它包括了40至50种集成在资源工具包中的工具,但该工具包对Windows 2000用户而言是至关重要、不可或缺的。我将使用来自资源工具包的两个工具。它们是资源工具包所含200多种工具中的一分子,而我将强力推荐,如果你还未曾对资源工具包中的工具进行过浏览的话,这两个工具是支持工具的一套重要附件,通过它们,你将能够洞悉NT系统并理解其内部活动。
接下来列出的4个工具来自www.sysinternals.com网站。你也许已对该网站十分熟悉。它过去称为NT Internals。在此我将进入其主页以使你们看到该网站的面貌。Sysinternals是自由软件网站,这里有所有可免费下载的工具。这些工具中的大多数源代码也是公开的,这些工具被设计用来透过支持界面获取有关NT的信息,而这些信息往往是通过标准Microsoft工具所不能访问到的。大多数NT管理员对此十分熟悉,你们将在讲座期间看到其中两个工具的使用情况。
那么,让我们从最基本水平上的进程与线程活动开始,在开始之前,先来定义一下有关术语。进程与线程的区别到底是什么?进程是执行程序的实例。例如,当你运行记事本程序(Nodepad)时,你就创建了一个用来容纳组成Notepad.exe的代码及其所需调用动态链接库的进程。NT中的每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。我这里以沙箱为例进行阐述。
一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。这就是NT中强大的内存保护模型的形成机制,正是由于这种机理,才使NT明显区别于Windows 3.1、Windows 95及Windows 98。
在Windows NT和Windows 2000中,程序、程序实例或者进程对其它进程的执行情况或内存空间施加影响是不可能的。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。
NT运行线程。换言之,线程运行而进程不运行。每个进程包含单一线程,因此,当你运行记事本时,就生成相应的进程沙箱用来容纳代码和数据,而一个线程则被创建用以在指向记事本程序的主要入口起点处开始执行过程。一旦该线程在运行,它就可以创建额外的线程,一个进程的多个线程并行进行调度,这使多线程编程非常复杂,每个线程均共享其所处进程中的专用内存空间。因此,在本张幻灯片的阐述中,进程中所示的三个线程(都具有同时运行的潜在能力)均对进程中的专用数据或地址空间享有同等的访问权限,这样一来,三个线程就必须彼此同步。
那么,为什么要有多线程呢?为什么程序员选择将程序分割成多个线程呢?有两个原因:1)它产生了更佳响应性的幻觉。以Microsoft Word为例。当你进行文件打印时,你就已默认选择了后台打印方式,打印处理会在你继续编辑文档的同时异步进行。这是如何发生的呢?Word已创建了独立的线程来进行打印处理,并将打印线程的优先级设定低于处理用户输入的线程,由此,给用户提供了一种幻觉,即应用程序通过将相对优先级指定给不同线程的方式来对用户做出响应。但是,你在Win 98和Windows 95中无法得到,而在Windows 2000与Windows NT 4.0中能够得到的最大好处还在于,如果你工作在多处理器系统中,并且如果有多个线程要运行,这些线程事实上将能够在可用的处理器上同时运行。换言之,多线程应用程序能够自动地运行于可用处理器上,只要:A)该应用程序有一个以上的线程需要同时运行;B)这些线程的优先级支持该应用程序的运行。换言之,如果有具备更高优先级的线程存在于另一个CPU上……尽管你的应用程序有两个需要运行的线程,而因为在别的CPU上正执行着更为重要的任务,那么,也只能一次运行一个线程。
技巧问题。添加第二个处理器能使单一线程应用程序更快地运行吗?让我们设想你有一个非常简单的计算密集型、单一线程应用程序。它除了做计算工作之外还是做计算工作。添加一个处理器会使该应用程序更快地运行吗?好吧,你的第一反应是不,但答案却是肯定的,因为NT也有自身几个片段作为线程运行。如大多数操作系统一样,NT也拥有后台内务管理工作。因此,添加第二个处理器就意味着,当主要的计算密集型应用程序在无须短暂中断以执行后台操作系统内务处理活动的情况下仍能持续运行时,这类后台内务处理工作将会发生。
以上就是对进程和线程的简要描述。当考虑沙箱的规划时,NT和Windows 2000是一个32位的操作系统。如果算一下就会知道,32位意味着4GB。默认情况下,NT将这4GB地址空间分割为两个2GB的地址空间,其中一个分配给用户进程,另一个则分配给操作系统。换言之,每个进程均提供了一个假想,即该进程拥有一个最大为2GB、且可以加载代码或数据的虚拟内存空间。当然,在一部128兆的膝上型电脑上,如果你运行5个将其自身扩展至2GB大小的应用程序,显然,这些内存空间的一个子集在任何时候都存在于物理内存中。上述情况都是透明且在后台执行的。这便是虚拟内存无处不在的表现。就象任何使用虚拟内存技术的操作系统一样,Windows 2000仅将那些被进程占用的内存空间片段按其所需地引入物理内存之中。再次以记事本为例,当你运行Notepad.exe时,NT并不是在程序开始时就将Notepad.exe全部读入。它仅将碰巧被主线程执行途径所参考的可执行程序映像片段读入。同理,被记事本调用的动态链接库也不是在其被调用时即被从磁盘读入,而只有当这些动态链接库中的子例程被实际调用时,那些包含所需引用代码并存在于磁盘上的动态链接库片段才会按需求读入。
在屏幕的下半部分,2GB的系统沙箱因NT没有提供介于操作组件和驱动程序之间的保护而显得颇为引人注目。我相信,你们中许多从事NT系统管理的人都经历过因程序错误和第三方驱动程序而导致的蓝屏现象, NT也常因这些现象而受到指责,事实上,这是来自于第三方设备驱动程序中的错误所导致的,而NT遭受上述指责的原因之一便是因为NT的全部和所有的设备驱动程序都处在同一个沙箱之中。然而,每个进程都运行在其自身专用且受保护的沙箱之中,并不能影响其它的进程,同理,这些进程也不能影响操作系统,操作系统与驱动程序均存活在同一个沙箱中,而且,在驱动程序与操作系统之间并没有保护机制。现在,你也许会问,这是为什么?答案是性能。这就是每个事实上成功的32位操作系统的体制。必须将地址空间在驱动程序或操作之间进行切换也许会有很大的性能损失,但这里应强调注意的是,当添加驱动程序时,这种切换存在的原因之一就是让所有为驱动程序登记和Windows文件保护而对Windows 2000所进行的扩展均能够避免或限制管理员在未经全面验证和测试的情况下向系统沙箱中添加代码的偶然机会。
操作系统进程本质上并不存在。下面我们将会看到一种称作“系统”的进程。但那并不是指操作系统。在这些进程中,有一些操作系统的片段正在运行,但也有若干执行后台内务处理活动的进程同时存在。当记事本打开一个文件时,它产生一个系统调用来打开磁盘上的文件。这一打开磁盘文件的工作被产生该请求的记事本线程的上下文完成。在这种意义上,操作系统运行于记事本进程的内部,而由于操作系统恰恰是一个由那些产生诸如打开文件、读取文件、分配虚拟内存及创建进程等用户线程调用的大的子例程库,故而它也同样运行于其它每一个进程之中。
Windows 2000添加了允许将多个进程群集为一个作业的新对象。一个作业由一个或多个共享同一套配额、限制及其它设置的进程组成,而这些设置仅在逐个进程的基础上可用。例如,如果你有一个运行于Windows 2000上的Batch Server系统,而且,你想要为某一特定客户限定其作业中的活动进程数量,这是有可能的——作为作业的一个属性,活动进程限制是可以设置的;再比如,你想设定该作业应使用50兆以上的内存,这里也有办法来指定该作业可使用的最大内存容量,而且,该作业仍将包括执行全面作业片段的若干进程。
如果你看一看Windows 2000 Server和Windows 2000Advanced Server的话,你或许根本不会注意到作业对象的存在。这是因为,除非你创建了一个作业对象并使用性能监视器来对它进行观察,否则,在用户界面上将不会有任何东西来指示该作业对象已被添加到系统中。Windows 2000 DataCenter Server将提供一种称作进程控制管理器的工具,该工具将允许系统管理员创建作业对象,同时,将进程指定给作业对象并为其指定在本张幻灯片上所示的限制与配额。作业对象可谓是为第三方应用程序的使用而定制的Windows 2000基本组成要素。你可以希望批处理系统一开始就使用作业对象,同样,进程控制管理器和数据中心也将利用这一内核对象。
在此,我想提及作业对象的一个方面——调度级别,它对于大规模服务器而言是非常有趣的,尽管我们不是在谈论Windows 2000中线程的调度问题,而关于作业调度级别属性有趣的东西则是它允许对线程执行中的一个重要方面进行控制,要知道,这在Windows NT 4.0中是不能被设定的。调度级别是从0到9之间的一个数字。5是默认值。如数值被提高到5以上,调度级别将使进程中的线程在轮到它运行时运行更长的时间;反之,若数值降至5以下,调度级别则将缩短线程的运行时间长度。这就是级别调度,换言之,可以说某一工作占用了20%的CPU,而另一工作占用了50%的CPU。在Windows NT 4.0中,这种级别调度是不可达成的。有人或许认为,“我能够提高一个进程的优先级,而这样做将提供给该线程更多的运行时间”,但是,这样做会把全部运行时间都赋予这个进程。因此,如果你同时运行两个进程,其中一个进程的优先级高于另一个,它们都将试图运行,而具备更高优先级的进程则基本上占用100%的CPU。这种调度级别属性现在允许根据CPU时间的百分比对CPU进行相应的分区,而这在我看来可谓是作业对象所带来的一个非常令人兴奋的能力。
现在,观察NT中基本进程和线程信息的工作有点令人头痛,这主要是由于能够显示关于同一基本信息(进程列表)的不同子集的工具大量存在。一些工具也显示在每个进程中存在的线程。尽管众多能够显示进程和线程列表的工具往往均引用来自同一数据源的信息,但这些工具中的每一种也都能显示其它工具所不能提供的独一无二的信息片段。在此,我们将使用它们中的两个进行示范,这两个工具满足了观察进程和线程信息的主要需要,但我也应说明,其它工具也具备相应的功能,只是在本次讲座未予采用。另一个阻碍理解“是什么正处于运行之中”这一问题的因素是正在运行着的映像的名字,例如,Notepad.exe或许代表着正在执行着的程序名,但也可能并不代表正在执行着的程序名。换言之,一个可执行文件的名字或许并不能为你指示它是哪个产品的组成部分、它来自于哪个目录。因此,系统管理员在Windows 2000系统中观察进程活动时所应做的基本工作之一便是可执行程序究竟来自磁盘的哪个角落。如果你知道进程存在于哪个程序文件夹中,例如Microsoft Office,或存在于你的Win NT System 32目录中,如果你还知道那个文件夹是什么,那么,你将能够对该进程出自什么组件有所认识。
这个讲座假设你已经熟悉基本的操作系统概念,如进程的概念、多任务的概念、虚拟内存、分页等等;并且你是一个有经验的NT用户——不必是一名系统管理员,但至少应是一个权威的NT用户。
这个讲座结束后,你将能够使用一系列不同的工具来观察进程内部的活动,以便发现哪个文件被打开、IO操作的来源和目标、哪些动态连接库(DLL)正在由一个进程使用以及它们是从磁盘上的何处装入的、有关进程安全性的一些细节。
像我提到的那样,本讲座的目的之一是能够解释CPU时间。因此,如果CPU正在运行,那么它正在做什么并且为什么这样做呢?时间花费在那里以及如何被占用:是由操作系统、设备驱动程序、执行体还是应用程序所使用呢?理解NT操作系统上运行内容的另一个方面,是知道存在哪些系统进程。因此,如果某事务正在运行并且它不是由你所运行的,那么它是NT的一部分。正在运行的进程的作用是什么,并且你如何能够追踪到其占用CPU时间的可能原因呢?其中一个方面是由Windows NT 系统进程组成的Windows NT 服务,有时,正在运行的服务进程向后映射到哪些管理员通过管理界面可以看到的服务并不是非常清楚。
最后,我们来密切关注存在于系统进程这一非常特殊的进程中的粒度水平,该系统进程包含特殊种类的驱动程序线程运行片段和NT片段,而且,由于这种特殊进程的存在,促使我们务必深入钻研以理解进程中的哪些片段正在运行及其原因。
这有为本次讲座准备的路线图。首先我将对有关工具及其来源进行简明概述。这将是一堂高度依赖工具的讲座,而我将在此使用支持工具包、资源工具箱及Internet上获取的部分工具。接着,我们将从三个角度来观察NT系统活动:首先是进程和线程,接下来是中断时间及其在NT中的服务与解释机理,最后,再对系统进程树进行遍历。
最后的题目是一种我们不希望发生、却又经常遇到的进程活动,即当进程死亡时看到Dr. Watson信息时的情况。我们将看到是什么导致了Dr. Watson,你能进一步得到哪些信息,以及你应如何应对这些输出。
首先让我们先看一看工具。这是一个关于本次讲座所使用到工具的总概括。性能监视器——它理所当然地在对NT系统活动的观察中发挥关键性作用。我们还将看到一些注册表键。注册表是NT用来对其自身进行配置的系统数据库,因此,它包括了有助于理解程序在何处运行、来自何处,以及将服务名称映射到映像名称上的信息。接下来,我们将探究两个来自于支持工具包中的进程观察工具……对于初次接触Windows 2000的人而言,该支持工具包在NT 4.0中并不存在。曾经有一个NT 4.0资源工具包的有限子集,它与Service Pack 4.0相捆绑并称作Windows NT资源工具箱支持工具,该工具包在Windows 2000中已经更名为Windows 2000支持工具,以此来消除在它与资源工具之间存在的混淆概念。它是每个Windows NT和Windows 2000销售版本的组成部分。它存在于支持工具文件夹中。它使用一个适当的安装程序来安装。它包括了40至50种集成在资源工具包中的工具,但该工具包对Windows 2000用户而言是至关重要、不可或缺的。我将使用来自资源工具包的两个工具。它们是资源工具包所含200多种工具中的一分子,而我将强力推荐,如果你还未曾对资源工具包中的工具进行过浏览的话,这两个工具是支持工具的一套重要附件,通过它们,你将能够洞悉NT系统并理解其内部活动。
接下来列出的4个工具来自www.sysinternals.com网站。你也许已对该网站十分熟悉。它过去称为NT Internals。在此我将进入其主页以使你们看到该网站的面貌。Sysinternals是自由软件网站,这里有所有可免费下载的工具。这些工具中的大多数源代码也是公开的,这些工具被设计用来透过支持界面获取有关NT的信息,而这些信息往往是通过标准Microsoft工具所不能访问到的。大多数NT管理员对此十分熟悉,你们将在讲座期间看到其中两个工具的使用情况。
那么,让我们从最基本水平上的进程与线程活动开始,在开始之前,先来定义一下有关术语。进程与线程的区别到底是什么?进程是执行程序的实例。例如,当你运行记事本程序(Nodepad)时,你就创建了一个用来容纳组成Notepad.exe的代码及其所需调用动态链接库的进程。NT中的每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。我这里以沙箱为例进行阐述。
一个进程就好比一个沙箱。线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就象一个被保护起来的沙箱。未经许可,无人可以进出。这就是NT中强大的内存保护模型的形成机制,正是由于这种机理,才使NT明显区别于Windows 3.1、Windows 95及Windows 98。
在Windows NT和Windows 2000中,程序、程序实例或者进程对其它进程的执行情况或内存空间施加影响是不可能的。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。
NT运行线程。换言之,线程运行而进程不运行。每个进程包含单一线程,因此,当你运行记事本时,就生成相应的进程沙箱用来容纳代码和数据,而一个线程则被创建用以在指向记事本程序的主要入口起点处开始执行过程。一旦该线程在运行,它就可以创建额外的线程,一个进程的多个线程并行进行调度,这使多线程编程非常复杂,每个线程均共享其所处进程中的专用内存空间。因此,在本张幻灯片的阐述中,进程中所示的三个线程(都具有同时运行的潜在能力)均对进程中的专用数据或地址空间享有同等的访问权限,这样一来,三个线程就必须彼此同步。
那么,为什么要有多线程呢?为什么程序员选择将程序分割成多个线程呢?有两个原因:1)它产生了更佳响应性的幻觉。以Microsoft Word为例。当你进行文件打印时,你就已默认选择了后台打印方式,打印处理会在你继续编辑文档的同时异步进行。这是如何发生的呢?Word已创建了独立的线程来进行打印处理,并将打印线程的优先级设定低于处理用户输入的线程,由此,给用户提供了一种幻觉,即应用程序通过将相对优先级指定给不同线程的方式来对用户做出响应。但是,你在Win 98和Windows 95中无法得到,而在Windows 2000与Windows NT 4.0中能够得到的最大好处还在于,如果你工作在多处理器系统中,并且如果有多个线程要运行,这些线程事实上将能够在可用的处理器上同时运行。换言之,多线程应用程序能够自动地运行于可用处理器上,只要:A)该应用程序有一个以上的线程需要同时运行;B)这些线程的优先级支持该应用程序的运行。换言之,如果有具备更高优先级的线程存在于另一个CPU上……尽管你的应用程序有两个需要运行的线程,而因为在别的CPU上正执行着更为重要的任务,那么,也只能一次运行一个线程。
技巧问题。添加第二个处理器能使单一线程应用程序更快地运行吗?让我们设想你有一个非常简单的计算密集型、单一线程应用程序。它除了做计算工作之外还是做计算工作。添加一个处理器会使该应用程序更快地运行吗?好吧,你的第一反应是不,但答案却是肯定的,因为NT也有自身几个片段作为线程运行。如大多数操作系统一样,NT也拥有后台内务管理工作。因此,添加第二个处理器就意味着,当主要的计算密集型应用程序在无须短暂中断以执行后台操作系统内务处理活动的情况下仍能持续运行时,这类后台内务处理工作将会发生。
以上就是对进程和线程的简要描述。当考虑沙箱的规划时,NT和Windows 2000是一个32位的操作系统。如果算一下就会知道,32位意味着4GB。默认情况下,NT将这4GB地址空间分割为两个2GB的地址空间,其中一个分配给用户进程,另一个则分配给操作系统。换言之,每个进程均提供了一个假想,即该进程拥有一个最大为2GB、且可以加载代码或数据的虚拟内存空间。当然,在一部128兆的膝上型电脑上,如果你运行5个将其自身扩展至2GB大小的应用程序,显然,这些内存空间的一个子集在任何时候都存在于物理内存中。上述情况都是透明且在后台执行的。这便是虚拟内存无处不在的表现。就象任何使用虚拟内存技术的操作系统一样,Windows 2000仅将那些被进程占用的内存空间片段按其所需地引入物理内存之中。再次以记事本为例,当你运行Notepad.exe时,NT并不是在程序开始时就将Notepad.exe全部读入。它仅将碰巧被主线程执行途径所参考的可执行程序映像片段读入。同理,被记事本调用的动态链接库也不是在其被调用时即被从磁盘读入,而只有当这些动态链接库中的子例程被实际调用时,那些包含所需引用代码并存在于磁盘上的动态链接库片段才会按需求读入。
在屏幕的下半部分,2GB的系统沙箱因NT没有提供介于操作组件和驱动程序之间的保护而显得颇为引人注目。我相信,你们中许多从事NT系统管理的人都经历过因程序错误和第三方驱动程序而导致的蓝屏现象, NT也常因这些现象而受到指责,事实上,这是来自于第三方设备驱动程序中的错误所导致的,而NT遭受上述指责的原因之一便是因为NT的全部和所有的设备驱动程序都处在同一个沙箱之中。然而,每个进程都运行在其自身专用且受保护的沙箱之中,并不能影响其它的进程,同理,这些进程也不能影响操作系统,操作系统与驱动程序均存活在同一个沙箱中,而且,在驱动程序与操作系统之间并没有保护机制。现在,你也许会问,这是为什么?答案是性能。这就是每个事实上成功的32位操作系统的体制。必须将地址空间在驱动程序或操作之间进行切换也许会有很大的性能损失,但这里应强调注意的是,当添加驱动程序时,这种切换存在的原因之一就是让所有为驱动程序登记和Windows文件保护而对Windows 2000所进行的扩展均能够避免或限制管理员在未经全面验证和测试的情况下向系统沙箱中添加代码的偶然机会。
操作系统进程本质上并不存在。下面我们将会看到一种称作“系统”的进程。但那并不是指操作系统。在这些进程中,有一些操作系统的片段正在运行,但也有若干执行后台内务处理活动的进程同时存在。当记事本打开一个文件时,它产生一个系统调用来打开磁盘上的文件。这一打开磁盘文件的工作被产生该请求的记事本线程的上下文完成。在这种意义上,操作系统运行于记事本进程的内部,而由于操作系统恰恰是一个由那些产生诸如打开文件、读取文件、分配虚拟内存及创建进程等用户线程调用的大的子例程库,故而它也同样运行于其它每一个进程之中。
Windows 2000添加了允许将多个进程群集为一个作业的新对象。一个作业由一个或多个共享同一套配额、限制及其它设置的进程组成,而这些设置仅在逐个进程的基础上可用。例如,如果你有一个运行于Windows 2000上的Batch Server系统,而且,你想要为某一特定客户限定其作业中的活动进程数量,这是有可能的——作为作业的一个属性,活动进程限制是可以设置的;再比如,你想设定该作业应使用50兆以上的内存,这里也有办法来指定该作业可使用的最大内存容量,而且,该作业仍将包括执行全面作业片段的若干进程。
如果你看一看Windows 2000 Server和Windows 2000Advanced Server的话,你或许根本不会注意到作业对象的存在。这是因为,除非你创建了一个作业对象并使用性能监视器来对它进行观察,否则,在用户界面上将不会有任何东西来指示该作业对象已被添加到系统中。Windows 2000 DataCenter Server将提供一种称作进程控制管理器的工具,该工具将允许系统管理员创建作业对象,同时,将进程指定给作业对象并为其指定在本张幻灯片上所示的限制与配额。作业对象可谓是为第三方应用程序的使用而定制的Windows 2000基本组成要素。你可以希望批处理系统一开始就使用作业对象,同样,进程控制管理器和数据中心也将利用这一内核对象。
在此,我想提及作业对象的一个方面——调度级别,它对于大规模服务器而言是非常有趣的,尽管我们不是在谈论Windows 2000中线程的调度问题,而关于作业调度级别属性有趣的东西则是它允许对线程执行中的一个重要方面进行控制,要知道,这在Windows NT 4.0中是不能被设定的。调度级别是从0到9之间的一个数字。5是默认值。如数值被提高到5以上,调度级别将使进程中的线程在轮到它运行时运行更长的时间;反之,若数值降至5以下,调度级别则将缩短线程的运行时间长度。这就是级别调度,换言之,可以说某一工作占用了20%的CPU,而另一工作占用了50%的CPU。在Windows NT 4.0中,这种级别调度是不可达成的。有人或许认为,“我能够提高一个进程的优先级,而这样做将提供给该线程更多的运行时间”,但是,这样做会把全部运行时间都赋予这个进程。因此,如果你同时运行两个进程,其中一个进程的优先级高于另一个,它们都将试图运行,而具备更高优先级的进程则基本上占用100%的CPU。这种调度级别属性现在允许根据CPU时间的百分比对CPU进行相应的分区,而这在我看来可谓是作业对象所带来的一个非常令人兴奋的能力。
现在,观察NT中基本进程和线程信息的工作有点令人头痛,这主要是由于能够显示关于同一基本信息(进程列表)的不同子集的工具大量存在。一些工具也显示在每个进程中存在的线程。尽管众多能够显示进程和线程列表的工具往往均引用来自同一数据源的信息,但这些工具中的每一种也都能显示其它工具所不能提供的独一无二的信息片段。在此,我们将使用它们中的两个进行示范,这两个工具满足了观察进程和线程信息的主要需要,但我也应说明,其它工具也具备相应的功能,只是在本次讲座未予采用。另一个阻碍理解“是什么正处于运行之中”这一问题的因素是正在运行着的映像的名字,例如,Notepad.exe或许代表着正在执行着的程序名,但也可能并不代表正在执行着的程序名。换言之,一个可执行文件的名字或许并不能为你指示它是哪个产品的组成部分、它来自于哪个目录。因此,系统管理员在Windows 2000系统中观察进程活动时所应做的基本工作之一便是可执行程序究竟来自磁盘的哪个角落。如果你知道进程存在于哪个程序文件夹中,例如Microsoft Office,或存在于你的Win NT System 32目录中,如果你还知道那个文件夹是什么,那么,你将能够对该进程出自什么组件有所认识。
- 推荐阅讯
- 在Win 2003系统中挖掘免费刻录软件
- Windows 2000中蓝屏死机之停止信息分析
- 让Win2k也用上Win XP绚丽主题
- Windows 2003与 XP x64 SP2最新消息
- 设置Windows 2003系统防火墙
- Windows 2003系统中如何下安装WMP10
- 轻松恢复桌面
- 方便快捷 简化Win 2003域控制器密码
- Windows NT常见问题释疑
- Windows 2003终端服务的安装与激活
- 阅读排行
- 1.win2003最新优化方法大全之二
- 2.Windows 2003系统25招加速大法
- 3.Win2003最新优化方法大全之一
- 4.Win2003组策略和安全模板的应用
- 5.发挥Windows Server 2003远程桌面的作用
- 6.WinServer2003秘笈放送
- 7.图解硬盘低级格式化探密
- 8.系统磁盘碎片整理的技巧
- 9.Windows变慢原因分析及解决方法
- 10.活用大师和兔子 系统更快更安全
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
