多次致电madvise

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

标签: c++ linux

我正在阅读Linux上madvise系统调用的文档。我正在试图找出将多个“建议”值传递给madvise的最佳方法。 advice参数似乎没有采用可以一起进行OR运算的位标志,因此似乎madvise一次只能使用一个advice参数进行调用。

如果我想利用多个advice参数,根据我的应用程序的用例,只需连续多次调用madvise是否可以接受?

例如,如果我想通过MADV_WILLNEED提前给内核提示开始读取mmap的文件,但我知道我的应用程序将主要使用顺序读,我也可以利用MADV_SEQUENTIAL。我找不到任何在线演示如何将多个值传递给madvise的示例,所以我假设我只是说:

int result = madvise(address, m_size, MADV_WILLNEED);
/* do error checking */

result = madvise(address, size, MADV_SEQUENTAL);
/* do error checking */

但是我犹豫不决,因为我不知道这是否会以某种方式“覆盖”之前的电话。那么可以为madvise提供多个advice参数吗?

2 个答案:

答案 0 :(得分:3)

每次调用都会触发一个策略来处理你的mmap数据部分的处理方式 - 并且你不能将同一部分的多个策略组合起来,因为它们本质上是冲突的。

但是,您可以将不同的策略应用于文件的不同部分,这就是您拥有地址和大小参数的原因。

对文件同一部分的后续调用将重置先前的策略。

如果你的访问是连续的,你应该使用MADV_SEQUENTAL - 它应该进行预读,然后在你访问它们之后删除它们,从而为你提供最佳的性能和内存管理。

WILLNEED应该用于你不希望操作系统在你访问后删除页面的东西 - 你应该使用这个或RANDOM如果你有一个索引块或其他不容易确定访问模式的地方

答案 1 :(得分:0)

我认为不可能将madvise与多个参数一起使用。是的,其中一些MADV_advices正在相互覆盖,比如MADV_WILLNEED和MADV_DONTNEED。快速检查linux-mman.h表明建议常量不是位,而是顺序常量(1,2,3,4,...),因此无法使用or组合它们。

因此,多次调用madvise是最佳选择,我相信