1

我目前正在为我的操作系统决赛而学习。一些论文中的老师简单地提到了mmap函数(内存映射)。

据我了解(如果我错了,请纠正我),mmap 用于将一些文件从物理内存加载到 RAM(在页面默认值之后)。问题是我没有看到任何实际原因,否则可以加快对该文件的访问时间。

我对么?mmap 仅用于此目的吗?

4

4 回答 4

5

“mmap”有很多用途:

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

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

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

于 2012-04-18T21:40:25.680 回答
3

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

加载丢失的页面。也可以以相同的方式将修改写入磁盘!

  • 性能(您不必加载整个文件),如果您有随机访问权限,效果会非常好。
  • 它可以大大使您的代码更紧凑,您不必担心文件 I/O。
  • 操作系统可以处理内存管理,决定将哪些页面保留在内存中以及丢弃哪些页面。
于 2012-04-18T21:41:39.903 回答
3

除了@paulsm4 的回答:

  1. ...
  2. ...
  3. ...
  4. 大多数现代malloc(3)实现用于mmap(2)管理私有进程内存。
  5. 动态链接加载器ld.so(8)使用它来映射共享库。
于 2012-04-18T21:47:43.483 回答
1

mmap 在很大程度上将内存管理从程序员手中拿了出来,交给了 OS。

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

因此,要查看文件的第 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'd 内存区域的最大大小有点疼。

于 2012-04-18T22:32:25.150 回答