认识prefetch

来源:互联网 发布:mac localhost打不开 编辑:程序博客网 时间:2024/06/10 09:43

       最近在阅读linux内核代码时遇到了这个函数,查了一下资料学习学习。

#define list_for_each(pos, head) \
 for (pos = (head)->next; prefetch(pos->next), pos != (head); \
         pos = pos->next)
        在Windows XP及其以后的操作系统中,增加了预读取功能(也可以理解为“预先装载”),该功能可以提高系统的性能,加快系统的启动、文件读取的速度,这些预读文件保存在%systemroot%/Prefetch目录中,以*.pf为扩展名,这些*.pf文件包括了载入文件的详细信息和载入顺序。

        每一个应用程序,包括Windows XP的启动过程,都会在PrefetCh目录下留下相应的预读取文件,预读取文件描述了应用程序或启动时各个模块的装载顺序,其命名方式是以应用程序的可执行文件的名字为基础,加上一个“-”和描述执行文件完整路径的十六进制值,再加上文件扩展名.pf,例如QQ.EX-0065A2A1.pf。每当用户启动一个程序,会自动在Prefetch目录中对应的*.pf文件中留下一条记录。不过,Windows XP启动的预读取文件总是同一个名称,即NTOSBOOT-B00DFAAD.PF,其中包含着启动时载入文件的记录。

    当下一次启动系统或运行某个程序时,Windows会参考相应的*.pf文件,将其中记录的所有文件载入内存,而不是象以往一项一项依指令逐个载入文件。另外,Windows会利用启动程序或程序的*.pf文件制订一个最优化的磁盘分配方案,这个方案的相关信息存储在Lyaout.ini文件中。

 

    可以手动设置让系统不自动产生.PF文件,需要禁用 Windows XP Prefetcher 组件。具体操作是,修改注册表:

  HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Memory Management/PrefetchParameters ,修改EnablePrefetcher 值为 0 (默认为1),重启后生效。 建议不修改,即为3

上面是在wins下面的认识,

        linux下功能也类似:主要特色是透过核心作监视各软体启动所需要取用的档案,配合userspace工具做到自动更新(dynamic profiling)。

  对使用者而言,操作起来容易许多,不需要像readahead或bootcache/filecache作手动「教育」,且使用效率上也会比preload来的好。当然,与readahead相较起来,实做方式也比较轻盈、聪明。

  技术细节可以参考Krzysztof Lichota的提案(Ubuntu Wiki)与简报。 Prefetch原始码可于Launchpad下载,相关文件与文献位于Google Code.另外,Behdad Esfahbod的论文“Preload — An Adaptive Prefetching Daemon”也很值得参考。

  BTW, Krzysztof Lichota也是one-click installer的开发者。