在mmap中我们将文件描述符设置为-1的场景是什么?

时间:2016-05-09 09:53:21

标签: c linux linux-kernel mmap

why mmap is better than read and write

one more similar post

我的问题如下: 在某些情况下,人们使用mmap而不是从文件中读取数据。一个这样的代码是:

 *mapping = mmap(NULL, *mapping_size, PROT_READ | PROT_WRITE,
      MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

上面的代码尝试分配大量内存。 我想知道mmap在这种情况下做了什么,它是如何工作的。每个人都在谈论mmap wrt文件的优势。但是fd设置为-1的这些代码很常见。这是什么意思,这样做有什么好处。我希望有人能够澄清我的怀疑,由于含糊不清,我无法完全问清楚。

谢谢

2 个答案:

答案 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,这是实际分配内存的一种可能技术