当前位置: 首页 > 图文教程 > 网络安全 > 安全基础 > 系统资源泄漏的问题和对策

安全基础
实现高效安全的网络访问控制的解决方案
学会利用加密方法保障电子邮件系统安全
新手入门:常见的病毒前缀的解释
通讯录导进Gmail的经验操作技巧
保障局域网访问internet的速度与安全的技巧
局域网的网上邻居中隐藏共享文件夹
常用的防范sniffer的方法
排除无线网络安全隐患的八大主流技术
outlook或foxmail邮件转入evolution的方法
在浏览器中直接查看照片的EXIF信息
U盘病毒彻底防御办法
多余的本地连接删除的方法
v6677.cn强制设为首页后怎么办?
电脑感染木马桌面多IE图标无法删除
正版用户如何删除产品密钥
如何全面防范邮件病毒的侵蚀
局域网内部禁止修改IP地址
网络钓鱼诈骗也可以专挑有钱人?
视频文件会存在病毒怎么杀毒?
看似不起眼的小动作破坏你计算机安全策略

安全基础 中的 系统资源泄漏的问题和对策


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 57 ::
收藏到网摘: n/a

有人说,如果使用Windows98,那么在使用了3个小时以后,最好能重新启动一次,因为它太累了。事实上确实如此,但并不是因为它太累了,而是因为系统资源的泄漏。

  一、系统资源

  谈到Windows时,有一个必说的话题--系统资源(System Resource),但系统资源到底是什么,有人说是指CPU,有人说是指硬盘空间,有人说是指内存……

  当应用程序在Windows中运行时,Windows必须实时"跟踪"该应用程序的运行,并保留与之相关的许多信息,如按钮、光标、菜单的位置和位图、窗口的状况等,这些信息由Windows保留在一种叫堆的内存块中,堆的英文为Heap。简单地说,堆是采用特殊机制管理的内存块。由Windows的一个系统内核User.exe管理的堆叫作User资源堆(User Resource Heap),由另一个系统内核Gdi.exe管理的堆叫作GDI资源堆(Graphical Device Interface Resource Heap,简称GDI Resource Heap),User资源堆和GDI资源堆合称为系统资源堆(System Resource Heap),习惯上就把它们叫作系统资源(System Resource)。

  微软将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,2MB)。

  从这里的系统资源分类和大小我们应该明白,不管CPU是P4还是486,内存是8M还是1G,所有Windows的用户都拥有同样大小的系统资源(堆),用户不能自己增加或减少系统资源的大小,这是由操作系统决定的,与硬件档次没有任何关系。

  Windows的User资源堆和GDI资源堆的可用(Free)空间称为可用 User资源和可用GDI资源,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才能安全地收回被这些程序占用的系统资源,此时可用系统资源才会恢复到原值。之所以这样设计,主要是考虑到要让Windows 9X能继续运行大量的16位应用程序。

  * 资源泄漏

  按上述解释,可用系统资源的不断减少是正常的,这是 Windows的设计目的之一。但是许多程序员在实际工作中还发现在其他一些情况下Windows也会不能完全收回系统资源,这也导致可用系统资源不断减少,程序员们称这种现象为资源泄漏(Resource Leak)。微软开始并未承认,但是随着证据的不断增加,最后还是不得不承认其中的一些现象是存在的。

  比如一个程序还未完成其加载过程时(即还没有启动完毕)就关闭它会造成资源泄漏,而且只有重新启动才能回收。

  另外一些应用程序退出后Windo