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

相关推荐
Yyyy4823 小时前
Ubuntu安装Jenkis
linux·运维·ubuntu
Larry_Yanan3 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
zhuzewennamoamtf3 小时前
Linux SPI设备驱动
android·linux·运维
春日见3 小时前
在虚拟机上面无法正启动机械臂的控制launch文件
linux·运维·服务器·人工智能·驱动开发·ubuntu
J ..4 小时前
C++ 多线程编程基础与 std::thread 使用
c++
你的冰西瓜4 小时前
C++标准模板库(STL)全面解析
开发语言·c++·stl
松涛和鸣4 小时前
Linux Makefile : From Basic Syntax to Multi-File Project Compilation
linux·运维·服务器·前端·windows·哈希算法
闻缺陷则喜何志丹4 小时前
【计算几何】仿射变换与齐次矩阵
c++·数学·算法·矩阵·计算几何
chen_ever4 小时前
Protobuf详解(从安装到实战)
c++·rpc·信息与通信
Predestination王瀞潞4 小时前
JDK安装及环境变量配置
java·linux·开发语言