分节阅读 2(1 / 1)

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

一个作业的新对象。一个作业由一个或多个共享同一套配额、限制及其它设置的进程组成,而这些设置仅在逐个进程的基础上可用。例如,如果你有一个运行于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目录中,如果你还知道那个文件夹是什么,那么,你将能够对该进程出自什么组件有所认识。

好了,在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个计数器的值。我们再次看到了通常使用性能监视器工具来观察的核心系统性能计数器的一个小子集,而这上面的某些标签或许还不够清楚。例如,内存使用栏与物理用途并没有什么关系。这是系统中全部专用且指定的虚拟内存。我们将不会深入到这些细节中去,只是应搞清该显示区域中的一些项目可能使你在对系统容量限制做出决策之前能够进行深入推敲。这就是在外壳上的任务管理器。它是一个快捷工具。使用这个工具,你可以在一个缓慢的系统上发现那些令人讨厌的进