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

相关推荐
小龙报27 分钟前
《算法通关指南---C++编程篇(3)》
开发语言·c++·算法·visualstudio·学习方法·visual studio
Mr_WangAndy1 小时前
C++设计模式_行为型模式_状态模式State
c++·设计模式·状态模式
郝学胜-神的一滴1 小时前
Effective STL 第5条:区间成员函数优先于单元素成员函数
开发语言·c++·程序人生·stl·软件工程
江公望1 小时前
Qt的QT_QPA_EGLFS_INTEGRATION环境变量浅解
linux·qt·qml
mit6.8242 小时前
c++|表达最值的更好方法|clamp
c++
YuCaiH2 小时前
网络编程的基础知识
linux·笔记·嵌入式·网络通信
Siren_dream2 小时前
在VMware上运行Linux(我选择的是Ubuntu)
linux·运维·ubuntu
☆璇2 小时前
【Linux】Socket编程UDP
linux·网络·udp
涤生z2 小时前
list.
开发语言·数据结构·c++·学习·算法·list
FFZero12 小时前
【C++/Lua联合开发】 (三) C++调用Lua
c++·junit·lua