好了,在Windows 2000资源工具包中有一个称作PS的Visual Basic脚本,它是90个使用Windows 2000中某些新型基础结构(WMI,亦即Windows管理工具)的VB示范样本中的一员。WMI允许对许多在Windows 2000之前不能被访问的信息进行访问,而更重要的或许是,WMI允许在网络范围内访问那些以前只能在本地进行访问的信息。因此,通过PS VBS脚本,你将能够在远程系统上轻易地对进程列表进行观察。这里还有一个能够在远程系统上杀死进程的VB脚本。如果你还没有看过Windows 2000工具包中这90个零散的VB脚本示例的话,我极力推荐你去看一下。
但我们的首要问题是,无论在工作站还是在服务器上,如果进程看上去很慢,到底是什么正在运行着呢?对我来说,找出究竟是什么正在运行着的最快方法,就是调出任务管理器,翻到进程选项卡,并按CPU耗用时间片段进行排序。在我们这么做之前,先让我们将任务管理器作为我们的第一个进程浏览工具加以介绍,尽管任务管理器或许被看作是一个使用起来相当简单而清楚的工具,但选项卡的名称及所列示的信息仍可能不十分明确。因此,让我们调出在幻灯片中提及的任务管理器。
有3种方法来启动任务管理器。我将使用其中最快的一种,即组合键Ctrl+Shift+Esc。我按下Ctrl+Shift+Esc,我们看到的默认选项卡是应用程序选项卡。现在,如果我问你,这一列表是关于什么的,你会如何回答呢?不,这不是一个应用程序列表;不,这也不是一个进程列表。事实上,它是关于带有一套非常特殊的格式位的顶级可视窗口的列表,换言之,这是一个窗口列表,但表中的窗口并非系统中所有的窗口,也不是桌面上所有的可视的窗口,但总的来说,它是一个顶级且可视的窗口列表,你能通过在任务栏上直接点击或按Alt+Tab组合键来看到。
现在,窗口由线程拥有,而线程由进程拥有,这就是为什么存在将窗口映射到进程上这一选项的原因所在。如果我点击鼠标右键,转入进程,它将把我带到以高亮度显示的进程选项卡,现在,我点击鼠标将其置为反色(蓝色),就显示出拥有窗口的线程和拥有线程的进程。这里,我们看到了在窗口和进程之间的映射。现在,再次回到应用程序选项卡。
既然我们现在已知这是一个窗口列表,那么这个状态列又意味着什么呢?好的,窗口并没有运行。运行意味着拥有窗口的线程没有运行,而无响应则意味着拥有窗口的线程正在运行,它在后台运行。换言之,一个运行着的窗口就是一个正在接受鼠标输入,也就是图形用户界面输入的窗口。拥有窗口的线程当前处于等待状态,而你可以在该窗口上进行点击。因此,窗口的常态是运行状态。再重复一次,运行意味着拥有窗口的线程正等待你在该窗口上进行点击。窗口并没有运行。
无响应是当窗口看上去被挂起时你所看到的状态指示,或者说,该状态在视觉上暗示你,当你在窗口上方移动鼠标时,该窗口将不会标记出响应。你看到了什么?一个沙漏。沙漏简单地意味着拥有窗口的线程当前不接受图形用户界面输入。它并不一定意味着应用程序被挂起。该线程可能正忙于其它任务,或许只是在等待磁盘或网络上的IO,并且不久会转回到接受窗口输入的状态下。因此,当线程转回到等待图形用户界面输入的常态时,无响应有时仅仅是对线程自身的清除。当然,如果应用程序真的被挂起,并且线程将不会返回到窗口输入状态,那么,该窗口将显示为不再做出响应,你可以点击结束任务,该功能将向拥有窗口的线程发出一条信息以释放窗口。在应用程序选项卡上的结束任务选项不会关闭进程,且不一定关闭窗口。它发出一条友好的Mr. Thread信息,询问你是否要释放或关闭该窗口。这就是它所发出的信息。
让我们通过运行一个记事本拷贝来执行一次结束任务的快速演示,输入一些未经保存的文字并尝试关闭窗口。我将在任务管理器中选择记事本窗口,按下结束任务并注意在左边发生了什么。记事本收到了关闭窗口的请求并予以拒绝,我将不再重复上述操作,因为你尚未保存你所做的修改。与此同时,任务管理器对那个你要求它去关闭并释放的窗口已等得不耐烦了。换言之,那个你要求释放并关闭的窗口仍旧在那里。于是,任务管理器说道,嗨,我们不能结束这个程序。因为任务管理器正在等候来自于你的回应以返回窗口并检查程序点击取消的状态,所以它事实上已关闭这个窗口。如果你选择马上结束该程序,你将会失去一切未经保存的数据。按下现在结束按钮在某种意义上是一个危险的操作,因为这样一来就杀死了拥有线程的进程,而该线程已经在进行到半截的进程中处于激活状态。它一直在更新磁盘上的文件,进行网络IO,谁知道呢?故而,当你选择现在结束时,务必要小心从事,因为,拥有窗口的线程其所在的进程会从系统中释放,而没有任何挽留的余地。
现在,让我们看一下进程选项卡。这里的进程是指一系列进程,这些进程如我们前面所讲,是由它们所运行的可执行程序实例来识别的,这就是进程选项卡中的第一列给出了映射名称的原因。请注意,这里并没有进程名称列。进程并不拥有独立于其所归属实例的映射名称。换言之,如果你运行5个记事本拷贝,你将会看到5个称为Notepad.exe的进程。它们是如何彼此区别的呢?其中一种方式是通过它们的进程ID,因为每个进程都拥有其独一无二的编码。该进程ID由Windows NT或Windows 2000生成,并可以循环使用。因此,进程ID将不会越编越大,它们能够得到循环利用。
第三列是被进程中的线程所占用的CPU时间百分比。它不是CPU的编号,而是被进程占用的CPU时间百分比。在当前的展示中,我的系统基本上是空闲的。尽管系统看上去每一秒左右都只使用一小部分CPU时间,但该系统空闲进程仍旧耗用了大约99%的CPU时间。我们过一会儿将看到有关现象。
第四列,CPU时间,是CPU被进程中的线程累计占用的小时、分钟及秒数。请注意,我对进程中的线程使用占用一词。这并不一定意味着那就是进程已耗用的CPU时间总和,因为,如我们一会儿将看到的,NT计时的方式是,当特定的时钟间隔激发时,无论谁恰巧处于当前的线程中,它都将计算到CPU周期之内。通常情况下,在大多数NT系统中,时钟以10毫秒的间隔运行。每10毫秒NT的心脏就跳动一下。有一些驱动程序代码片段运行并显示谁是当前的线程。让我们将CPU时间的最后10毫秒记在它的帐上。因此,如果一个线程开始运行,并在持续运行8毫秒后完成,接着,第二个线程开始运行并持续了2毫秒,这时,时钟激发,请猜一猜这整整10毫秒的时钟周期到底记在了哪个线程的帐上?答案是第二个线程。因此,NT中存在一些固有的不准确性,而NT恰是以这种方式进行计时,实际情况也如是,大多数32位操作系统中都存在一个基于间隔的计时机制。请记住这一点,因为,有时当你观察线程所耗用的CPU总和时,会出现尽管该线程或许看上去已运行过数十万次,但其CPU时间占用量却可能是零或非常短暂的现象,那么,上述解释便是原因所在。上述是我们在任务管理器的进程选项卡中所能看到的基本信息列。
现在,如果你在查看菜单中选择列,该功能将允许你添加一些诸如IO计数器、IO读写等关于进程细节的额外列。这是Windows 2000的新特性,并能够允许以逐个进程的方式查看IO活动。在NT 4.0中,IO计数器是覆盖全系统和所有磁盘的。以逐个进程的方式跟踪IO操作是不可能的。就理解进程活动而言,这一附加功能是非常重要的,因为,现在我们能够看到系统上发生的IO是哪个进程所导致的。我已经添加了线程计数器,它表示进程中所包含的线程数量;我还添加了句柄计数器,它代表打开对象的数量。在本次讲座的后续部分,我们还将回头看一看打开句柄的有关内容。
最后,让我们转到性能选项卡。性能选项卡显示了200到300个能够通过性能监视器来显示的NT内核性能计数器中的13个计数器的值。我们再次看到了通常使用性能监视器工具来观察的核心系统性能计数器的一个小子集,而这上面的某些标签或许还不够清楚。例如,内存使用栏与物理用途并没有什么关系。这是系统中全部专用且指定的虚拟内存。我们将不会深入到这些细节中去,只是应搞清该显示区域中的一些项目可能使你在对系统容量限制做出决策之前能够进行深入推敲。这就是在外壳上的任务管理器。它是一个快捷工具。使用这个工具,你可以在一个缓慢的系统上发现那些令人讨厌的进程究竟是谁。这里再次调出任务管理器,按下Ctrl+Shift+Esc组合键,进入进程选项卡,单击CPU耗用情况,按CPU利用率对任务管理器的输出进行排序。请记住,每次调用任务管理器时,它均按进程ID进行排序,尽管进程ID并不是一个非常有用的排序顺序。因此,任务管理器并不能在你每次调用后保存有关设置。如果你希望按CPU耗用百分比进行排序,则必须单击CPU列。这是一种能够迅速找出哪个或哪些进程正在耗用系统中CPU时间的快捷方式。
现在,让我们转入进程查看器实用程序,也就是PViewer.exe。这是我们将要运行的Windows 2000支持工具中的一个,它显示了关于我们在后面将要进行的对系统进程加以研究的试验中所需的进程和线程的更多细节。现在,我们将通过依次单击开始菜单/程序/ Windows 2000支持工具/工具/进程浏览器来启动进程查看工具。初始显示区域是一个系统上的进程列表。请注意,有一种方法能够对远程工作站或服务器名称进行选择。与使用任务管理器查看进程不同,只要你拥有对远程工作站或服务器上注册表的访问许可,你就能够查看远程进程列表。这是因为,多数工具所显示的基本进程和线程信息实际上是通过执行注册表查询得以从系统恢复到NT性能记数器上的。现在,据我们所知,进程查看工具必须使用性能记数器机制的原因之一是,根据总分数查看列表中的第一个进程。那并不是一个真正的进程,也没有在任务管理器列表中予以披露,但如果你曾经使用过性能监视器的话,你会看到多数包含多重实例(例如进程对象)的性能计数器均拥有一个叫做划线总额的特殊内建实例名称,这里的划线总额就是一个被选择与性能监视器配合使用从而在所有对象实例范围内快速汇总计数器数值的实例。若你想对多种对象的一个或多个计数器进行快速汇总,进程查看则可谓是性能计数器机制中一个非常便利的特性。Pviewer的智能程度尚不足以显示这一点。它以进程的方式来显示。但它并不是一个进程。列表中第一个真正的进程是CMD。现在,请注意这些按可执行程序文件名的字母顺序来对进程进行排序的地方。CMD是按字母顺序排列的第一个可执行程序的文件名。别忘了,任务管理器是按进程ID进行排序的。任务管理器以十进制数来显示进程ID,而Pviewer则在映射名称后以十六进制数显示进程ID。
在优先时间与用户时间之间存在着明显的区分,这就提供了有关与在操作系统内部相比,每个进程在应用程序中耗费多少时间的指示。在讲座的以后部分,我们还将回头来看优先权与用户时间的对比,但应记住,Pviewer是使你能够更密切关注进程所占用的CPU时间从而掌握在应用程序与操作系统之间的时间耗用区别的工具之一。现在,当我单击从进程到进程,并将进程列表向下滚动时,在底部的显示区域中什么发生了变化?那就是线程列表。因为,如果你还对我们前面所作的描述有印象的话,该知道每个进程都包括一套线程。这些线程对每个进程来说都是专用的。显然,每个进程中的线程列表均应与下一个进程中的线程列表有所区别。如果我选定一个线程并点击它,进而将线程列表向下滚动,请注意在显示区域的最底端发生了什么改变。
Pviewer显示区域的最底端给出了包括优先级数值(从1到30之间)在内的每个线程的信息。上下文切换的次数也就是NT选择运行该线程的次数。现在,这儿有个线程看上去有点特别。它已被选中运行了58次,但其仅占用了1%秒的CPU时间。你还记得这种背离现象的原因吗?在以10毫秒为一周期的时钟间隔被激发时,该线程肯定未处于当前状态。还有一个例子,在服务主机中的进程5看上去根本没有运行过,但请大家看一看其上下文切换次数——76次。该线程被选择运行了76次。它实际上运行了76次。但它在以10毫秒为一周期的时钟间隔被激发时从未处于当前状态。因此,如果我们向上回到进程列表处,可看到该进程总共耗用的CPU时间仅为0.871秒,这一数值显然没有反映出该进程中所有线程在运行时所耗用的CPU时间总和。现在,请记住,我们将不会丢失CPU周期。NT也不会丢失CPU周期的轨迹。它只是以10毫秒的增量来计量各线程的CPU占用时间,因此,线程有时是被误计时的,但随着时间的推移,这种误差会被抵销,而不会成为真正的问题。
再就是进程查看工具。关于该工具的另一个说明是,如果你偶尔通过选定一个不同的计算机名并按下连接钮来它查看远程系统的话,一个按钮就会消失。你会因此失去一部分功能,消失的按钮就是杀死进程按钮。杀死进程功能消失的原因是……你们还记得Pviewer是如何在进程列表中得以检索的吗?是通过注册表。当我通过注册表查看远程进程列表时,我能够从远程查询该注册表,并读取进程列表,但注册表并非一种控制机制。我并不能通过注册表杀死一个进程。因此,如果你想杀死另一台机器上的进程,有两个工具可以办得到。一个是Windows 2000资源工具包中的杀死进程脚本——kill.bbs。它使用Windows 2000中新的WMI(亦即Windows管理规范)来访问那些远程进程控制操作,以前通过网络不能这样使用。另一个工具是资源工具包中称作远程杀死(remote kill)的客户服务器应用程序,该工具需要在你想要控制进程的远程服务器系统上安装服务器端程序。无论是通过kill.bbs还是远程杀死客户服务器应用程序,你都可以杀死一个进程。这两个工具均存在于Windows 2000资源工具包中。
现在,我们已使用两个工具查看了进程列表,而该列表则表现为平面结构。列表中没有显示父子关系,但事实上,当我们转入下一张幻灯片后,我们会看到NT保留了关于哪个进程创建了哪个进程的有关信息。换言之,谁是父亲?谁是儿子?该层次结构通过Windows 2000支持工具包中一个称作Tlist的工具显示出来。现在,Tlist代表任务列表,但它也真的显示出进程列表。事实上,任务这个术语并不一定就意味着存在于NT内核中的一切。我将调出命令行方式,并在该方式中键入TList/t。Tlist所做的就是生成一个关于每个进程来自何处的父子关系展示,它通过使用简单的缩进格式来显示谁是父亲、谁是儿子。然而,Tlist充其量也只能与NT所记录的信息具有同等智能。我们回到幻灯片上,会注意到如果父进程已死,Tlist则将该进程向左对齐。这是因为NT只记录了父进程的ID。如果你的父亲已不在世,就无法追溯出你的祖父是谁。当Tlist发现一个子进程的父进程已不再运行时,就会将该进程向左对齐,并以此指明该进程是个孤儿。现在,当看到一个没有父进程的子进程时,就没有什么可值得稀奇的了。当你注销时,你的交互会话中的所有进程都会删除。
NT并不会因父进程消失而同时失去子进程。回来看Tlist/t的输出,我们会看到,在我的系统上,explore.exe刚才就是一个孤儿,它没有父进程,其原因就在于当你登录网络时,登录进程就会运行一个进而调用Explore的程序,而这个中介程序会在它完成使命时退出。Explore的全部子进程代表了今天我开始讲座以来运行的所有程序。例如,我从Internet Explorer实例开始。我运行了命令行方式。从命令行方式中,我又运行了PowerPoint和Tlist,而此时我也正通过运行Tlist来生成显示区域。就在展示上一张幻灯片时,我们还从开始按钮运行了进程查看工具,而开始按钮又由Explorer所拥有。TList/t是一个重要的诊测工具,因为,通过掌握某一进程的父进程或观察该进程在系统进程层次(或树型)结构中所处的位置,你能够迅速对该进程的来源进行分类。如果这个进程是Explorer的一个子进程,则该进程必然是从桌面图形用户界面开始运行的。如果这个进程是某一系统进程的子进程,则该进程必然是NT的某一片段。我们将在下下节中详细解剖系统进程树中的所有进程。因此,我们将先行回到显示区域的上半部分。
Windows 2000任务管理器中的新选项是结束进程树。但是,基于我前面所说的Windows NT没有保留比父进程ID更多的信息,那么,如果你试图结束进程任务树并且来自树中的所有进程均不再运行的话,将会有什么发生呢?任务管理器将会发现来自同一父进程的所有子进程吗?让我们进行一个快速演示。我将转到命令行方式,并通过键入CMD从该命令行方式中启动另一作为子进程的命令行方式。现在,我们将从第二个进程中运行画笔(亦即MS Paint)。这样一来,我们就有了一个树结构——一个命令行方式创建了另一个命令行方式,而另一个命令行方式创建了画笔(亦即MS Paint)。让我们通过执行Tlist/t来看一看该树状结构是如何显示的。这里,我们看到了父命令行方式、子命令行方式以及作为孙子的MS Paint。而问题是究竟发生了什么,首先,如果我退出这个编号为712的中介命令行方式,将会有什么发生呢?好的,让我们转到该中介命令行方式并键入EXIT,会留下什么呢?画笔仍然存在。因此,当父进程退出时,子进程并不也随之退出。这就出现了一个有趣的问题。如果我们现在通过按下Ctrl+Shift+Esc组合键调出任务管理器,转至应用程序选项卡,选中第一个命令行方式,单击鼠标右键,转入进程,进而找到拥有窗口的进程,这就是命令行方式的实例——CMB.exe,亦即拥有第一个窗口的进程。现在,如果我在进程树上单击鼠标右键,Windows 2000会发现画笔吗?请记住,画笔是该命令行方式的孙子。让我们来试一试,单击进程树。任务管理器警告我说,终止一个进程可能引起数据丢失——这是因为并不存在清除线程的机会。于是我接着做下去,单击是。画笔仍旧运行。为什么?再次解释一下,这是因为NT只保留创建进程者的踪迹,却并不保留祖父或孙子的踪迹。所以,请记住,你正在使用新的结束进程树选项。
现在,让我们看一下进程活动中另一个重要的信息片段,也就是哪个文件被哪个进程打开。Windows 2000或Windows NT中并未附带相应的工具来实现上述功能,然而这又的确是一项非常重要的诊测任务,因为,如果你遇到一个文件锁死错误,该文件肯定是被本地工作站或服务器上的某一进程所打开。不使用这张幻灯片上提及的工具,你就无法找出是谁打开了文件。
但我们的首要问题是,无论在工作站还是在服务器上,如果进程看上去很慢,到底是什么正在运行着呢?对我来说,找出究竟是什么正在运行着的最快方法,就是调出任务管理器,翻到进程选项卡,并按CPU耗用时间片段进行排序。在我们这么做之前,先让我们将任务管理器作为我们的第一个进程浏览工具加以介绍,尽管任务管理器或许被看作是一个使用起来相当简单而清楚的工具,但选项卡的名称及所列示的信息仍可能不十分明确。因此,让我们调出在幻灯片中提及的任务管理器。
有3种方法来启动任务管理器。我将使用其中最快的一种,即组合键Ctrl+Shift+Esc。我按下Ctrl+Shift+Esc,我们看到的默认选项卡是应用程序选项卡。现在,如果我问你,这一列表是关于什么的,你会如何回答呢?不,这不是一个应用程序列表;不,这也不是一个进程列表。事实上,它是关于带有一套非常特殊的格式位的顶级可视窗口的列表,换言之,这是一个窗口列表,但表中的窗口并非系统中所有的窗口,也不是桌面上所有的可视的窗口,但总的来说,它是一个顶级且可视的窗口列表,你能通过在任务栏上直接点击或按Alt+Tab组合键来看到。
现在,窗口由线程拥有,而线程由进程拥有,这就是为什么存在将窗口映射到进程上这一选项的原因所在。如果我点击鼠标右键,转入进程,它将把我带到以高亮度显示的进程选项卡,现在,我点击鼠标将其置为反色(蓝色),就显示出拥有窗口的线程和拥有线程的进程。这里,我们看到了在窗口和进程之间的映射。现在,再次回到应用程序选项卡。
既然我们现在已知这是一个窗口列表,那么这个状态列又意味着什么呢?好的,窗口并没有运行。运行意味着拥有窗口的线程没有运行,而无响应则意味着拥有窗口的线程正在运行,它在后台运行。换言之,一个运行着的窗口就是一个正在接受鼠标输入,也就是图形用户界面输入的窗口。拥有窗口的线程当前处于等待状态,而你可以在该窗口上进行点击。因此,窗口的常态是运行状态。再重复一次,运行意味着拥有窗口的线程正等待你在该窗口上进行点击。窗口并没有运行。
无响应是当窗口看上去被挂起时你所看到的状态指示,或者说,该状态在视觉上暗示你,当你在窗口上方移动鼠标时,该窗口将不会标记出响应。你看到了什么?一个沙漏。沙漏简单地意味着拥有窗口的线程当前不接受图形用户界面输入。它并不一定意味着应用程序被挂起。该线程可能正忙于其它任务,或许只是在等待磁盘或网络上的IO,并且不久会转回到接受窗口输入的状态下。因此,当线程转回到等待图形用户界面输入的常态时,无响应有时仅仅是对线程自身的清除。当然,如果应用程序真的被挂起,并且线程将不会返回到窗口输入状态,那么,该窗口将显示为不再做出响应,你可以点击结束任务,该功能将向拥有窗口的线程发出一条信息以释放窗口。在应用程序选项卡上的结束任务选项不会关闭进程,且不一定关闭窗口。它发出一条友好的Mr. Thread信息,询问你是否要释放或关闭该窗口。这就是它所发出的信息。
让我们通过运行一个记事本拷贝来执行一次结束任务的快速演示,输入一些未经保存的文字并尝试关闭窗口。我将在任务管理器中选择记事本窗口,按下结束任务并注意在左边发生了什么。记事本收到了关闭窗口的请求并予以拒绝,我将不再重复上述操作,因为你尚未保存你所做的修改。与此同时,任务管理器对那个你要求它去关闭并释放的窗口已等得不耐烦了。换言之,那个你要求释放并关闭的窗口仍旧在那里。于是,任务管理器说道,嗨,我们不能结束这个程序。因为任务管理器正在等候来自于你的回应以返回窗口并检查程序点击取消的状态,所以它事实上已关闭这个窗口。如果你选择马上结束该程序,你将会失去一切未经保存的数据。按下现在结束按钮在某种意义上是一个危险的操作,因为这样一来就杀死了拥有线程的进程,而该线程已经在进行到半截的进程中处于激活状态。它一直在更新磁盘上的文件,进行网络IO,谁知道呢?故而,当你选择现在结束时,务必要小心从事,因为,拥有窗口的线程其所在的进程会从系统中释放,而没有任何挽留的余地。
现在,让我们看一下进程选项卡。这里的进程是指一系列进程,这些进程如我们前面所讲,是由它们所运行的可执行程序实例来识别的,这就是进程选项卡中的第一列给出了映射名称的原因。请注意,这里并没有进程名称列。进程并不拥有独立于其所归属实例的映射名称。换言之,如果你运行5个记事本拷贝,你将会看到5个称为Notepad.exe的进程。它们是如何彼此区别的呢?其中一种方式是通过它们的进程ID,因为每个进程都拥有其独一无二的编码。该进程ID由Windows NT或Windows 2000生成,并可以循环使用。因此,进程ID将不会越编越大,它们能够得到循环利用。
第三列是被进程中的线程所占用的CPU时间百分比。它不是CPU的编号,而是被进程占用的CPU时间百分比。在当前的展示中,我的系统基本上是空闲的。尽管系统看上去每一秒左右都只使用一小部分CPU时间,但该系统空闲进程仍旧耗用了大约99%的CPU时间。我们过一会儿将看到有关现象。
第四列,CPU时间,是CPU被进程中的线程累计占用的小时、分钟及秒数。请注意,我对进程中的线程使用占用一词。这并不一定意味着那就是进程已耗用的CPU时间总和,因为,如我们一会儿将看到的,NT计时的方式是,当特定的时钟间隔激发时,无论谁恰巧处于当前的线程中,它都将计算到CPU周期之内。通常情况下,在大多数NT系统中,时钟以10毫秒的间隔运行。每10毫秒NT的心脏就跳动一下。有一些驱动程序代码片段运行并显示谁是当前的线程。让我们将CPU时间的最后10毫秒记在它的帐上。因此,如果一个线程开始运行,并在持续运行8毫秒后完成,接着,第二个线程开始运行并持续了2毫秒,这时,时钟激发,请猜一猜这整整10毫秒的时钟周期到底记在了哪个线程的帐上?答案是第二个线程。因此,NT中存在一些固有的不准确性,而NT恰是以这种方式进行计时,实际情况也如是,大多数32位操作系统中都存在一个基于间隔的计时机制。请记住这一点,因为,有时当你观察线程所耗用的CPU总和时,会出现尽管该线程或许看上去已运行过数十万次,但其CPU时间占用量却可能是零或非常短暂的现象,那么,上述解释便是原因所在。上述是我们在任务管理器的进程选项卡中所能看到的基本信息列。
现在,如果你在查看菜单中选择列,该功能将允许你添加一些诸如IO计数器、IO读写等关于进程细节的额外列。这是Windows 2000的新特性,并能够允许以逐个进程的方式查看IO活动。在NT 4.0中,IO计数器是覆盖全系统和所有磁盘的。以逐个进程的方式跟踪IO操作是不可能的。就理解进程活动而言,这一附加功能是非常重要的,因为,现在我们能够看到系统上发生的IO是哪个进程所导致的。我已经添加了线程计数器,它表示进程中所包含的线程数量;我还添加了句柄计数器,它代表打开对象的数量。在本次讲座的后续部分,我们还将回头看一看打开句柄的有关内容。
最后,让我们转到性能选项卡。性能选项卡显示了200到300个能够通过性能监视器来显示的NT内核性能计数器中的13个计数器的值。我们再次看到了通常使用性能监视器工具来观察的核心系统性能计数器的一个小子集,而这上面的某些标签或许还不够清楚。例如,内存使用栏与物理用途并没有什么关系。这是系统中全部专用且指定的虚拟内存。我们将不会深入到这些细节中去,只是应搞清该显示区域中的一些项目可能使你在对系统容量限制做出决策之前能够进行深入推敲。这就是在外壳上的任务管理器。它是一个快捷工具。使用这个工具,你可以在一个缓慢的系统上发现那些令人讨厌的进程究竟是谁。这里再次调出任务管理器,按下Ctrl+Shift+Esc组合键,进入进程选项卡,单击CPU耗用情况,按CPU利用率对任务管理器的输出进行排序。请记住,每次调用任务管理器时,它均按进程ID进行排序,尽管进程ID并不是一个非常有用的排序顺序。因此,任务管理器并不能在你每次调用后保存有关设置。如果你希望按CPU耗用百分比进行排序,则必须单击CPU列。这是一种能够迅速找出哪个或哪些进程正在耗用系统中CPU时间的快捷方式。
现在,让我们转入进程查看器实用程序,也就是PViewer.exe。这是我们将要运行的Windows 2000支持工具中的一个,它显示了关于我们在后面将要进行的对系统进程加以研究的试验中所需的进程和线程的更多细节。现在,我们将通过依次单击开始菜单/程序/ Windows 2000支持工具/工具/进程浏览器来启动进程查看工具。初始显示区域是一个系统上的进程列表。请注意,有一种方法能够对远程工作站或服务器名称进行选择。与使用任务管理器查看进程不同,只要你拥有对远程工作站或服务器上注册表的访问许可,你就能够查看远程进程列表。这是因为,多数工具所显示的基本进程和线程信息实际上是通过执行注册表查询得以从系统恢复到NT性能记数器上的。现在,据我们所知,进程查看工具必须使用性能记数器机制的原因之一是,根据总分数查看列表中的第一个进程。那并不是一个真正的进程,也没有在任务管理器列表中予以披露,但如果你曾经使用过性能监视器的话,你会看到多数包含多重实例(例如进程对象)的性能计数器均拥有一个叫做划线总额的特殊内建实例名称,这里的划线总额就是一个被选择与性能监视器配合使用从而在所有对象实例范围内快速汇总计数器数值的实例。若你想对多种对象的一个或多个计数器进行快速汇总,进程查看则可谓是性能计数器机制中一个非常便利的特性。Pviewer的智能程度尚不足以显示这一点。它以进程的方式来显示。但它并不是一个进程。列表中第一个真正的进程是CMD。现在,请注意这些按可执行程序文件名的字母顺序来对进程进行排序的地方。CMD是按字母顺序排列的第一个可执行程序的文件名。别忘了,任务管理器是按进程ID进行排序的。任务管理器以十进制数来显示进程ID,而Pviewer则在映射名称后以十六进制数显示进程ID。
在优先时间与用户时间之间存在着明显的区分,这就提供了有关与在操作系统内部相比,每个进程在应用程序中耗费多少时间的指示。在讲座的以后部分,我们还将回头来看优先权与用户时间的对比,但应记住,Pviewer是使你能够更密切关注进程所占用的CPU时间从而掌握在应用程序与操作系统之间的时间耗用区别的工具之一。现在,当我单击从进程到进程,并将进程列表向下滚动时,在底部的显示区域中什么发生了变化?那就是线程列表。因为,如果你还对我们前面所作的描述有印象的话,该知道每个进程都包括一套线程。这些线程对每个进程来说都是专用的。显然,每个进程中的线程列表均应与下一个进程中的线程列表有所区别。如果我选定一个线程并点击它,进而将线程列表向下滚动,请注意在显示区域的最底端发生了什么改变。
Pviewer显示区域的最底端给出了包括优先级数值(从1到30之间)在内的每个线程的信息。上下文切换的次数也就是NT选择运行该线程的次数。现在,这儿有个线程看上去有点特别。它已被选中运行了58次,但其仅占用了1%秒的CPU时间。你还记得这种背离现象的原因吗?在以10毫秒为一周期的时钟间隔被激发时,该线程肯定未处于当前状态。还有一个例子,在服务主机中的进程5看上去根本没有运行过,但请大家看一看其上下文切换次数——76次。该线程被选择运行了76次。它实际上运行了76次。但它在以10毫秒为一周期的时钟间隔被激发时从未处于当前状态。因此,如果我们向上回到进程列表处,可看到该进程总共耗用的CPU时间仅为0.871秒,这一数值显然没有反映出该进程中所有线程在运行时所耗用的CPU时间总和。现在,请记住,我们将不会丢失CPU周期。NT也不会丢失CPU周期的轨迹。它只是以10毫秒的增量来计量各线程的CPU占用时间,因此,线程有时是被误计时的,但随着时间的推移,这种误差会被抵销,而不会成为真正的问题。
再就是进程查看工具。关于该工具的另一个说明是,如果你偶尔通过选定一个不同的计算机名并按下连接钮来它查看远程系统的话,一个按钮就会消失。你会因此失去一部分功能,消失的按钮就是杀死进程按钮。杀死进程功能消失的原因是……你们还记得Pviewer是如何在进程列表中得以检索的吗?是通过注册表。当我通过注册表查看远程进程列表时,我能够从远程查询该注册表,并读取进程列表,但注册表并非一种控制机制。我并不能通过注册表杀死一个进程。因此,如果你想杀死另一台机器上的进程,有两个工具可以办得到。一个是Windows 2000资源工具包中的杀死进程脚本——kill.bbs。它使用Windows 2000中新的WMI(亦即Windows管理规范)来访问那些远程进程控制操作,以前通过网络不能这样使用。另一个工具是资源工具包中称作远程杀死(remote kill)的客户服务器应用程序,该工具需要在你想要控制进程的远程服务器系统上安装服务器端程序。无论是通过kill.bbs还是远程杀死客户服务器应用程序,你都可以杀死一个进程。这两个工具均存在于Windows 2000资源工具包中。
现在,我们已使用两个工具查看了进程列表,而该列表则表现为平面结构。列表中没有显示父子关系,但事实上,当我们转入下一张幻灯片后,我们会看到NT保留了关于哪个进程创建了哪个进程的有关信息。换言之,谁是父亲?谁是儿子?该层次结构通过Windows 2000支持工具包中一个称作Tlist的工具显示出来。现在,Tlist代表任务列表,但它也真的显示出进程列表。事实上,任务这个术语并不一定就意味着存在于NT内核中的一切。我将调出命令行方式,并在该方式中键入TList/t。Tlist所做的就是生成一个关于每个进程来自何处的父子关系展示,它通过使用简单的缩进格式来显示谁是父亲、谁是儿子。然而,Tlist充其量也只能与NT所记录的信息具有同等智能。我们回到幻灯片上,会注意到如果父进程已死,Tlist则将该进程向左对齐。这是因为NT只记录了父进程的ID。如果你的父亲已不在世,就无法追溯出你的祖父是谁。当Tlist发现一个子进程的父进程已不再运行时,就会将该进程向左对齐,并以此指明该进程是个孤儿。现在,当看到一个没有父进程的子进程时,就没有什么可值得稀奇的了。当你注销时,你的交互会话中的所有进程都会删除。
NT并不会因父进程消失而同时失去子进程。回来看Tlist/t的输出,我们会看到,在我的系统上,explore.exe刚才就是一个孤儿,它没有父进程,其原因就在于当你登录网络时,登录进程就会运行一个进而调用Explore的程序,而这个中介程序会在它完成使命时退出。Explore的全部子进程代表了今天我开始讲座以来运行的所有程序。例如,我从Internet Explorer实例开始。我运行了命令行方式。从命令行方式中,我又运行了PowerPoint和Tlist,而此时我也正通过运行Tlist来生成显示区域。就在展示上一张幻灯片时,我们还从开始按钮运行了进程查看工具,而开始按钮又由Explorer所拥有。TList/t是一个重要的诊测工具,因为,通过掌握某一进程的父进程或观察该进程在系统进程层次(或树型)结构中所处的位置,你能够迅速对该进程的来源进行分类。如果这个进程是Explorer的一个子进程,则该进程必然是从桌面图形用户界面开始运行的。如果这个进程是某一系统进程的子进程,则该进程必然是NT的某一片段。我们将在下下节中详细解剖系统进程树中的所有进程。因此,我们将先行回到显示区域的上半部分。
Windows 2000任务管理器中的新选项是结束进程树。但是,基于我前面所说的Windows NT没有保留比父进程ID更多的信息,那么,如果你试图结束进程任务树并且来自树中的所有进程均不再运行的话,将会有什么发生呢?任务管理器将会发现来自同一父进程的所有子进程吗?让我们进行一个快速演示。我将转到命令行方式,并通过键入CMD从该命令行方式中启动另一作为子进程的命令行方式。现在,我们将从第二个进程中运行画笔(亦即MS Paint)。这样一来,我们就有了一个树结构——一个命令行方式创建了另一个命令行方式,而另一个命令行方式创建了画笔(亦即MS Paint)。让我们通过执行Tlist/t来看一看该树状结构是如何显示的。这里,我们看到了父命令行方式、子命令行方式以及作为孙子的MS Paint。而问题是究竟发生了什么,首先,如果我退出这个编号为712的中介命令行方式,将会有什么发生呢?好的,让我们转到该中介命令行方式并键入EXIT,会留下什么呢?画笔仍然存在。因此,当父进程退出时,子进程并不也随之退出。这就出现了一个有趣的问题。如果我们现在通过按下Ctrl+Shift+Esc组合键调出任务管理器,转至应用程序选项卡,选中第一个命令行方式,单击鼠标右键,转入进程,进而找到拥有窗口的进程,这就是命令行方式的实例——CMB.exe,亦即拥有第一个窗口的进程。现在,如果我在进程树上单击鼠标右键,Windows 2000会发现画笔吗?请记住,画笔是该命令行方式的孙子。让我们来试一试,单击进程树。任务管理器警告我说,终止一个进程可能引起数据丢失——这是因为并不存在清除线程的机会。于是我接着做下去,单击是。画笔仍旧运行。为什么?再次解释一下,这是因为NT只保留创建进程者的踪迹,却并不保留祖父或孙子的踪迹。所以,请记住,你正在使用新的结束进程树选项。
现在,让我们看一下进程活动中另一个重要的信息片段,也就是哪个文件被哪个进程打开。Windows 2000或Windows NT中并未附带相应的工具来实现上述功能,然而这又的确是一项非常重要的诊测任务,因为,如果你遇到一个文件锁死错误,该文件肯定是被本地工作站或服务器上的某一进程所打开。不使用这张幻灯片上提及的工具,你就无法找出是谁打开了文件。
- 推荐阅讯
- 重获新生:Win 2003操作系统14招加速大法
- Win 2000/XP中实现硬盘性能突破的方法
- Win 2000/2003中巧定光驱网络访问权限
- 理解Win2000 和 NT4 系统及进程活动之一
- Windows变慢原因分析及解决方法
- 纪念年华渐去的Windows 2000系统
- 用配置和工具提升Windows 2003系统安全
- 给您几点小建议
- windows2000下C盘权限设置
- 自动管理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攻击防范与解决方案 路由故障处理手册
