mmap的使用案例

时间:2012-04-18 21:32:58

标签: c++ linux memory memory-management

我正在攻读我的 OS 决赛。一些论文中的老师简要提到mmap函数(记忆图)。

据我所知(纠正我,如果我错了),mmap用于将一些文件从物理内存加载到RAM(页面默认后)。问题是我没有看到任何其他实际原因,以便更快地访问该文件。

我说错了吗? mmap只用于此吗?

4 个答案:

答案 0 :(得分:5)

“mmap”有很多用途:

  1. 映射文件以获得更快的读/写访问权当然是一种用途

  2. 共享内存(例如,用于进程间通信)是另一个

  3. mmap还用于映射I / O端口地址以进行低级设备通信

答案 1 :(得分:3)

  

mmap用于将一些文件从物理内存加载到RAM(页面默认后)

加载缺少的页面。也可以用同样的方法将修改写入磁盘!

  • 性能(您不必加载整个文件),如果您有随机访问权限,则效果非常好。
  • 它可以使您的代码更加紧凑,您不必担心文件I / O.
  • 操作系统可以处理内存管理,决定在内存中保留哪些页面以及丢弃哪些页面。

答案 2 :(得分:3)

除了@ paulsm4的回答:

  1. ...
  2. ...
  3. ...
  4. 大多数现代malloc(3)实现都使用mmap(2)来管理私有进程内存。
  5. 动态链接加载程序ld.so(8)使用它来映射共享库。

答案 3 :(得分:1)

mmap在很大程度上将内存管理从程序员手中夺走,并将其交给操作系统。

这是关于使用虚拟内存子系统从磁盘到物理内存的请求分页。

因此,要查看文件的第11111个字节,而不是查找和读取,您可以mmap并使用数组索引。操作系统会将环绕数据保留在其“缓冲区缓存”(页面缓存中)。

这是一个例子: http://stromberg.dnsalias.org/~strombrg/pbmonherc.html

这个例子有点乱,因为它是在Linux在其内核中支持mmap的时候编写的,但是C库还没有用于调用它的存根。但你几乎可以忽略mmap.c.该示例使用mmap使用单色显示适配器打开和关闭像素。

另一个合理用途是布隆过滤器: http://stromberg.dnsalias.org/~strombrg/drs-bloom-filter/

...但是在32位操作系统上,mmap内存区域的最大大小有点伤害。