【问题标题】:Windows equivalent to Linux's readahead syscall?Windows 相当于 Linux 的预读系统调用?
【发布时间】:2011-01-09 06:56:02
【问题描述】:

是否有与 Linux 的预读系统调用等效的 Windows?

编辑:

如果可能的话,我想要一个完整的函数签名,显示等效的偏移量/计数参数(或下限/上限)。

例如: Linux 函数签名为:

ssize_t readahead(int fd, off64_t *offset, size_t count);

它的使用示例是

readahead(file, 100, 500);

其中“file”是先前由 mmap 等函数设置的文件描述符。此调用在索引 100 处读取 500 个字节。

编辑 2: 如果您不确定预读的作用,请阅读此内容:http://linux.die.net/man/2/readahead

【问题讨论】:

    标签: c windows linux caching system-calls


    【解决方案1】:

    在 Windows 8 中,存在或多或少直接等同于madvise(MADV_WILLNEED),实际上是相同的东西(Windows 有一个统一的 VM/缓存系统)。

    假设您已经对文件进行了内存映射,因此您可以使用PrefetchVirtualMemory 来预取它。

    这仍然比您希望的要复杂一些,但不像DeviceIoControl 那样苛刻。另请注意,您可以轻松地预取多个独立的不连续范围。

    【讨论】:

      【解决方案2】:

      我不确定我是否理解正确,在你所说的'其中“文件”是先前由诸如 mmap 之类的函数设置的文件描述符。此调用正在索引 100 处读取 500 个字节。' 这听起来有点像寻找偏移量并读取 500 个字节...但您希望提前预取它...

      在 C 代码中,它看起来像这样:

      fseek(fp, 100, SEEK_CUR); fread(&data, 500, 1, fp);

      但我想,预取它,你会想使用等待句柄来连接某种事件,当事件被引发时,数据会存储在缓冲区中的某个地方......

      说实话,我还没有遇到过这样的事情可以预取数据......但是Ray的回答让我感到惊讶,但又一次它只适用于Vista向上,如果你想保持兼容性......那就是需要记住的事情...但下面的链接可能会有所帮助...

      好的,有一个blog在讨论这个,一个用Delphi写的库,源代码是here,浏览代码here,好的,可能不是你想要的,但它可能会帮助你指出在方向...对不起,如果它不是您要找的...

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

      • 不,这不是我要找的。我正在寻找一个功能上等同于 Linux 中“预读”的函数。
      【解决方案3】:

      是的。是FileSystemControl FSCTL_FILE_PREFETCH

      在 Windows Vista 及更高版本中用于在应用程序启动时和启动时预取。

      SuperFetch 技术也使用它,该技术使用启发式方法在您通常使用应用程序的大约一天中的时间加载应用程序。

      FSCTL_FILE_PREFETCH 本身并没有记录在 MSDN 上,但是通过检查应用程序启动时进行的 DeviceIoControl 调用很容易找出参数格式:只需在调试器中启动一个应用程序,该应用程序中已经有一个 .pf 文件c:\Windows\Prefetch 目录并在 DeviceIoControl 上中断(或者,如果您使用的是内核调试器,则在 NTFS 驱动程序收到其第一个 FSCTL_FILE_PREFETCH 时中断)。检查传入的缓冲区并将其与 .pf 文件和稍后实际使用的范围进行比较。出于好奇,我做了一次,但没有记录细节。

      如果您不熟悉 DeviceIoControlIRP_MJ_FILESYSTEM_CONTROL,请查看以下链接:

      【讨论】:

      • 这是一个很好的答案,但我有点困惑。 Linux 系统调用具有签名:readahead(int fd, off64_t *offset, size_t count);例如:预读(文件,100,500);我假设它将使用文件描述符“file”在文件的偏移量 100 处读取 500 个字节。 Windows 中的等价物是什么?
      • 获得了记录这些文件的链接,或如何使用它们的演示?现在我不知道如何解释这个答案。
      • 仍然不确定我是否理解。我正在寻找的是一个函数签名和一个演示它使用的示例。有关示例,请参阅我编辑的问题。
      猜你喜欢
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2012-06-30
      • 1970-01-01
      相关资源
      最近更新 更多