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

相关推荐
祁鱼鱼鱼鱼鱼3 分钟前
Keepalived实验环境设定
linux·服务器·网络
Genie cloud6 分钟前
VPS 网络连接故障诊断与排查实用指南
linux·服务器·ssh
RisunJan14 分钟前
Linux命令-lnstat(快速查找文件和目录)
linux·运维·服务器
滴水之功20 分钟前
OpenWrt的WAN和LAN的切换
linux·网络·openwrt
你撅嘴真丑31 分钟前
第八章 - 贪心法
开发语言·c++·算法
历程里程碑41 分钟前
Linux 17 程序地址空间
linux·运维·服务器·开发语言·数据结构·笔记·排序算法
u01092727144 分钟前
模板元编程调试方法
开发语言·c++·算法
CC.GG1 小时前
【Linux】进程控制(二)----进程程序替换、编写自主Shell命令行解释器(简易版)
linux·服务器·数据库
2401_838472511 小时前
C++图形编程(OpenGL)
开发语言·c++·算法
-dzk-1 小时前
【代码随想录】LC 203.移除链表元素
c语言·数据结构·c++·算法·链表