我正在阅读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
参数吗?
答案 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是最佳选择,我相信