我试图找出mmap
是否有文件,然后使用madvise()
或posix_madvise()
MADV_WILLNEED
/ {{1实际上会触发后台异步I / O以进行预读。 man pages for madvise
没有说明是否属于这种情况 - POSIX_MADV_WILLNEED
的实际行为大部分都不清楚,以便实现灵活性。
但是当调用madvise
并调用madvise()
时,任何实际的主流POSIX实现(如Linux)是否实际执行异步文件I / O?我似乎无法获得有关此信息的任何可靠信息。 This question建议它至少在Linux上,即使它不理想,因为没有回调机制。
此book excerpt声明MADV_WILLNEED
与posix_fadvise
会进行异步预读,但未提及POSIX_FADV_WILLNEED
是否同步预读。
此外,它似乎是"预读"的整个概念。除非它是异步的,否则I / O确实没有任何意义。如果它是同步的,它只是让用户应用程序阻止预读,而不是后来实际读取文件时,这似乎不是一个特别强大的优化。
那么madvise()
与madvise()
实际上是否在任何主流平台(如Linux)上进行异步预读?
答案 0 :(得分:2)
使用Linux,您可以随时查看源代码。
请参阅fadvise.c:
case POSIX_FADV_WILLNEED:
...
force_page_cache_readahead(mapping, f.file, start_index,
nrpages);
break;
因此posix_fadvise
调用force_page_cache_readahead
来执行预读。
现在让我们看一下madvise.c:
static long madvise_willneed(...)
{
...
force_page_cache_readahead(file->f_mapping, file, start, end-start);
return 0;
}
所以MADV_WILLNEED
和POSIX_FADV_WILLNEED
在Linux上是等效的。
这可以称为异步I / O吗?我不这么认为。 Async IO通常意味着有一些允许您检索数据的通知。建议只是一个建议:不仅你不知道什么时候可以读取数据,但是如果你太晚了,数据可能已经被丢弃了。
答案 1 :(得分:0)
通常,您应该假设m *函数不会执行异步预读。