Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos mmap有多聪明?_Macos_Unix_Linux Kernel_Mmap - Fatal编程技术网

Macos mmap有多聪明?

Macos mmap有多聪明?,macos,unix,linux-kernel,mmap,Macos,Unix,Linux Kernel,Mmap,mmap可用于在进程之间共享只读内存,减少内存足迹: 进程P1mmaps一个文件,使用映射的内存->将数据加载到RAM中 进程P2mmaps一个文件,使用映射的内存->操作系统重新使用相同的内存 但这个呢: 处理P1mmaps文件,将其加载到内存中,然后退出 另一个进程P2mmaps访问同一个文件,访问P1访问时仍处于热状态的内存 是否再次从磁盘加载数据?操作系统是否足够智能,即使“mmap count”暂时降至零,也可以重新使用虚拟内存 不同操作系统之间的行为是否不同?(我主要对Linux/O

mmap
可用于在进程之间共享只读内存,减少内存足迹:

  • 进程P1
    mmap
    s一个文件,使用映射的内存->将数据加载到RAM中
  • 进程P2
    mmap
    s一个文件,使用映射的内存->操作系统重新使用相同的内存
  • 但这个呢:

  • 处理P1
    mmap
    s文件,将其加载到内存中,然后退出
  • 另一个进程P2
    mmap
    s访问同一个文件,访问P1访问时仍处于热状态的内存
  • 是否再次从磁盘加载数据?操作系统是否足够智能,即使“mmap count”暂时降至零,也可以重新使用虚拟内存

    不同操作系统之间的行为是否不同?(我主要对Linux/OS X感兴趣)

    编辑:如果操作系统不够智能——如果有一个“后台进程”,保持文件
    mmap
    ed,这样它就不会留下至少一个进程的地址空间,会有帮助吗

    当然,当我
    mmap
    munmap
    在同一个过程中连续快速地(但不一定)处理同一个文件时,我对性能感兴趣


    EDIT2:我看到的答案非常详细地描述了完全不相关的问题。为了重申这一点,我是否可以依靠Linux/OS X不重新加载已驻留在内存中的数据,这些数据来自
    mmap
    ed内存段中的上一页点击,即使特定区域不再被任何进程
    mmap
    加密?

    内存中文件内容的存在或不存在与
    mmap
    系统调用的耦合比您想象的要小得多。当您
    mmap
    一个文件时,它不一定会将其加载到内存中。当您
    munmap
    it(或者如果进程退出)时,它不一定放弃页面

    有许多不同的事情可以触发将文件内容加载到内存中:映射文件、正常读取文件、执行文件、尝试访问映射到文件的内存。类似地,有不同的事情可能会导致文件的内容从内存中删除,这主要与操作系统决定要将内存用于更重要的内容有关

    在您的问题的两个场景中,考虑在步骤1和步骤2之间插入一个步骤:

    • 1.5。另一个进程分配并使用大量内存->将
      mmap
      ed文件从内存中移出以腾出空间
    在这种情况下,如果文件内容再次映射并在步骤2中再次使用,则可能必须将其重新加载到内存中

    与:

    • 1.5。什么也没发生->mmap
      ed文件的内容挂在内存中
    在这种情况下,不需要在步骤2中重新加载文件的内容

    就文件内容的变化而言,这两种情况没有太大区别。这类似于第1.5步,将产生更重要的区别


    对于不断访问文件以确保其保存在内存中的后台进程(例如,通过扫描文件,然后在循环中短暂休眠),这当然会迫使文件保留在内存中。但您最好让操作系统自行决定何时退出文件以及何时不退出文件。

    第二个进程可能会在缓冲区缓存中找到第一个进程的数据。因此,在大多数情况下,数据不会再次从磁盘加载。但由于缓冲区缓存是一个缓存,因此不能保证页面不会在中间被逐出

    您可以启动第三个进程,并使用mmap(2)和mlock(2)修复ram中的页面。但这可能会带来更多的麻烦


    Linux将UNIX缓冲区缓存替换为。但原则仍然是一样的。Mac OS X等价物被称为。

    我几乎可以肯定
    mmap
    的规范没有说明操作系统应该如何备份内存。我甚至几乎可以肯定,你的第一个假设也是错误的,没有任何东西说操作系统必须为两个进程使用相同的物理内存。@zneak:谢谢,但我的问题不是假设的假设。我很确定我提到的两个操作系统都有一个具体的答案。我更像是:1)处理一个mmaps文件2)处理a读/写mmaped区域,导致内核从文件中“出错”内存3)可能存在内存压力,导致内存“出错”,直到进程a再次需要它。4) 进程A再次需要内存,它被重新加载5)进程A映射内存6)进程B映射文件7)进程B读取/写入内存,如果它仍然在缓冲区缓存中,则不需要重新加载。我认为很明显我确实在问
    1.5。什么也没发生->mmaped文件的内容挂在内存中。
    ,很抱歉造成混淆。现在,你是说一个新的
    mmap
    可以潜在地重复使用早些时候
    mmap
    ed、loaded、
    munmap
    ed的页面吗?(让我们把它缩小到Linux/OS X上的只读模式)。如果文件的页面仍然在内存中,因为它以前已被读取/映射/执行/预加载/缓存,它将按原样使用它们。如果他们因为被驱逐而不在那里,那就不会了。就这么简单。谢谢你@Celada,这是一个明确的答案。如果没有争用,我会接受。第一个进程甚至不必
    mmap()
    文件-它可以
    read()
    它,第二个进程中的后续
    mmap()
    仍将映射相同的页面缓存页。@caf确定吗<与
    mmap
    相比,code>read
    在文件加载和缓存方面使用了一种完全不同的机制,从设计上看。@user124114没有问题。我把你的问题投了更高的票给你。