Windows里跟performance相关的一些概念
1、kernel里的Cache Manager:
提供了在ReadFile、WriteFile时的cache,包括read-ahead和write-behind机制。原理是把application本来应该让file system服务的I/O request截走,转给cache manager自己拥有的一小块memory。
Cache manager就像一个应用程序,它只管虚拟内存,真正的物理内存管理都由memory manager做。所以cache那一部分memory也可能被page out。
只针对普通的file,dll、exe文件不会read-ahead。更精确的说,凡是用memory-mapped file方式读取的文件,都不会被read-ahead。
2、Prefetch:
在启动一个Process时,总要load一些dll,常用的几个icon等。如果等用到了再去读就比较慢,而且硬盘磁头会来回跑路。prefetch会根据上次process运行的历史记录,按照它们在磁盘上的顺序预读这些dll。
因此,一个程序第一次运行时可能硬盘要转很久,但以后再运行就快了。Prefetch对Boot也有类似的优化,会自动defrag启动时用到的文件。
可能的问题:上次打开的文件这次未必用到。
3、SuperFetch:
为了解决“after-lunch effect”引入的。为啥午饭回来之后outlook很迟钝,硬盘在狂转?因为在idle的时候杀毒软件开始扫描磁盘,占用大量物理内存,outlook不幸被page out了。等杀毒软件运行完释放了内存,LRU算法会把杀毒软件留在内存的standby list里,而outlook的页面却不会从pagefile里回来。
类似Prefetch,SuperFetch记录内存的历史使用情况。它考虑了时间信息,比如“每天下午2:00要用Outlook”,这样就预先把需要的东西读到内存里。而且也会考虑把常用/重要的东西(比如输密码解锁那段code)尽量留在内存里。
只要发现你的空闲内存比较大(比如刚有一个大程序退出),它就会一点一点地吃掉你的空闲内存,把它认为需要用的东西放在内存里。所以很多人误以为SuperFetch浪费内存。
4、ReadyBoost:
用优盘当虚拟内存。hard fault发生时,从优盘读比硬盘稍微能快一点点。
5、ReadyBoot:
在boot的时候,预读一些硬盘数据到内存里。这个跟prefetch很像但是更智能。我现在还不是很清楚这个东西怎么工作的。还需要翻一翻宝书Windows Internals 5。。。
Update: 今天翻了宝书,发现宝书上只用了1页描述ReadyBoot……郁闷,还是不清楚。这也意味着即使我通过别的方法把它搞清楚,也不能把结果贴出来了。