<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" type="topic" style="task" id="memory-map-what" xml:lang="zh_CN">

  <info>
    <revision pkgversion="3.11" date="2014-01-28" status="candidate"/>
    <link type="guide" xref="index#memory" group="memory"/>

    <include xmlns="http://www.w3.org/2001/XInclude" href="legal.xml"/>

    <credit type="author copyright">
      <name>Phil Bull</name>
      <email>philbull@gmail.com</email>
      <years>2011</years>
    </credit>

    <credit type="author copyright">
      <name>Michael Hill</name>
      <email>mdhillca@gmail.com</email>
      <years>2011, 2014</years>
    </credit>

    <desc>进程的内存映射可以帮助诊断某些内存问题。</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Victor_Trista</mal:name>
      <mal:email>ljlzjzm@hotmail.com</mal:email>
      <mal:years>2023</mal:years>
    </mal:credit>
  </info>

  <title>什么是内存映射？</title>

  <p><gui>虚拟内存</gui> 代表系统中 <gui>物理内存</gui> 和 <link xref="mem-swap">交换空间</link> 的组合。通过将物理内存中的位置 <gui>映射</gui> 到磁盘中的文件，它使正在运行的进程能够访问现有物理内存以外的<em>更多</em>内存。</p>

  <p>当程序启动时，系统会为其分配一个唯一的进程 ID （PID），其 <em>指令</em> 和 <em>数据</em> 以 <em>页</em> 为单位加载到内存中。每个进程的页表映射其在虚拟内存中的页与其在物理内存中的位置之间的对应关系。<gui>内存映射</gui> 显示进程的总虚拟内存使用量，并可用于确定运行单个或多个程序实例的内存开销，确保使用正确的共享库，查看调整程序可能具有的各种性能调优参数的结果，或诊断内存泄漏等问题。</p>

  <p>如果一个程序的多个副本正在运行，则程序的指令（或<em>代码</em>）只需加载一次到物理内存中。每次启动程序的新实例（作为具有独立虚拟内存页的唯一进程）时，其页表将虚拟内存中代码的位置映射到原始物理内存位置中的指令。此外，进程使用的任何动态共享库在虚拟内存中呈现为不同的库，但是共同引用物理内存中库代码段的同一副本。在考虑进程的总内存使用量时，需要注意的是，共享库的内存开销可以分摊到当前使用它们的所有进程中。</p>

  <p>当系统需要的内存页面多于可用内存页面时，一些现有页面将被 <em>调出</em> 或写入 <gui>交换空间</gui>。代码页面在内存中被标记为读取-执行，不需要写入交换，因为它们可以从磁盘上的原始位置重新加载。数据页具有读写权限，如果在内存中被修改，它们将被标记为 <em>脏</em>，并且当指定用于交换时，必须被调出。当运行中的进程需要交换空间中的页面时，需要在使用前调回它，这可能会导致另一个页面被调出。</p>

</page>
