madvise和fadvise的区别

本文详细解析了madvise与posix_fadvise这两个系统调用的不同之处及应用场景。madvise用于向内核提供有关现有内存区域的使用建议,而fadvise则针对文件缓存给出提示。文章还介绍了它们在匿名内存映射和文件映射中的使用区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

madvise() and posix_fadvise() are not synonymous. madvise() tells the kernel (give advise) what to do with existing memory region while fadvise() tells the kernel what to do with cached (or future cache) of a file data.

For example, if you mmap() anonymous region you should use madvise() to hint the kernal not to swap out (MADV_RANDOM) or to swap out only after access. (MADV_SEQUENTIAL)

If you mmap() a file, or part of a file, you can use either madvise() or fadvise() to hint the kernel to readahead for you (MADV_WILLNEED) or to free that cache (MADV_DONTNEED) or to free after access (POSIX_FADV_NOREUSE, fadvise() only) in additional to the above.

If you use file without mapping the data to your process memory (without using mmap()), you should use fadvise() only. madvise() has no meaning.

As far as kernel subsystem, in linux, it is the same subsystem, simply different ways to refer to memory pages and file cache. Please note that those are only hints and when memory is in dire, the kernel might decide to swap out or reuse cached data despite the hint. Only mlock() and mlockall() can prevent that.

In your case, not giving any hint may help, especially if some pages are being read more than other, since the kernel will figure out which pages are "hot" and will attempt to keep in memory.

03-18
### madvise 函数概述 `madvise` 是 Linux Unix 系统中的一个重要函数,用于向操作系统提供关于内存访问模式的建议。这些建议可以帮助优化系统的性能,尤其是在处理大块内存区域时。该函数允许应用程序告知内核如何管理特定范围内的虚拟内存页面。 其原型定义如下: ```c #include <sys/mman.h> int madvise(void *addr, size_t length, int advice); ``` 参数说明: - `addr`: 起始地址,必须是对齐到页大小的指针。 - `length`: 表示要操作的内存区域长度(字节数)。 - `advice`: 提供给内核的具体建议类型,常见的选项包括但不限于以下几种[^3]: - `MADV_NORMAL`: 默认行为,表示没有特殊的访问模式。 - `MADV_RANDOM`: 访问顺序随机,减少预读取。 - `MADV_SEQUENTIAL`: 访问顺序连续,增加预读取。 - `MADV_WILLNEED`: 应用程序即将频繁访问此区域,应优先加载这些页面。 - `MADV_DONTNEED`: 不再需要这些数据,可以释放对应的物理内存。 返回值:成功时返回0;失败则返回-1并设置相应的错误码。 当调用者希望改善某些特殊场景下的内存使用效率时,可以通过调整不同的`advice`来实现目标。例如,在大数据集上运行的应用可能受益于告诉内核哪些部分的数据不再重要从而被丢弃(`MADV_DONTNEED`)或者提前加载预计会使用的区块(`MADV_WILLNEED`)等策略[^4]。 需要注意的是,并不是所有的`advice`都会被执行——具体取决于当前平台支持情况以及实际环境状态等因素影响下最终决定采取何种行动方案最为合适有效而已并非绝对强制遵循所给定指示内容本身含义解释而已罢了而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而已而
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值