当前位置:首页 > 内存 > 正文

内存的预读取原理

  • 内存
  • 2024-07-01 06:38:28
  • 6636

一、预读MS网站上对prefetch的解释

Windows操作系统,除了早期的实模式Windows3x之外,都需要分页,即当应用程序尝试访问数据或代码时,将其从磁盘加载到内存中。数据和代码以页为单位逐块加载(x86架构下为4KB)。预取是首先将数据和代码页从磁盘加载到内存中以避免实际请求延迟的过程。


Windows设置)来确定要检索的内容。默认情况下,它跟踪启动过程的前两分钟,或所有Win32服务启动后60秒,或用户界面(例如IE)启动后30秒,以先发生者为准。此外,它还监视应用程序启动的前10秒。收集的跟踪信息被组织成MFT元数据文件(如果应用程序访问NTFS卷上的文件或目录)、故障信息、文件引用和目录引用。然后,通过标记指定的事件对象来通知任务调度程序的预取组件。


任务调度程序通过调用内部NtQuerySystemInformation系统调用来获取此信息。数据处理完成后,任务计划程序将数据写入Windows\Prefetch文件夹中的文件中。文件名格式为应用程序名称加文件路径的哈希值(如)。启动跟踪文件的命名约定略有不同,始终为,这是程序员经常使用的BAADF00D未初始化数据代码的重命名。


当引导或应用程序启动时,会调用缓存管理器进行预取。它检查预取目录中是否存在匹配的跟踪文件。如果存在,则根据文件引用预读取MFT元数据,读取引用目录的内容,最后打开引用的文件,然后内存管理器读入指定的数据和代码在痕迹中但不在内存中。这样,通过预先组合数据和代码的数组,避免了启动和应用程序启动时频繁的硬盘搜索,从而提高了性能。


为了进一步减少搜索,任务计划程序会在系统空闲期间每隔三天左右对文件和目录列表按照启动或应用程序启动时引用的顺序进行排序,并将它们存储在文件\Windows\Prefetch\。然后,它调用磁盘碎片整理程序并根据文件内容对文件进行碎片整理,而不是完全进行碎片整理。组织者在每个卷中找到一个足够大的连续区域,并将所有列出的文件和目录移动到该区域,使它们保持井井有条。这样,未来的预读操作会更加高效,因为所有要读取的数据都物理组织在磁盘上,从而减少了寻道时间。由于预取碎片整理的文件数量通常较小,因此此过程比完全碎片整理更快。

启动时读取自身数据的时间。