madvise、fadvise、posix_madvise和posix_fadvise函数的使用

本文详细介绍了madvise系统调用的功能及其参数advice的多种取值,包括MADV_NORMAL、MADV_RANDOM等,并提供了函数原型及各内核版本引入的不同advice类型。

系统调用madvise作用:建议内核如何使用指定段的内存。函数原型如下:

#include <sys/mman.h>

int madvise(void *addr, size_t length, int advice);

 

参数advice的取值有如下几种:

MADV_NORMAL

 

MADV_RANDOM

 

MADV_SEQUENTIAL

 

MADV_WILLNEED

 

MADV_DONTNEED

 

MADV_REMOVE

2.6.16内核引入。

MADV_DONTFORK

2.6.16内核引入。

MADV_DOFORK

2.6.16内核引入。

MADV_HWPOISON

2.6.32内核引入。

MADV_UNMERGEABLE

2.6.32内核引入。

MADV_MERGEABLE

2.6.32内核引入。

MADV_SOFT_OFFLINE

2.6.33内核引入。

MADV_HUGEPAGE

2.6.38内核引入。

MADV_NOHUGEPAGE

2.6.38内核引入。

MADV_DONTDUMP

3.4内核引入。

MADV_DODUMP

3.4内核引入。

 

m表示memoryf表示file,因此madvise是针对内存,而fadvise是针对文件。

 

Posix也有个类似的函数posix_madviseposix_fadvise

#include <sys/mman.h>

int posix_madvise(void *addr, size_t len, int advice);

 

#include <fcntl.h>

int posix_fadvise(int fd, off_t offset, size_t len, int advice);

 

更多详情请浏览:http://man7.org/linux/man-pages/man2/madvise.2.html,或执行man madvise命令。

 

`madvise_set_anon_name` 函数是 Linux 内核中用于实现 `madvise()` 系统调用中设置匿名 VMA 名称功能的一部分。它允许用户通过 `madvise()` 接口为匿名内存区域(VMA)分配一个可读的名称,该名称可在 `/proc/<pid>/smaps` 中查看,从而提升内存调试与性能分析的可读性。 该函数最早在 Linux 内核版本 **4.17** 中引入,作为支持 `PR_SET_VMA_ANON_NAME` 的一部分,其核心实现与 `prctl()` 接口共享命名机制。该功能的提交信息表明,其最初由 Andi Kleen 提交,并在 2018 年 3 月左右合并进主线内核。提交信息中提到,该功能的目的是为匿名 VMA 提供命名支持,以便更清晰地标识内存用途,例如用于图形缓冲区或内存分配器元数据区域[^1]。 提交信息中还说明了该功能的实现细节,包括对 `struct vm_area_struct` 的扩展,以支持存储名称信息,以及对 VMA 合并逻辑的调整,确保名称在合并过程中保持一致性。此外,该函数的实现也考虑了内存开销性能影响,确保名称存储不会引入显著的内存负担[^1]。 ### 示例:使用 `madvise_set_anon_name` 的调用方式 ```c #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MADV_SET_ANON_NAME 0x80000000 int main() { size_t size = 4096; void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (ptr == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } const char *name = "MyCustomVMA"; if (madvise(ptr, size, MADV_SET_ANON_NAME | (uintptr_t)name) != 0) { perror("madvise"); exit(EXIT_FAILURE); } printf("VMA name set successfully. Check /proc/%d/smaps\n", getpid()); sleep(10); // 保持进程运行以便查看 smaps munmap(ptr, size); return 0; } ``` 上述代码展示了如何通过 `madvise()` 调用 `madvise_set_anon_name` 函数来设置匿名 VMA 的名称。需要注意的是,`MADV_SET_ANON_NAME` 是一个非标准扩展,需确保内核配置中启用 `CONFIG_ANON_VMA_NAME` 选项。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值