mmap是什么?
mmap(memory-mapped file)是一种在计算机内存和磁盘文件之间建立映射关系的技术。它允许将一个文件的内容直接映射到内存中的一个地址空间,使得文件的内容可以像访问内存一样被访问,而无需进行传统的文件读写操作。
通过使用mmap,可以将文件的内容映射到内存中的一块连续区域,从而实现对文件的随机访问。这种映射关系意味着对内存中的数据的访问速度非常快,因为它不需要进行磁盘IO操作,而是直接在内存中进行读写。
mmap可以用于多种用途,包括但不限于以下几个方面:
- 文件访问:可以通过将文件映射到内存,以实现对文件的高效读写操作。
- 共享内存:多个进程可以通过将同一个文件映射到它们的地址空间中,实现对共享数据的访问。
- 内存映射IO:通过将设备文件映射到内存,可以直接在内存中进行设备IO操作,而无需通过传统的读写接口。
需要注意的是,mmap操作是在操作系统层面上进行的,因此具体的实现和特性可能会因操作系统而异。此外,使用mmap时需要谨慎处理内存映射的生命周期和同步访问的问题,以避免出现潜在的错误和竞态条件。
202512 面试, 杭州那家CDN/存储公司
mmap:
内存映射
mmap 是一个系统调用,将文件内容直接映射到内存地址空间。mmap 之后,你就可以像访问内存一样对文件内容进行读写。这样就不需要使用比较重的系统调用(如read,write)去对文件内容进行读写了。
mmap 另一个非常重要的特性是:减少内存的拷贝次数。在 linux 系统中,文件的读写操作通常通过 read 和 write 这两个系统调用来实现,这个过程会产生频繁的内存拷贝。比如 read 函数就涉及了 2 次内存拷贝:
操作系统读取磁盘文件到页缓存;
从页缓存将数据拷贝到 read 传递的 buf 中(例如进程中创建的byte数组)。
而mmap 只需要一次拷贝。即操作系统读取磁盘文件到页缓存,进程内部直接通过指针方式修改映射的内存。因此 mmap 特别适合读写频繁的场景,既减少了内存拷贝次数,提高效率,又简化了操作。KV数据库 bbolt 就使用了这个方法持久化数据。
Go 语言标准库 golang.org/x/exp/mmap 仅实现了 read 操作,后续能否支持 write 操作未知。使用场景非常有限。
寻找关于 Go 中 mmap 的高级资源!有什么书籍/论文/文档吗?
https://www.google.com/search?q=golang+mmap
原文链接: https://dashen.tech/2018/03/11/MMAP与著名反对者Andy/
版权声明: 转载请注明出处.