- UID
- 43132
- 帖子
- 547
- 精华
- 0
- 贡献
- 0
- 推广
- 0
- 有效BUG
- 0
- 注册时间
- 2007-1-31
|
2#
发表于 2007-8-8 20:33
| 只看该作者
创建可用内存
理解了内存管理器的行为,现在我们可以把目光转向内存优化工具的行为。内存优化工具所显示的可用内存数值,等同于任务管理器的“性能”标签页上所显示的“可用数”,如图3所示。可用内存的数值是备用列表、自由列表和清零页列表这三个数值的相加。而系统缓存,则是备用列表和系统工作集这两个数值的相加。在Windows NT 4.0和以前的版本,文件缓存则只等于系统工作集的大小。
http://blogs.itecn.net/photos/ahpeng/images/13082/original.aspx
图3 盆盆制作 版权所有
盆盆译注:这部分的内容很好地解释了任务管理器“性能”标签页里的术语,什么叫做可用内存,什么叫做系统缓存。
内存管理器可以分配、然后释放一大块虚拟内存,内存优化工具正是利用了内存管理器的这一特点。内存优化工具的作用如图4所示。最上方的条状图显示优化之前的工作集和可用内存。中间的条状图显示内存优化工具(RAM optimizer)发出大内存的请求,在极短的时间里产生大量的页面错误。作为回应,内存管理器会增加内存优化工具的工作集。这种工作集的扩展是以牺牲可用内存作为代价—这时候可用内存会变得很低—同时以减少其他进程的工作集作为代价。最下方的条状图显示,内存优化工具会释放内存,内存管理器会把所有的内存页从它的工作集中转移到自由列表中,所以可用内存会大大增加。绝大多数的内存优化工具隐藏了第一阶段中可用内存急剧下降的事实,但是如果我们在优化的时候启动任务管理器,就可以看到可用内存在最初会急剧下降。
http://blogs.itecn.net/photos/ahpeng/images/13083/original.aspx
图4
尽管从表面上来看,可用内存越多越好,其实不然。内存优化工具虽然使得可用内存数大大增加,但是它们会强迫其他进程的数据和代码交换出内存。假设我们正在运行Word,当内存优化工具强制增加可用内存时,Word的打开文档和程序代码原本是在内存中(工作集),结果不得不从磁盘中重新读入,我们才能继续编辑文档。在服务器上,这种性能的损失将会变得非常严重,这是因为缓存在备用列表和系统工作集中的文件数据(还有活动服务端进程所拥有的代码和数据)很可能会丢失。
盆盆译注:所谓的内存优化工具,是以牺牲其他进程的性能作为代价,同时还会导致系统重要进程的代码和数据交换到磁盘,对于总体性能来说,得不偿失。Windows Vista的内存管理,并没有强调可用内存足够多,而是确保内存里包含正确的内容,这样才能尽可能地减少磁盘I/O,提升整体的用户体验。
其他的宣传功效
一些厂商宣传他们的内存优化产品还具有其他一些功能。例如该优化工具可以把一些无用进程所占据的内存释放出来,例如运行在任务栏通知区域上的进程。这些所谓的功效都是不正确的,因为Windows已经自动调整了空闲进程的工作集。内存管理器已经具有所有必需的内存优化功能。
盆盆译注:盆盆在Windows Vista做实验,证实了Mark Russinovich的说法。以Daemon Tool为例,平时空闲的时候,其工作集只有3MB左右(专用工作集只有350KB),而当打开其配置界面时(使其不处于空闲状态时),其工作集达到10MB左右(专用工作集也达到约3MB)。如图5所示,绿色部分代表空闲时的工作集,而紫色部分代表活动时(Active)的工作集大小。另外要注意,Windows Vista中文版的翻译有误,Working Set,不能翻译为工作设置,而应该是工作集。
http://blogs.itecn.net/photos/ahpeng/images/13084/original.aspx
图5 盆盆制作 版权所有
内存优化工具的开发者抛出的另外一个谬论,就是他们的产品可以对内存碎片进行整理。 分配一大块虚拟内存,然后再释放,也许会生成一大片物理连续的可用内存。然而,由于虚拟内存对进程屏蔽了物理内存的布局,进程不能直接从虚拟内存(由连续的物理内存所提供)中得益。当进程运行时,由于工作集的调整和扩展,虽然有一大片连续的可用内存,但是进程的虚拟内存到物理内存的映射,还是会产生很多碎片。
获得连续的可用内存,对以下情况是有利的:
当内存管理器希望能够最大化CPU高速缓存的效率时,会采用一种叫做“页面染色”(Page Coloring)的机制,以确定从自由列表(或清零页列表)中把哪些内存页分配给进程。
尽管如此,虽然获得连续的可用内存,可以获得一点好处,但是这种好处要以把有用的代码和数据移出内存作为代价,是得不偿失的。
盆盆译注:为了进一步了解什么叫做“页面染色”机制,盆盆费心在网上搜索不少资料,终于了解到以下的背景资料(经过缩写):
为了确保在进程上下文切换时,CPU高速缓存里的内容不受影响,现代CPU的L1 Cache会对物理内存页进行缓存,而不是缓存虚拟内存页(否则的话,上下文切换时,必须刷新缓存中的内容,导致缓存性能急剧下降)。这就要求相邻的虚拟内存页最好分配相邻的物理内存页,以获得最好的L1 Cache性能。
更具体的内容,可以参考这篇文档。
最后,软件开发商宣传他们的内存优化工具可以重新获取因泄漏而丢失的内存。这种宣传可能是最虚假的说法。
在所有时刻,内存管理器都知道进程所拥有的物理内存和虚拟内存。然而,如果进程分配内存,但是由于Bug而无法释放内存(内存泄漏),内存管理器就可能无法了解这些已分配的内存无法重新访问,而必须等到进程退出时回收内存。
哪怕产生内存泄漏的进程无法退出,内存管理器的工作集调整机制也会最终从进程的工作集中“盗取”所有的物理页(分配给泄漏的虚拟内存)。该进程会把泄漏的虚拟页发送到页面文件,这样系统就可以腾出物理内存挪作它用。所以对可用物理内存来说,内存泄漏只有有限的影响。真正的影响在于虚拟内存的消耗(在任务管理器中叫做PF使用率和提交更改,如图3所示)。没有任何工具可以解决这种虚拟内存的消耗,除非杀死消耗内存的进程。
欺诈软件
笔者(Mark Russinovich)还在寻找能够实践其承诺的内存优化工具。如果仔细查看,我们会经常发现开发商会在其网站上隐藏着冗长的免责声明,其中包括本文所述的内容—该产品可能对系统性能没有什么影响,甚至可能导致性能下降。甚至无需知道这些产品是如何借助内存管理器来实现其具有明显视觉效果、具有煽情名字的内存管理机制,只要用正常思维就可以明白如果这种内存优化机制是可行的话(而且那么多三流厂商都可以实现),微软的开发工程师早就应该在内核里实现这种功能。
原文信息
本文的英文原版刊发在2004年一月刊的《Windows IT Pro Magzine》上,地址如下。但是由于该文需要访问权限,所以盆盆特地将其全文翻译,共享给大家。
http://www.windowsitpro.com/Articles/ArticleID/41095/41095.html
在《Windows Internals》第七章内存管理部分中,也有该文的部分内容,有兴趣的朋友可以阅读对比。 |
|