所谓内存映射指的是 让一个磁盘文件与内存中的一个缓冲区相映射,进程访问这块内存时,就等同于访问文件对应映射部分,不必再调用 read / write 。
我们可以使用mmap函数来建立内存和文件某一部分的映射关系。

目录
1、创建共享内存映射:mmap
(4) 映射空间大小可以大于文件大小,但要注意不要访问区外部分
一、共享内存映射的创建 / 释放
1、创建共享内存映射:mmap
mmap 函数的作用是创建共享内存映射。mmap函数的参数较多,几乎每一个参数都有注意事项,下面介绍的重点是mmap函数的参数。

(1) addr
用户可以手动指定要映射的内存地址,一般设置为NULL,让OS自动选择合适的内存地址,如果最后映射建立成功,mmap会返回内存中映射区的首地址。
(2) length
为内存中映射地址空间分配的字节数(length > 0)。这里分为了两种情况:
- length > 文件映射部分大小
- length < 文件大小
当 length < 文件映射部分大小 时,文件有一部分无法映射到内存。

当 length > 文件映射部分大小 时,有一部分无法映射到文件,这就意味着,即便向这部分内存写入内容,也不会反馈给文件。

因此,一般建议设置的映射空间大小直接和文件大小保持一致。文件大小的计算可以使用lseek函数。
// 起始偏移量为0,将文件指针移动到末尾(SEEK_END)
// 返回的结果就是 文件指针相对于起始位置的字节数
int size = lseek(fd, 0, SEEK_END);
(3) prot
指定内存映射空间的访问权限。其实就是要以何种形式来访问这块映射空间,如可读、可写、可执行等,可选值如下:
| 可选值 | 含义 |
| PROT_READ | 可读 |
| PROT_WRITE | 可写 |
| PROT_EXEC | 可执行 |
| PROT_NONE | 不可访问 |
(4) flags
指定内存映射空间的映射方式。可以是共享,代表其他进程可以看到;可以是私有,代表其他进程看不到;也可以是匿名,一般用于有血缘关系之间的进程。可选值如下:

本文深入讲解了内存映射的概念及其实现方法,包括如何使用mmap函数创建内存映射、munmap函数释放映射,以及在使用过程中的注意事项。
最低0.47元/天 解锁文章
2496

被折叠的 条评论
为什么被折叠?



