Windows相当于Linux的readahead系统调用?

时间:2010-01-25 21:08:36

标签: c windows linux caching system-calls

Windows是否等同于Linux的readahead系统调用?

编辑:

如果可能,我想要一个完整的函数签名,显示等效的偏移/计数参数(或更低/更高)。

例如: 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

3 个答案:

答案 0 :(得分:11)

是。它是FileSystemControl FSCTL_FILE_PREFETCH

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

SuperFetch技术也使用它,它使用启发式技术在您通常使用它们的大致时间加载应用程序。

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

如果您不熟悉DeviceIoControlIRP_MJ_FILESYSTEM_CONTROL,请点击以下链接:

答案 1 :(得分:1)

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

假设您已对内存映射文件,则可以使用PrefetchVirtualMemory预取文件。

这仍然比你希望的稍微复杂,但不像DeviceIoControl那么严厉。另请注意,您可以轻松预取几个独立的,不连续的范围。

答案 2 :(得分:0)

我不确定我是否理解正确,你所说的' Where“file”是一个先前由mmap这样的函数设置的文件描述符。这个调用在索引100处读取500个字节。'这听起来像是在寻找偏移并读取500个字节......但是你想要预先提取它...

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

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

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

老实说,我没有遇到过预先获取数据的事情......但Ray的回答让我感到惊讶,但是如果你想要保持兼容性,那么它只会让Vista向上,那就是要记住的事情......但下面的链接可能会有所帮助...

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

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