返回列表 发帖

[经验交流] Windows内存管理机密+揭穿内存优化工具的骗局

Windows内存管理机密+揭穿内存优化工具的骗局
盆盆译注 4月12日的Webcast,盆盆介绍了Windows Vista最新的内存管理技术SuperFetch。在Webcast的最后,盆盆推荐了Mark Russinovich的一篇揭穿内存优化工具骗局的文章,并承诺会将它翻译成中文,并且加上盆盆自己做的注释,在ITECN博客上分享给大家。以下就是这篇文章的中文译稿,敬请大家批评指正!
我们在浏览网页时,也许会经常看到一些弹出广告,例如“整理内存碎片、提升系统性能”、或者“大大减少系统和程序崩溃的可能性,回收·内存”等等。如果点击这些弹出广告链接,则会看到某些所谓的工具软件,声称只需花费9.95、14.95或者29.95美元,就可以轻松实现所有的功能。看上去,这些工具软件确实不错,但是实际上最好的情况,这些所谓的内存优化工具没有任何效用;而最差的情况,则可能会严重降低系统性能。
盆盆评注 在国内,广告语更加精彩,“让您的系统运行如飞”、“让Windows插翅能飞”,充分体现汉语的优越性。
市面上这些所谓的“内存优化工具”有很多—有些是商业软件,有些则是自由软件。可能我们已经在系统上安装了这些软件。这些软件到底能够起什么作用?它们是怎样试图愚弄我们,让我们误认为它们可以达到所承诺的目的? 那就让我们一起好好分析一下内存优化程序的内部原理,看看它们如何让Windows内存计数器显示出诱人的结果。
用户界面
通常,内存优化工具会在用户界面上显示一个图形标签,以表明当前的可用内存,还会显示一个指示条,以表明当前设置的阈值,超过这个阈值,该工具就会开始行动(所谓的优化内存)。还有一个指示条,用来显示优化工具可以释放的内存容量。通常用户可以配置以上两种或者其中一种设置,还可以手动触发内存优化,或者设置计划任务。某些工具还会详细显示执行过程。
当执行内存优化的计划任务时,通常这些程序的可用内存计数器会上升,有时候还可以显示动态效果,给人的感觉好像是这些工具确实正在释放内存,以供我们的应用程序使用。要理解这些内存优化工具如何让可用内存的数字不断上升,我们必须理解Windows是如何管理物理内存的。
Windows内存管理
和大多数现代操作系统一样,Windows实现按需调页的虚拟内存机制。由于操作系统使用了虚拟内存,这就给应用程序造成了一个假象,以为计算机安装的内存远远超过自己所需要的数量。
在32位的Windows计算机上,进程具有4GB的虚拟内存地址空间,操作系统通常会把这4GB的地址空间划分为进程和系统两个部分。因此,每个进程可以获得2GB的虚拟内存,根据可用的容量。分配给所有进程的虚拟内存总数不能超过页面文件和大多数物理内存的总和(操作系统本身也要占据一小部分物理内存)。
有了这种机制,加上足够大的页面文件,就可以给进程分配超过物理内存容量的虚拟内存,Windows内存管理子系统必须让多个进程和缓存的文件数据(由缓存管理器管理)共享物理内存。如图1所示,内存管理器给每个进程(例如Windows Explorer、记事本和Word)指派一部分物理内存,这叫做进程的工作集。可分页的内核和驱动程序部分,加上可分页的内核内存缓冲区(叫做分页池),还有缓存管理器所管理的物理内存,它们具有自己的工作集,叫做系统工作集。
http://blogs.itecn.net/photos/ahpeng/images/13080/original.aspx
图1
盆盆译注:可分页表示可以经过调页转移到页面文件上,以便空出可用内存供其他进程使用。但是有些重要部分是不可以进行分页的,例如内存管理器本身就不能分页,还有凭据缓存里的重要凭据信息(例如长期密钥、Kerberos票据等)都不能进行分页。
工作集就是进程在物理内存中的部分,可以用一个队列(数据结构)来表示。也就是说如果进程访问的页在工作集里,就不会发生页面错误事件。话反过来说,如果进程所需访问的页不在工作集中,就必须进行分页操作。
内存管理器可以扩展或者缩短系统和进程的工作集,以便让进程可以快速访问其代码和数据。计算机的内存管理硬件设备要求Windows按照“页”的块级别来管理工作集和虚拟内存。在32位的x86处理器上,页通常是4096字节(4KB)。然而操作系统和其他需要大量访问内存的应用程序,也可以使用4MB的“页”,以便优化性能。
盆盆译注:为什么使用4MB的“页”可以优化性能?通过阅读《Windows Internals》第七章内存管理部分,我们可以了解到,Windows的内存管理采用TLB的硬件数据结构来缓存页表里的数据。如果采用4MB的页,由于总的页数比较少,TLB缓存中的项就不需要经常刷新,这样就不会由于TLB里没有缓存,而被迫到页表里读取地址,以增加性能。
但是为什么不默认采用4MB,而要采用4KB呢? 《Windows Internals》进一步提到,由于页需要采用保护机制,大的页面不利于设置更细微的保护粒度。例如在4MB的数据中,一部分需要只读访问,另一部分需要读写访问,则整个页只能设置为读写访问。
如果进程所访问的虚拟内存页不在工作集中,进程就会触发一个页面错误的硬件异常。如果发生这种情况,内存管理器会分配一个可用的物理内存页,以存放最近访问的数据。另外,内存管理器可能会给进程工作集添加新的页,以扩展进程的工作集。然而,如果内存管理器认为进程的工作集已经足够大了,它就会把工作集中的一个页调出去,以便腾出空间存放新的页。替换的策略是选择进程最近最少访问的页,这主要是假设进程在未来访问该页的可能性很小。
当内存管理器把页从进程的工作集中移走,它必须决定应该怎样处理这个页。如果该页已经修改过了,内存管理器会首先把它放到已修改列表中,这个列表中的页最终会写入到页面文件,或者写入这些页所对应的内存映射文件中。内存管理器会把页从已修改列表移动到备用列表中。未修改的页会直接移动到备用列表中。所以,我们可以把备用列表看成是文件数据的缓存。
盆盆译注:总结一下,当进程的工作集已满,想要访问新的页,则必须把老的页移走。这些老的页,如果已经修改过,则会移动到已修改列表,如果没有修改过,则会移动到备用列表。
到现在为止,物理内存的两个列表(数据结构)已经出来了,一个是备用列表,另一个是已修改列表。
可用内存
在本文的前面部分,曾经提到发生页面错误时,内存管理器会给进程提供一个可用的物理内存页,但是还没有讨论什么叫做可用内存。物理内存中的备用列表就是内存管理器所认为的一部分可用内存。其他一部分可用内存,它们的页所包含的数据属于已释放的虚拟内存(例如这些页包含已退出进程的数据);还有一部分可用内存,包含刚被释放的页,这些页随后会被内存管理器的低优先级页清零线程用全零来填充。这些类型的页分别保存在内存管理器的自由列表和清零页列表中。
盆盆译注:物理内存的另外两个列表(数据结构)自由列表和清零页列表。可用内存由三部分(三个数据结构)组成:备用列表、自由列表和清零页列表,正如图1所示的那样。
图2显示了工作集和这些页列表之间的转化。系统线程每秒钟唤醒一次,调用内存管理器的工作集管理程序,对系统和进程工作集进行分析。如果发现可用内存很低,工作集管理程序就会挑选一些进程,这些进程在过去的一秒钟里页面错误发生率最低,然后从它们的工作集中移走一些页。这些移走的页会转移到已修改列表或者备用列表(还记得盆盆前面的注释吧),这样就可以腾出可用内存了(盆盆译注:其实只有备用列表里的部分,才算是可用内存)。这种协调机制的其中一个重要的副作用是:如果系统需要为其他进程分配内存,内存管理器会从空闲进程的工作集中抽取内存页。所以,空闲进程的工作集会最终消失,这意味着,如果进程长时间处于空闲状态,那么最终它们将不会占据任何物理内存。
http://blogs.itecn.net/photos/ahpeng/images/13081/original.aspx
图2 盆盆汉化 版权所有
如果进程需要请求新的物理内存页,内存管理器首先会查看该页是不是位于备用列表或者已修改页列表。如果该页曾经从进程工作集中移走,并且没有因为其他目的而被其他进程重新使用,那么该页应该还在这两个列表里(盆盆译注:就是指备用列表或者已修改列表)。把内存页重新拿回,并放到进程的工作集中,这叫做软页面错误,因为和这硬页面错误不一样,软页面错误不需要从硬盘的页面文件或者其他文件中读入数据。
如果所需请求的内存页并不在备用列表或者已修改列表中,内存管理器就会从某个列表上摘取一页,首先会检查自由列表,然后是清零页列表,最后是备用列表(盆盆译注:这也再次说明了,可用内存由这三部分组成)。如果可用内存不够,内存管理器会触发平衡集管理器,来调整进程的工作集,以便生成上述的三个列表,从而获得可用内存。如果内存管理器不得不从自由列表、备用列表或者清零页列表中移除内存页,以便重新使用,它会确定如何访问目标代码或者数据,这会导致从页面文件或者进程映像文件中读取数据,或者创建由零填充的数据—如果应用程序需要分配新的数据,而且所获得的内存页并不是取自清零页列表(盆盆译注:如果是从清零页列表中获取的页,则无需再由零填充,因为本来就已经清零了)。

不懂!!!!!!!!!!!!!!!!!!!!!!!

TOP

所以说让windows自己管理内存是最好的办法了!

TOP

这文章好像发错地方了。

TOP

好文章,受教了,

TOP

呵呵~~从来不用啊。。。

TOP

原帖由 byyh 于 2007-8-8 22:10 发表 http://bbs.ioage.com/cn/images/common/back.gif
我只用一个MS出的释放内存软件


我只用一个调用ms释放内存工具的软件——内存扫把

反正他不写硬盘,也不卡游戏(如极品9,10),用了两年多了,感觉还好

而且我现在手边这台128M的机子,没有它的话,的确有点吃力

TOP

现在用2G内存,不用优化软件了

TOP

内存释放功能,tw也不是没有,只是没用得那样滥。内存优化软件,不可用得太滥。
不作世俗物,何来高雅处。
风花雪月行,柴米油盐住。
本是无峥嵘,难得守平素。
但凭笔一支,诗记人生路。
输入法爱好者群:15571505

TOP

我只用一个MS出的释放内存软件

TOP

  深奥 .  看不太懂.

TOP

说这些没用,总有许多初入门者拼命盯死那一点点的内存占用,而不管性能提高多少。

TOP

返回列表