什么是 mmap?

什么是 mmap?

mmap 是一个非常重要且强大的系统调用,全称是 memory map (内存映射)。 mmap 的核心思想是:将文件或其他资源直接"映射"到进程的内存地址空间中

想象一下:

  • 普通文件操作:像用勺子一勺一勺地从桶里舀水(读/写操作)
  • mmap 方式:直接把整个桶搬到你的工作台上,你可以直接看到和操作桶里的水

mmap 的主要用途

1. 文件读写(最常用)

arduino 复制代码
// 传统方式:read/write
read(fd, buffer, size);
write(fd, buffer, size);
​
// mmap 方式:直接内存访问
void *addr = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
// 现在可以直接像操作内存一样操作文件内容
char data = ((char*)addr)[0];

2. 进程间通信(IPC)

多个进程可以映射同一个文件,实现数据共享。

3. 匿名内存分配

分配大块内存(类似 malloc,但更适合大内存分配)。

mmap 的优势

特性 传统 read/write mmap
性能 需要系统调用,数据拷贝 直接内存访问,零拷贝
便捷性 需要缓冲区管理 像操作普通内存一样简单
共享 复杂 天然支持进程间共享

现代应用中的 mmap

  1. 数据库系统:如 MySQL、PostgreSQL 使用 mmap 来缓存数据文件
  2. 编程语言运行时:如 Java、Python 使用 mmap 加载动态库
  3. 大数据处理:Spark、Hadoop 使用 mmap 处理大型数据集
  4. 视频/图像编辑:Photoshop 等软件使用 mmap 处理大文件

简单的代码示例

arduino 复制代码
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
​
// 将文件映射到内存并读取
int fd = open("example.txt", O_RDONLY);
void *addr = mmap(NULL, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
​
// 现在可以直接像操作内存一样读取文件内容
printf("First byte: %c\n", ((char*)addr)[0]);
​
// 使用完后取消映射
munmap(addr, file_size);
close(fd);

总结

mmap 是操作系统提供的一种高效机制,它:

  • 消除了数据拷贝:不需要在内核和用户空间之间来回拷贝数据
  • 简化了编程:文件操作变得像内存操作一样简单
  • 提高了性能:特别适合大文件和随机访问场景

它是一个相对底层的概念,但被广泛用于各种高性能的软件系统中。理解 mmap 有助于你更好地理解现代计算机系统的工作原理!

相关推荐
六点_dn2 分钟前
Linux学习笔记-shell运算符
linux·笔记·学习
hehelm32 分钟前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++
浅止菌1 小时前
嵌入式项目Makefile越写越乱?一张万能模板+5个技巧,告别重复劳动
linux
灵晔君1 小时前
【C++】二叉搜索树
开发语言·c++
鱼子星_2 小时前
【C++】内存管理:内存分布,new/delete的使用及细节处理,new/delete的底层,定位new表达式
开发语言·c++·笔记
鱼子星_2 小时前
【C++】string(上):string的基本使用
c++·笔记·字符串
刘某的Cloud2 小时前
手工配置nginx的systemd服务
linux·运维·网络·nginx·systemd
FREEDOM_X2 小时前
嵌入式Linux摄像头采集与图像处理
linux·图像处理·ubuntu
studytosky3 小时前
OpenClaw 入门与 Skill 开发
linux·服务器·ai编程
kaoa0003 小时前
Linux入门攻坚——82、kvm虚拟化-2
linux·运维·服务器