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
答案 0 :(得分:11)
是。它是FileSystemControl FSCTL_FILE_PREFETCH
。
它在Windows Vista及更高版本中用于在应用程序启动和启动时预取。
SuperFetch技术也使用它,它使用启发式技术在您通常使用它们的大致时间加载应用程序。
FSCTL_FILE_PREFETCH
本身没有记录在MSDN上,但通过检查应用启动时发出的DeviceIoControl
调用很容易找出参数格式:只需在调试器中启动一个已有的应用程序。c:\Windows\Prefetch
目录中的.pf文件,并在DeviceIoControl
中断(或者如果您使用的是内核调试器,则在NTFS驱动程序收到其第一个FSCTL_FILE_PREFETCH时中断)。检查传入的缓冲区,并将其与.pf文件和稍后实际使用的范围进行比较。我出于好奇而做了一次,但没有记录细节。
如果您不熟悉DeviceIoControl
和IRP_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,好吧,它可能不是你想要的但它可能会帮助你指明方向......对不起,如果它不是你想要的......
希望这有帮助, 最好的祝福, 汤姆。