读过了“森木”管理员的《windows vista wow》之后,受益匪浅。虽说不是成为了一个“专家”,但也对从vista开始引进的新的内存管理机制Superfetch有了一定的了解。发现了很多人一开始(包括我)对于vista、7的内存的使用的误区。一般来说,从XP升的用户大多都认为系统空闲时内存使用越少越好。而到了7的时代(更准确的说是vista之后),这一个本该转变的观念却还迟迟留在大家的记忆里。今天,我看到一篇说7的内存占用太多而换回使用XP的,对此我认为比较遗憾。所以,我又翻开了那本的《windows vista wow》,仔细再次阅读了关于Superfetch的章节。因为不是人人都有这本书。所以在此介绍给大家。同时也是想改变一下大家的观念。从而使更多的用户可以对7充满积极!
介绍之前,我也对我们的管理员Sveir表示感谢,他的《windows vista wow》让我更加的了解的vista(当然,了解vista后才能进一步了解7)。同时我也会引用一些书中的例子等。由于书中的句子比较繁杂,不容易理解。我还会使用图片以及生动的比喻告诉给大家。因为我的理解能力有限,且也是从书中获取的知识,如果有什么讲的不对的话,非常欢迎大家的指正和批评。
在了解Superfetch内存管理机制之前。我们要弄清楚一些概念。下面我就来讲解一下什么叫做“工作集”。
一、工作集的概念和作用
首先,我们从内存讲起。我们可以简单的将内存理解为“数据结构”+“工作集”。也就是说,在内存这个大房子里面有两个房间,一个是“数据结构”房间,另一个是“工作集”房间。那么我们就开始讲什么是“工作集”房间。
我们可以将每一个程序的运行占用的内存当做一个员工,而这些员工要工作的话就必须要走进他们的办公室,然后才能开始工作,那么这些“办公室”就可以理解为工作集了。引用森木的话就是“简单的说,应用程序在运行过程中进程所占用的内存中的工作空间就叫做工作集”。
那工作集的作用是什么呢?就如我刚才说的,是各个员工办公的场所,我们可以想象这些员工来自他们的“家”,也就是硬盘,工作集的作用就是让这些员工从家进入到大厦里(也就是内存里),也可以说,在这个大厦里,门口就是工作集房间,员工进入了工作集才能进入大厦。再次引用森木的话就是“工作集的作用是为了应用程序在运行时将硬盘当中对应的文件引入物理内存中”。
可是我们知道,大厦不能只有工作集一个房间,所有的员工在这个房间里面占用的地方并不是整个大厦(内存)。而工作集房间的面积大小就要看你这个大厦有多大了。如果大一点的大厦工作集房间肯定大,那小的大厦这个房间自然就小了。我在前面也提到过,这个大厦还有一个房间,就是“数据结构”。
二、物理内存的数据结构
在数据结构这个房间里,还分有五个小房间。他们分别是:
Free Page List 自由页面列表(房间)
Modified Page List已修改页面列表(房间)
Standby Page List备用页面列表(房间)
Zero Page List清零页面列表(房间)
Bad Page List坏损页面列表(房间)
那下面我就结合工作集的工作原理来一起讲解数据结构这个房间了。
三、工作集的工作原理
举个例子说,开机后,我目前打开了一些程序,譬如有Word、IE、Media Player、QQ。
他们现在要工作了,就必须进入到他们的办公室(工作集)中。而这时,工作集这个房间刚刚好满员了。
先来说说这些工作:Word我是写了一些字之后没有关闭;IE我根本没用过它;在这时,我现在又想打开一个新程序,Photoshop,于是考虑到工作集空间告急,所以关闭了Media Player和QQ。而Photoshop真的需要工作集当中的页面给他让路。这时就要将员工分配到数据结构房间。而数据结构有五个小房间之多,该怎么处理这些没用的员工呢?#p#分页标题#e#
原来,五个房间中前四个小房间都是为了收纳这些员工准备的。首先,当我关闭了程序,那么这些员工就不工作了,当然就不在办公室(工作集)当中。这时,凡是关闭了的程序的工作集页面就会被转到Free Page List房间里面。就好像刚才的Media和QQ一样。而我使用后(修改后)没有关闭的程序,就像Word的工作集页面就会被转入到Modified Page List房间里。最后,我连用都没用IE就转入到Standby Page List里面了。
对于Free Page List中的页面大多都是我关闭程序后留下的无用数据。为了始终能接纳工作集房间排除的员工,便将要这些空间给进程使用。可是带有无用的页面和代码直接使用的话就会造成错误。那么就要将这些无用数据用数字0代替。所以这些无用数据就会被挂载到Zero Page List房间中等待清零。当这个房间里面员工(无用数据)达到8个的时候,就会触发清零操作了。随后再分配给后面的使用。
四、软调页和硬调页
相信大家都有过类似的经历。当我开机后,第一次运行一个程序,就比如说是Word吧,可能需要5秒才能启动。当我关闭后再开,也许只用2秒。如果我不关闭,直接打开另外一个Word文件,那就更快了。这是什么原因造成的呢?
当我们开机后,工作集里面没有Word这个员工(页面),他还在家(硬盘)里面。于是当我召唤他的时候,它才从家走到办公室(工作集)。这样的过程就叫做硬调页了,当然需要的时间长。而当我们关闭了Word时候,他就被派往大厦的另一房间,我却马上再次召唤他,这时,另一个房间内的数据还没被清零,他便不用从家里走来,而是直接从数据结构里面引入就可以了。在不关闭这个程序Word的情况下,他也不用为其他程序让路的时候,它还存在于办公室(工作集)里面,召唤他的时候就会更快。这样的“无需从硬盘中重新调用数据,而是将数据结构中的页面重新挂载到工作集中”的过程,便叫做软调页了。
在了解了一些基本的概念之后,我们就开始讲解vista的新内存管理机制“Superfetch”了。总的来说,Superfetch为我们带来了一下几点改进:
会将用户可能使用的应用程序页面利用内存可用空间进行预加载;
尽可能地避免系统发生从硬盘的页面调用;
让应用程序最快速度开启;
不会由于计算机长时间闲置而使突然使用变得响应迟缓;
在退出大型应用程序后会主动将之前***转移到虚拟内存中的页面重新调入内存当中;
一、进行程序页面预加载
其实从上面的Word例子我们可以知道,当内存中有所需程序页面的时候会使程序启动变得更快。而Superfetch具有了学习的功能,自从第一次使用windows 7时,Superfetch就开始记录我们的使用习惯,将我们经常使用的程序的页面在开机后进行提前加载,那么当我们第一次开启程序的时候便可以获得像第二次开启一样的速度了。所以这些预加载的页面就会使得我们的内存占用变得多。
网上有许多教程或是软件针对XP的内存使用进行优化。森木也提到说:“过去在windows XP的系统环境中往往普遍存在一个概念,系统空闲时可用内存空间越多越好”。而由于XP得内存管理机制并不是十分优秀,所以说即使优化地再好也无法良好的利用大容量内存。反之,真正想获得快速的程序启动速度就必须确保内存中有用户使用程序的内存页面。(也就是说在正常范围内,7下面反倒内存占用越高越好了)从而导致高内存使用,这也就是大家的一个误区了。
在Superfetch开机后进行预加载的时候,采用了vista中的低优先级,所以并不会对正常使用照成影响。当我们打开程序的时候就直接可以从内存中调用页面了。避免了硬调页,就会大大提升效率。
下面的话就是为已经使用7的用户说的了
由于Superfetch要在开机后进行预加载,所以建议大家不要关机。尽量使用“休眠”或“睡眠”,这样Superfetch的预加载内容就会保留。从而提高速度和效率。