多次拨打疯狂电话

Multiple calls to madvise

本文关键字:疯狂 电话      更新时间:2023-10-16

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

如果我想利用多个advice参数,根据我的应用程序的用例,简单地连续多次调用madvise可以接受吗?

例如,如果我想提示内核通过MADV_WILLNEED提前开始读取mmap'd文件,但我知道我的应用程序将主要使用顺序读取,我也可以利用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参数吗?

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

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

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

如果您的访问是顺序的,那么您应该使用MADV_SEQUENTAL——它应该进行预读,然后在您访问页面后将其丢弃,从而为您提供最佳的性能和内存管理。

WILLNED应该用于那些你不希望操作系统在你访问后丢弃页面的地方——如果你有一个索引块或其他不容易确定访问模式的地方,你应该使用这个或RANDOM。

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

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