返回总目录 上一页 目录页 下一页

Win9x下系统资源的解释和分析


以下文章内容只针对Windows 9x系列,不能用于WinNT/2000/XP及后续NT核心的Windows版本

一、系统资源

Windows里面有一个不可忽略的问题:系统资源,但系统资源的定义是什么?恐怕知道的人不是很多。当应用程序在Windows里面运行时,Windows必须实时“跟踪”该应用程序的运行,并保留与之相关的许多信息,如:按钮、光标、菜单的位置和位图、窗口的状态等,这些信息由Windows保留在一种叫做堆的内存块中,堆的英文为Heap。简单的说,堆是采用特殊机制管理的内存块。由Windows的一个系统内核(User.exe)管理的堆叫做User资源堆,由另一个系统内核(GDI.exe)管理的堆叫做GDI资源堆。User资源堆和GDI资源堆合称为系统资源堆,习惯上就叫做系统资源。微软将Windows的系统资源(堆)分为五个堆,其中User资源堆为三个,而GDI资源堆为两个。三个User资源堆分别是:16位的用户堆(User Heap 64KB),32位的窗口堆(Windows Heap 2MB),32位的用户菜单堆(User Menu Heap 2MB)。两个GDI资源堆分别是16位的GDI堆(GDI Heap 64KB)和32位的GDI堆(GDI Heap 2MB)。从这里的系统资源的分类和大小我们应该明白,无论你的CPU是P4还是486,内存是8M还是1G,所有的Windows的用户都拥有同样大小的系统资源(堆),用户不能够自己增加或减少系统资源的大小,这是由操作系统规定的,与硬件的档次没有任何关系。Windows的User资源堆和GDI资源堆的可用空间称为可用User资源和可用GDI资源,Windows中以百分数的形式表示,我们可以利用Windows中的一个小工具------资源状况查询当前系统的可用资源。注意:典型安装模式是不会安装这个工具的,你可以在添加/删除里面的Windows组件里面选择安装。

二、系统资源为什么会减少

当一个应用程序在Windows 中被加载时,Windows 自动地将可用User 资源堆和可用GDI 资源堆中的一部分空间分配给它,而当应用程序退出时,这部分空间也应该由Windows 收回以交给别的应用程序使用。但实际上几乎所有的Windows用户都发现: 一个应用程序加载前和退出后可用系统资源的值是不相等的,而且随着应用程序的不断加载和退出, 随着Windows 使用时间的增加,资源状况显示的可用系统资源也在不断减少。

微软的正式解释是:

* 系统初始化 Windows 在启动时要进行系统初始化(System Initialization)的过程,Windows 的系统初始化属于延时初始化。例如,Windows 在启动时只初始化当前使用的字体,以后当应用程序要使用到尚未被初始化的字体时, Windows才会初始化该字体,这种由应用程序根据需要提出要求而发生的初始化服务就是所谓的延时初始化。对于属于延时初始化的服务,Windows 还采用了特别的管理方式,当向Windows提出延时初始化服务的应用程序退出后,与延时初始化服务相关的系统资源(例如上面提到的与新字体有关的系统资源)不会随着应用程序的退出而马上释放,这是造成应用程序加载前和退出后可用系统资源的值不相等的原因之一。Windows 不马上收回与延时初始化服务,是为了防止该应用程序或别的应用程序以后又向系统提出同样的初始化服务而导致系统不断重复服务而浪费时间。例如对于加载同一应用程序,第二次加载的时间会明显少于第一次,显然延时初始化功不可没。

* 兼容性 在Windows 中运行的所有16 位应用程序共享相同的地址空间,当其中某一个16 位应用程序正常退出或出现错误而被关闭时, Windows 9X 并不马上收回这个应用程序所占用的系统资源,这也是造成一个应用程序加载前和退出后可用系统资源的值不相等的又一个原因。只有当所有的16 位应用程序全部退出后,Windows 才能安全地收回被这些程序占用的系统资源,此时可用系统资源才会恢复到原值。之所以这样设计, 主要是考虑到要让Windows9x能够继续运行大量的16位应用程序。

*资源泄漏 按上述解释,可用的系统资源不断减少是正常的,这是Windows的设计目的之一。但是许多程序员在实际工作中发现在其他的一些情况下Windows也会不能够完全收回系统资源,这就导致了可用资源的不断减少,程序员称这种现象为资源泄漏。微软开始并未承认,但是随着证据的不断增加,最后还是不得不承认了其中的一些下现象的存在。造成资源泄漏这种现象的原因很多:使用Ctrl+Alt+Del强制关闭一个应用程序、程序上设计不完善等。

最后,Windows中不存在一个有着实际意义的系统资源,可用的系统资源一定等于可用USER资源和可用GDI资源中较小的那一个。Windows的可用User资源是根据所有User资源堆中可用空间最小的那个资源堆计算出来的,可用的GDI资源的计算方法也是一样的。为了保持与16位应用程序的兼容性,Windows 9x的大量数据都要使用16位的64KB的资源堆,这导致总是16位64KB的资源堆首先被大量消耗,因此在Windows 9X中,限制系统资源使用的是64KB的资源堆而不是2MB的资源堆。Windows本身也要占用系统资源,绝对没有那个用户的可用系统资源是100%,保持更多的系统资源的方法是不要同时运行大型程序,而且最好保持在10%以上可用。如果可用系统资源不足,最有效的方法是重新启动。另外,不要把系统资源和CPU可用资源相混淆,2者是不同的。

w w w. 1 6 3 1 6 4 .c n

返回总目录 上一页 目录页 下一页