什么是 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 有助于你更好地理解现代计算机系统的工作原理!

相关推荐
沫璃染墨10 分钟前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu21 分钟前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
深念Y36 分钟前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
知识分享小能手1 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
无忧.芙桃1 小时前
位图妙用:512MB 实现 40 亿整数的存在性查询
c语言·c++·面试·哈希算法
ShineWinsu1 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
朝朝辞暮i1 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
殷色玫瑰2 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
李游Leo2 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
忆挽篱笙歌2 小时前
gcc,g++
linux