首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mmap + madvise真的是一种异步I/O吗?

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

Stack Overflow用户
提问于 2015-07-04 07:23:46
回答 2查看 1.7K关注 0票数 7

我正在尝试弄清楚是否mmap一个文件,然后使用madvise()或带有MADV_WILLNEED/POSIX_MADV_WILLNEED的posix_madvise()实际上会触发后台异步I/O进行预读。man pages for madvise没有指定是否是这样的情况- madvise的实际行为大部分是不清楚的,以便允许实现的灵活性。

但是,在调用带有MADV_WILLNEED的madvise()时,是否有任何实际的主流POSIX实现(如Linux)实际执行异步文件I/O?我似乎得不到任何有关这方面的可靠信息。This question认为,至少在Linux上是这样的,即使它不是很理想,因为没有回调机制。

这个book excerpt声称带有POSIX_FADV_WILLNEED的posix_fadvise将进行异步预读,但没有提到madvise()是否会进行异步预读。

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

那么,带有MADV_WILLNEED的madvise()真的可以在任何主流平台(比如Linux)上进行异步预读吗?

EN

回答 2

Stack Overflow用户

发布于 2018-02-11 10:35:04

在Linux中,你可以随时检查源代码。

请参阅fadvise.c

代码语言:javascript
复制
case POSIX_FADV_WILLNEED:
    ...
    force_page_cache_readahead(mapping, f.file, start_index,
                   nrpages);
    break;

所以posix_fadvise调用force_page_cache_readahead来执行预读。

现在让我们来看一下madvise.c

代码语言:javascript
复制
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吗?我不这样认为。异步IO通常意味着有一些通知允许您检索数据。建议只是一个建议:不仅您不知道数据何时可以读取,而且如果您为时已晚,数据可能已经被丢弃。

票数 2
EN

Stack Overflow用户

发布于 2016-05-07 10:56:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31215250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档