【问题标题】:what scenarios we set file descriptor as -1 in mmap?我们在mmap中将文件描述符设置为-1的场景是什么?
【发布时间】:2016-05-09 09:53:21
【问题描述】:

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 的代码很常见。这是什么意思,这样做有什么好处。?我希望有人能解决我的疑问,由于模棱两可,我无法完全问出来。

谢谢

【问题讨论】:

  • 来自man如果指定了 MAP_ANONYMOUS(或 MAP_ANON),则某些实现要求 fd 为 -1,便携式应用程序应确保这一点。
  • 感谢您的回复。 Man 说“映射没有任何文件支持;它的内容被初始化为零。fd 和 offset 参数被忽略;但是,如果指定了 MAP_ANONYMOUS(或 MAP_ANON),某些实现要求 fd 为 -1,并且便携式应用程序应该确保这一点。自内核 2.4 起,Linux 才支持将 MAP_ANONYMOUS 与 MAP_SHARED 结合使用。”我想知道我们使用匿名的任何实际案例!!?
  • 用非常压缩的话来说:每次您不想将内存连接到磁盘上的文件时。
  • 是的,是的。但我想知道 fd=-1 的情况,不涉及文件!
  • 当平台特定的手册说它必须是-1时是必需的。

标签: c linux linux-kernel mmap


【解决方案1】:

让我尝试解决这个问题的一部分,具体来说:

但是 fd 设置为 -1 的这类代码很常见。什么意思,这样做有什么好处?

====

mmap() 用于在虚拟内存中的某处创建内存映射(该位置可由发出 mmap 的进程引用)。指定文件描述符允许将内存换出到磁盘。此外,由于只有当前访问的文件区域必须加载到内存中,因此可以映射大小始终大于物理内存和磁盘(交换)空间的文件。请参阅GNU documentation

有几个用例不希望指定文件描述符并映射一个 匿名 内存区域。其中之一可能是扩展进程的堆。另一个是共享数据而不将它们保存在文件中的意愿,因此不会产生额外的 I/O 开销。再次来自 GNU 文档:

MAP_ANONYMOUS

MAP_ANON

这个标志告诉系统创建一个匿名映射,而不是连接到一个文件。文件和关闭被忽略,并且区域 > 用零初始化。

匿名映射被用作在某些系统上扩展堆的基本原语。它们还有助于在多个任务之间共享数据而无需创建文件。

在某些系统上,使用私有匿名 mmap 比使用 malloc 处理大块更有效。这不是 GNU > C 库的问题,因为包含的 malloc 自动使用 mmap 其中 合适。

但是,请注意只能从进程内部或由其子进程访问匿名 mmap 内存。由于内存是匿名的,所以没有办法引用它!必须使用shm_open() 将共享内存包装在一个对象中,并使其可供其他进程使用。请参阅 shm_open() 手册页中的专家(粗体部分是我的):

shm_open() 创建并打开一个新的或打开一个现有的 POSIX 共享内存对象。 POSIX 共享内存对象实际上是一个句柄可以被不相关的进程使用来映射(2)共享内存的同一区域

fd = -1 只是为了让某些系统接受您的分配而忽略文件描述符。在 Linux 上查看来自 man mmap 的专家:

MAP_ANONYMOUS

映射没有任何文件支持;它的内容被初始化为零。 fd 和 offset 参数被忽略;但是,如果 MAP_ANONYMOUS(或 MAP_ANON) 已指定,可移植应用程序应确保这一点。 MAP_ANONYMOUS 的使用 自内核 2.4 起,Linux 才支持与 MAP_SHARED 结合使用。

One of the question you mention 对此系统特定行为有一些参考。

【讨论】:

    【解决方案2】:

    这是一种用于将动态(新)内存映射到您的应用程序的方法。对于实现 malloc()(和朋友)的 libc,这是实际分配内存的一种可能技术

    【讨论】:

    • 感谢您的回复。但是 malloc 足以正确分配内存。为什么必须使用 mmap 和 ANON 来分配内存(fd=-1)。?? mmap 还有其他目的,而不是对文件进行操作。这是动态分配内存。但是为什么不使用 malloc ,为什么要再次使用 mmap ,利弊以及有关 mmap 用于此用法的任何其他见解将不胜感激
    • malloc() 可能很适合你。特殊项目想自己做内存分配实现可以用这个,比如电栅栏、valgrind、UML。
    • 是的。但即使是那些实现也可以通过 malloc 来完成,对吧?这个 mmap 有什么特别的优势或灵活性??
    • 可能没什么,因为malloc,对于大量的内存,会使用anonymous mmap来分配内存。
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2020-12-09
    • 2014-04-07
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多