why mmap is better than read and write
我的问题如下: 在某些情况下,人们使用mmap而不是从文件中读取数据。一个这样的代码是:
*mapping = mmap(NULL, *mapping_size, PROT_READ | PROT_WRITE,
MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
上面的代码尝试分配大量内存。 我想知道mmap在这种情况下做了什么,它是如何工作的。每个人都在谈论mmap wrt文件的优势。但是fd设置为-1的这些代码很常见。这是什么意思,这样做有什么好处。我希望有人能够澄清我的怀疑,由于含糊不清,我无法完全问清楚。
谢谢
答案 0 :(得分:3)
让我试着解决这个问题的一部分,特别是:
但是这些fd设置为-1的代码很常见。这是什么意思,这样做有什么好处。?
====
mmap()
用于在虚拟内存中的某处创建内存映射(某个地方可以由发出mmap的进程引用)。指定文件描述符允许将内存换出到磁盘。此外,由于只有当前访问的文件区域必须加载到内存中,因此可以mmap大小始终大于物理内存和磁盘(交换)空间的文件。请参阅GNU documentation。
有几种用例需要不指定文件描述符并映射匿名内存区域。其中一个可能是扩展进程堆。另一种意愿是共享数据而不将它们保存在文件中,因此不会产生额外的I / O开销。再次从GNU doc:
MAP_ANONYMOUS
MAP_ANON
此标志告诉系统创建一个匿名映射,而不是连接到文件。将忽略filedes和off,并且该区域是>用零初始化。
匿名映射用作在某些系统上扩展堆的基本原语。它们对于在多个>之间共享数据也很有用。没有创建文件的任务。
在某些使用私有匿名mmaps的系统上比使用malloc用于大块更有效。这不是GNU>的问题。 C库,因为包含的malloc自动使用mmap在哪里 合适的。
但是,请注意匿名mmap-ed内存只能在进程内或其子(shm_open()
将共享内存包装在对象中,并使其可用于其他进程。请参阅shm_open()
手册页中的专家(粗体部分是我的):
shm_open()创建并打开一个新的,或打开一个现有的POSIX共享内存对象。 POSIX共享内存对象实际上是一个句柄,可以被不相关的进程用于mmap(2)共享内存的同一区域
fd = -1
只是一些系统的合规性,可以接受您的分配并忽略文件描述符。请参阅Linux上man mmap的专家:
MAP_ANONYMOUS
任何文件都不支持映射;其内容初始化为零。 fd和offset参数被忽略;但是,如果MAP_ANONYMOUS(或。),某些实现要求fd为-1 指定了MAP_ANON),便携式应用程序应该确保这一点。使用MAP_ANONYMOUS 自内核2.4以来,Linux上仅支持与MAP_SHARED的结合。
One of the question you mention对此系统特定行为有一些参考。
答案 1 :(得分:0)
这是用于将动态(新)内存映射到应用程序的一种方法。对于实现malloc()(和朋友)的libc,这是实际分配内存的一种可能技术