多次拨打疯狂电话
Multiple calls to madvise
我正在阅读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是最好的选择,我相信
- 在疯狂的部分中声明变量
- C++ 电话号码字母拨号程序 - 语法错别字?还是非 ASCII 字符?
- 未来值公式显示疯狂巨大数字的输出
- 电话价格问题(十月挑战代码厨师)
- 使用 Firebase 从C++获取用户的电话号码
- 疯狂(乘,添加,划分)哈希功能如何起作用
- 拦截黑莓电话
- 使用Regex验证电子邮件和电话字段QT
- 电话拨号程序将字母转换为卡片花色而不是数字
- 文本文件中的电话号码查找
- 如何实现C 电话号码格式:(000)-000-000
- 如果 LibpocoFoundation 与我的小应用程序相关联,readdir 就会挂断电话
- C++ 2D 阵列...迷失在原型和电话上,在任何地方都看不到这个
- C 电话号码程序
- 电话目录程序使用C 中的2D数组
- 隐式操作员bool()没有回应我的电话
- 我想串入文本文档中列出的电话号码
- 如何在BlackBerry Cascades中显示带有一定数量的电话手板
- 编译弃用电话的时间检测
- 多次拨打疯狂电话