mmap + madvise真的是一种异步I / O吗?

时间:2015-07-03 23:23:46

标签: c++ c linux asynchronous mmap

我试图找出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_WILLNEEDposix_fadvise会进行异步预读,但未提及POSIX_FADV_WILLNEED是否同步预读。

此外,它似乎是"预读"的整个概念。除非它是异步的,否则I / O确实没有任何意义。如果它是同步的,它只是让用户应用程序阻止预读,而不是后来实际读取文件时,这似乎不是一个特别强大的优化。

那么madvise()madvise()实际上是否在任何主流平台(如Linux)上进行异步预读?

2 个答案:

答案 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_WILLNEEDPOSIX_FADV_WILLNEED在Linux上是等效的。

这可以称为异步I / O吗?我不这么认为。 Async IO通常意味着有一些允许您检索数据的通知。建议只是一个建议:不仅你不知道什么时候可以读取数据,但是如果你太晚了,数据可能已经被丢弃了。

答案 1 :(得分:0)

通常,您应该假设m *函数不会执行异步预读。