SuperFetch,您受委屈了(二)
关键字 Windows Vista SuperFetch
作者 盆盆
难度 Level 300
上回说到要做一个实验,证明SuperFetch的效能。但实际上,要做出不受干扰的实验,非常难。所以本文设计了一个模拟的演示,来说明SuperFetch的作用。
在实验之前,先补充一下SuperFetch最基本的原理,以便初学者能够更好的理解:
物理内存的组成
在Windows里,我们可以简单地认为物理内存有以下五个部分组成:
- Working Set:工作集。这是每个进程所占据的物理内存部分。
- Standby List:当进程工作集收缩时,释放的page,如果没有修改过,或者修改的内容已经写入Page File或者硬盘文件中,这部分Page可以直接写入Standby List。
- Modified List:当进程工作集收缩时,释放的page,如果已经修改过,但是尚未写入Page File或者硬盘文件中,这部分Page叫做Dirty Page,直接写入Modified List。
- Free List:进程退出所释放的内存page,可能包含不确定的内容。
- Zero Page List:Free List里的Page可能存在不确定的内容,导致进程出错,所以需要定期进行清零。
系统会定时启动修改页写入线程,把Modified List里的Page写入硬盘的Page File或者其他文件里,然后把释放的Page插入Free List。
如果Free List超过8个Page,则自动触发清零线程,把Free List的Page内容清零,并插入Zero Page List。
当应用程序请求Page,但是这些Page不在进程的Working Set里,那么就会发生Page Fault事件。
如果这些Page位于Standby List或者Modified List里,则叫做Soft Page Fault事件,进程可以直接从Standby List或者Modified List里摘取Page,然后放入进程的Working Set里。
如果这些Page不在Standby List或者Modified List里,则叫做Hard Page Fault事件,只能从Page File或者硬盘文件里调取,这就要发生磁盘I/O,系统性能就会受到限制。
可用内存包括以上的三个部分:Standby List、Free List和Zero Page List。也就说,这些List里的Page,Windows可以直接分配给任何一个进程。
SuperFetch实际原理
可以归结为一句话,就是为可用内存的完美利用。只要内存的Free List和Zero Page List不为空,就会预加载常用进程的代码和数据,并把这部分Page插入Standby List。
这样的话,启动常用进程时,虽然会发生Page Fault,但是其中很多属于Soft Page Fault,直接从Standby List里摘取,所以不需要磁盘I/O。
Standby List的优先级
在Windows Vista里,不仅仅CPU有优先级,内存和磁盘I/O都有优先级。
在Windows Vista里,一共有八个Standby List,分别对应不同的内存优先级(0~7),进程默认优先级是5。
这样,如果内存不够,不得以要摘取Standby List里的Page,可以先从低优先级的Standby List中摘取,不会影响高优先级的进程。
可以用工具查看(绿色的是八个Standby List,红色的是Zero List和Free List):
实验-禁用SuperFetch,空闲内存越多,进程启动速度反而越慢
接下来的模拟演示,就是要证明,如果禁用SuperFetch,空闲内存越多,速度反而越慢。
实验条件:关闭一切可能干扰系统的后台进程,例如Windows Search、Windows Update,病毒扫描等等,还可以禁用Aero、UAC等。
实验机器:虚拟机,512MB内存,双核1.66MHz的CPU。
假设常用进程是Outlook 2007。
启动计算机,确保启用SuperFetch,等到系统完全预加载完毕,不再产生磁盘活动时,启动Outlook,多做几次实验,并记下平均启动时间T1,这里是6秒。并记下空闲内存M1,这里是11MB。
禁用SuperFetch,重新启动计算机,记住一定要重启,以便释放Standby List。等到系统登录结束,不再产生磁盘活动时,启动Outlook,多做几次实验,并记下平均启动时间T2,这里是17秒。并记下空闲内存,这里是212MB。
11MB和212MB,谁多谁少?
而6秒和17秒,谁多谁少?
而禁用SuperFetch后,虽然空闲内存增加了将近200MB,但是进程启动速度反而降低约2/3。
小考
光看文章,如果不过瘾,那么看看问题小考吧,这里盆.盆提以下几个简单问题,推荐初学者不妨思考一下,可以更好地理解SuperFetch和内存管理:
1. 为什么可用内存不包括Modified List?
2. 为什么说SuperFetch缓存不会减少可用内存?
3. 为什么SuperFetch反而会降低磁盘的损耗?
4. 请用Standby List的优先级,来说明Windows Vista是如何解决午餐综合症的问题。
何谓午餐综合症?
在Windows 2000/XP中,如果打开WORD文档,当时性能不错,但是吃中饭后回来,再处理这个WORD文档,会发现速度很慢,这就叫做午餐综合症。