{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/virtual-vs-physical-memory/",
  "atlas": "https://www.pystone.net/?node=virtual-vs-physical-memory#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/virtual-vs-physical-memory.md",
  "context": "https://www.pystone.net/notes/virtual-vs-physical-memory.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:virtual-vs-physical-memory",
  "slug": "virtual-vs-physical-memory",
  "title": "虚拟内存和物理内存的区别和联系",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "虚拟内存和物理内存的区别和联系",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "590c2f0636deda6b19b62efa0a647fbd53b7afad11586550213fcf9ceb16e6e3",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "虚拟内存和物理内存的区别和联系",
      "anchor": "虚拟内存和物理内存的区别和联系",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%9A%84%E5%8C%BA%E5%88%AB%E5%92%8C%E8%81%94%E7%B3%BB"
    },
    {
      "depth": 4,
      "text": "我如何完整的回答：",
      "anchor": "我如何完整的回答",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E6%88%91%E5%A6%82%E4%BD%95%E5%AE%8C%E6%95%B4%E7%9A%84%E5%9B%9E%E7%AD%94"
    },
    {
      "depth": 4,
      "text": "概念",
      "anchor": "概念",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E6%A6%82%E5%BF%B5"
    },
    {
      "depth": 4,
      "text": "为什么需要物理内存",
      "anchor": "为什么需要物理内存",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98"
    },
    {
      "depth": 4,
      "text": "进程访问一个地址的过程",
      "anchor": "进程访问一个地址的过程",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E8%BF%9B%E7%A8%8B%E8%AE%BF%E9%97%AE%E4%B8%80%E4%B8%AA%E5%9C%B0%E5%9D%80%E7%9A%84%E8%BF%87%E7%A8%8B"
    },
    {
      "depth": 4,
      "text": "虚拟内存是怎么工作的",
      "anchor": "虚拟内存是怎么工作的",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E6%98%AF%E6%80%8E%E4%B9%88%E5%B7%A5%E4%BD%9C%E7%9A%84"
    },
    {
      "depth": 4,
      "text": "利用虚拟内存机制的优点",
      "anchor": "利用虚拟内存机制的优点",
      "citation": "https://www.pystone.net/notes/virtual-vs-physical-memory/#%E5%88%A9%E7%94%A8%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E6%9C%BA%E5%88%B6%E7%9A%84%E4%BC%98%E7%82%B9"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:systems-and-network-security",
      "title": "系统基础与网络安全",
      "url": "https://www.pystone.net/notes/systems-and-network-security/",
      "atlas": "https://www.pystone.net/?node=systems-and-network-security#knowledge-atlas",
      "label": "系统基础与网络安全",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "计算机与操作系统中的“虚拟内存和物理内存的区别和联系”导航项",
      "citation": "https://www.pystone.net/notes/systems-and-network-security/#%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8E%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F"
    }
  ],
  "contentMarkdown": "# 虚拟内存和物理内存的区别和联系\n\n﻿# 虚拟内存和物理内存的区别和联系\n\n> 创建时间：2020/3/17 23:01\n\n#### 我如何完整的回答：\n\n物理内存就是真实的硬件设备（比如内存条）提供的内存，虚拟内存是为了解决物理内存不足的问题，利用磁盘空间虚拟出来的一块逻辑内存。\n32位平台下每个进程运行时都会得到4G的虚拟内存。它通常是被分隔成多个物理内存碎片，还有一部分存储在外部磁盘存储器上，在需要时进行数据交换。\n每次我要访问地址空间上的某一个地址，都需要把地址翻译为实际物理内存地址\n通过页表来记录，哪些地址空间上的数据在物理内存上，哪些不在。\n如果不在就会发生缺页中断。操作系统会将硬盘里对应的页换入内存。\n如果内存已经满了，就通过页面置换算法来决定把内存中的哪一块而进行换进换出。\n\n#### 概念\n\n物理内存：真实的硬件设备（内存条）\n\n虚拟内存：利用磁盘空间虚拟出的一块逻辑内存，用作虚拟内存的磁盘空间被称为交换空间（Swap Space）。（为了满足物理内存的不足而提出的策略）\n\n参考链接：https://blog.csdn.net/lvyibin890/article/details/82217193\n\n#### 为什么需要物理内存\n\n没有虚拟内存概念的时候，程序寻址用的都是物理地址。程序能寻址的范围是有限的，这取决于CPU的地址线条数。比如在32位平台下，寻址的范围是2^32也就是4G。\n**每个进程运行时都会得到4G的虚拟内存**\n\n>   * 内存不足，没有得到分配资源的进程就只能等待。进程频繁的装入内存的操作是很没效率的。\n>   * 指令都是直接访问物理内存的，那么我这个进程就可以修改其他进程的数据，甚至会修改内核地址空间的数据\n>   * 内存时随机分配的，所以程序运行的地址也是不正确的\n>\n\n**进程得到的这4G虚拟内存是一个连续的地址空间（这也只是进程认为），而实际上，它通常是被分隔成多个物理内存碎片，还有一部分存储在外部磁盘存储器上，在需要时进行数据交换。**\n\n#### 进程访问一个地址的过程\n\n  1. 每次我要访问地址空间上的某一个地址，都需要把地址翻译为实际物理内存地址\n  2. 所有进程共享这整一块物理内存，每个进程只把自己目前需要的虚拟地址空间映射到物理内存上\n  3. 进程需要知道哪些地址空间上的数据在物理内存上，哪些不在（可能这部分存储在磁盘上），还有在物理内存上的哪里，这就需要通过页表来记录\n  4. 页表的每一个表项分两部分，第一部分记录此页是否在物理内存上，第二部分记录物理内存页的地址（如果在的话）\n  5. 当进程访问某个虚拟地址的时候，就会先去看页表，如果发现对应的数据不在物理内存上，就会发生缺页异常\n  6. 缺页异常的处理过程，操作系统立即阻塞该进程，并将硬盘里对应的页换入内存，然后使该进程就绪，如果内存已经满了，没有空地方了，那就找一个页覆盖，至于具体覆盖的哪个页，就需要看操作系统的页面置换算法是怎么设计的了。\n\n#### 虚拟内存是怎么工作的\n\n当每个进程创建的时候，内核会为进程分配4G的虚拟内存，当进程还没有开始运行时，这只是一个内存布局。实际上并不立即就把虚拟内存对应位置的程序数据和代码（比如.text .data段）拷贝到物理内存中，只是建立好 **虚拟内存** 和 **磁盘文件** 之间的映射就好（叫做 **存储器映射** ）。这个时候数据和代码还是在磁盘上的。当运行到对应的程序时，进程去寻找页表，发现页表中地址没有存放在物理内存上，而是在磁盘上，于是发生 **缺页异常** ，于是将磁盘上的数据拷贝到物理内存中。\n\n另外在进程运行过程中，要通过 **malloc来动态分配内存** 时，也 **只是分配了虚拟内存** ，即为这块虚拟内存对应的页表项做相应设置，当进程真正访问到此数据时，才引发缺页异常。\n\n可以认为虚拟空间都被映射到了磁盘空间中（事实上也是按需要映射到磁盘空间上，通过mmap， **mmap** 是用来建立 **虚拟空间和磁盘空间的映射关系** 的）\n\n#### 利用虚拟内存机制的优点\n\n  1. 既然每个进程的内存空间都是一致而且固定的（32位平台下都是4G），所以链接器在链接可执行文件时，可以设定内存地址，而不用去管这些数据最终实际内存地址，这交给内核来完成映射关系\n  2. 当不同的进程使用同一段代码时，比如库文件的代码，在物理内存中可以只存储一份这样的代码，不同进程只要将自己的虚拟内存映射过去就好了，这样可以节省物理内存\n  3. 在程序需要分配连续空间的时候，只需要在虚拟内存分配连续空间，而不需要物理内存时连续的，实际上，往往物理内存都是断断续续的内存碎片。这样就可以有效地利用我们的物理内存\n"
}
