16

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

编辑:

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

例如:Linux 函数签名是:

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

它的使用示例是

readahead(file, 100, 500);

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

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

4

3 回答 3

11

是的。它是FileSystemControl FSCTL_FILE_PREFETCH

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

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

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

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

于 2010-01-25T21:15:54.420 回答
2

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

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

这仍然比您希望的要复杂一些,但没有DeviceIoControl. 另请注意,您可以轻松地预取几个独立的、不连续的范围。

于 2013-07-25T13:59:40.617 回答
0

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

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

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

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

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

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

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-26T00:11:23.513 回答