分节阅读 3(1 / 1)

黑客技术大宝库 佚名 5042 字 4个月前

程究竟是谁。这里再次调出任务管理器,按下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中并未附带相应的工具来实现上述功能,然而这又的确是一项非常重要的诊测任务,因为,如果你遇到一个文件锁死错误,该文件肯定是被本地工作站或服务器上的某一进程所打开。不使用这张幻灯片上提及的工具,你就无法找出是谁打开了文件。

打开文件的另一重要方面则体现在当应用程序包含无法关闭文件错误的情况下。它将其自身表现为一个系统内存泄露,因为,每个打开的文件都占用一部分系统内存。因此,在有应用程序不断打开对象而不去关闭它们的系统上,nt会因这些不去关闭句柄的应用程序而耗尽系统资源。

首先,让我们看一看任务管理器是如何快速查看由进程所打开的句柄数量的。我按下ctrl+shift+esc组合键以调出任务管理器,刚才,当我们观看有关设置时,我已经添加了一列信息以显示每个进程所打开的句柄总数,而我马上将把鼠标移到这一列上。如果我在句柄列上单击鼠标,任务管理器将按打开句柄数量的大小顺序对进程进行排序。在这儿,我们看到了一个名为servicehost.exe、拥有760个打开句柄的进程,我们将稍后再看它。如果你有一个不关闭句柄的应用程序,这就是该看到的数字。而这一列也是应进行检查的。你也能够就整个系统范围查看这一数据的值,因为,在性能选项卡下包括系统内的句柄总数、线程总数及进程总数。如果你挂起了句柄泄露,应查看一下句柄总数。如果该数字呈缓慢上升趋势,则应到进程选项卡选中句柄列,并将其按打开句柄的数量进行排序,于是,你将能够迅速标识出那些没有关闭句柄的进程。当你结束一个进程时,该进程中的所有句柄都应关闭,其所占用的系统资源也都将予以返还。这就是查看句柄信息的一个方面。另一个方面则是搞清这些句柄是为哪些对象而打开的。换言之,这760个句柄都代表着什么?它们是代表文件、网络对象、注册表键、线程和进程、亦或别的什么东西?这个问题就把我们引到了能使我们查看一个进程所打开句柄表的两个工具上。

第一个是oh工具。oh代表打开句柄,这是windows 2000资源工具包中的一个工具。出于确保oh工作的考虑,oh工具必须在系统重新引导时才读取的注册表中设置一个特殊内部标志,因此,你需要在首次使用该工具时重新引导系统。这种特殊标志能使nt保留比通常情况下多一些的打开句柄信息。在