【问题标题】:Virtual memory- don't fully-understand why we need it beyond security reasons?虚拟内存——不完全理解为什么我们需要它而不是出于安全原因?
【发布时间】:2014-06-24 15:01:53
【问题描述】:

在几本书和网站上,虚拟内存管理的一个原因是它只允许将程序的一部分加载到 RAM 中,因此可以更有效地使用 RAM。

1) 为什么我们需要虚拟内存管理来只加载程序的一部分?为什么我们不能使用物理地址加载程序的一部分?

2) 除了将进程内存的不同部分(堆栈、堆等)分离到不同物理位置的安全原因之外,我真的看不出虚拟内存还有什么其他好处?

3) 为什么进程认为地址是连续的(由虚拟地址提供)而实际上它们是不连续的很重要?

编辑:我知道虚拟内存允许更多内存被视为 RAM 的明显原因。

【问题讨论】:

  • 尝试在只有 8G RAM 的计算机上运行需要 16G 的程序。
  • (如果没有虚拟内存,还有很多其他方法可以做到这一点,主要涉及“覆盖”。但它们很少是更好的方法。)
  • 想象一下,您所在城市的地址是随机分配的,第四街 213 号紧邻胡桃街 952 号,等等。如果没有某种地址到物理坐标的自动“翻译”,您将拥有一个非常很难找到自己的路。
  • @HotLicks 我不明白为什么底层物理内存地址必须是“无序的”(正如您在类比中所说的那样)?
  • 想象一下,建造房屋的人们在查看理想化的城市地图时选择了他们想要的位置,一个人选择了一个在山上的位置,另一个人在那里选择了一个可以俯瞰很晚的位置,然后是房屋出于效率原因,从城市的一个角落开始,彼此相邻建造。

标签: memory-management operating-system paging virtual-memory


【解决方案1】:

与严格的物理内存相比,使用虚拟内存有很多优势,您已经列出了其中一些优势。基本上,它允许您的程序只使用内存,而不必担心它来自哪里或其他可能与之竞争的东西。它使内存看起来是平坦且连续的,即使它分布在物理内存的各个部分和磁盘上。

1) 为什么我们需要虚拟内存管理来只加载一部分 程序?为什么我们不能使用物理加载程序的一部分 地址?

您可以尝试使用纯物理地址,但如果没有足够大的单个块可用怎么办?使用虚拟地址,您可以桥接物理 RAM 的各个部分,并使它们显示为一个大块。您还可以在内存中移动内容,而不会中断会发生这种情况的进程。

2) 出于安全原因将不同部分分开 (堆栈,堆等)进程的内存到各种物理 地点,我真的看不出虚拟还有什么其他好处 内存?

它还有助于防止内存过度碎片化。更容易将一个进程使用的内存与另一个进程使用的内存分开。

3) 为什么进程认为地址是连续的很重要 (由虚拟地址提供)实际上它们是 不连续?

尝试迭代一个在两个不连续的内存部分之间分割的数组,然后再次询问。或者为一些串行通信分配一个缓冲区,或者你的软件需要一块内存的任意次数。

【讨论】:

    【解决方案2】:

    1) 为什么我们需要虚拟内存管理来只加载程序的一部分?为什么我们不能使用物理地址加载程序的一部分?

    我们中的一些人已经足够大,可以记住具有 8MB 内存的 32 位系统。即使压缩一个小的图像文件也会超出系统的物理内存。

    随着系统内存和存储的合并,未来虚拟内存的分页功能很可能会消失。

    2) 除了将进程内存的不同部分(堆栈、堆等)分隔到不同物理位置的安全原因之外,我真的看不出虚拟内存还有什么其他好处?

    见#1。程序所需的内存量可能超过可用的物理内存。

    也就是说,主要的安全原因是将各个进程和系统地址空间分开。堆栈、堆、代码的任何分离通常都是为了方便和错误检测。

    优势包括:

    1. 进程内存超出物理内存
    2. 进程分离
    3. 管理对内核的访问(在某些系统中还包括其他模式)
    4. 防止执行不可执行的页面。
    5. 防止写入只读页面(代码、数据)。
    6. 易于编程

    3) 为什么进程认为地址是连续的(由虚拟地址提供)而实际上它们是不连续的很重要?

    我想你指的是虚拟地址。这只是一个方便的问题。让它们不连续是没有意义的。

    【讨论】:

      【解决方案3】:

      1) 为什么我们需要虚拟内存管理来只加载一部分 程序?为什么我们不能使用物理加载程序的一部分 地址?

      嗯,您显然知道程序的大小可以从几 KB 到几 GB 甚至更多。但是,由于我们对我们的主内存也就是 RAM 有某种限制(由于成本问题),所以大于 RAM 大小的整个程序不能一次全部加载。因此,为了达到预期的结果,科学家(计算机科学家)开发了一种方法virtual memory。这将有助于实现

      a) 首先是space equal to size of some portion of hard-disk(not total),but the major part that would easily accomodate parts of running program。比如说,如果正在运行的程序的大小超过了 RAM 的大小,那么程序有点被切成段(不是真的),只调用容易放入内存的相关部分,然后逐个地址调用后续代码按顺序或按指令调用!

      b) 减少物理内存的负担,从而使主内存中的其他程序能够继续运行。那么还有几个原因!

      2) 出于安全原因将不同部分分开 (堆栈,堆等)进程的内存到各种物理 地点,我真的看不出虚拟还有什么其他好处 内存?

      堆、栈等分离用于存储有时运行的几种操作。 They all are different data-structures and hence they will be storing possibly different program's values or, even if similar program's values, then also distinct instruction sequence's address!比如说,堆栈将存储递归调用的返回地址(调用地址),而堆将指向程序执行的当前代码!

      此外,具有这种存储方案的不是虚拟内存,而是它实际上适合主内存。此外,堆也有几个部分,它们完全执行不同的功能!另外,我已经提到了虚拟内存的好处——有助于同时运行多个程序、优化缓存、使用pagingsegmentation 寻址等。

      3) 为什么进程认为地址是连续的很重要 (由虚拟地址提供)实际上它们是 不连续?

      在世界上会更好吗if there had been counting like 1,2,3,4,5,etc. which we are familiar or had it started like 1,5,2,4,3, etc. even though knowing the true pattern rejecting the choice to render it discontinuous? 好吧,至少我会选择模式选项来执行任何任务。物理(主)内存也是如此!物理内存呈现确切的地址,并且它以不连续的方式清楚地获取地址 - 有点混合。

      但是等等,哇,我们有一个像virtual memory 这样的机制,它导致actual discontinuous memory locations 形成一个固定的regular/continuous memory location!虚拟内存使用分页、分段做了同样的工作,但让我们更容易理解。此外,由于分页中的相对索引和分段 - 尽管实际地址始终由分页方案或分段的起始地址确定,但地址/内存位置似乎是连续的!因此,virtual-memory 呈现为好像我们正在使用一个连续的内存位置。是不是更好/更好!

      【讨论】:

      • @mezamorphic- 我希望它能消除您的疑问!如果您有任何疑问/问题,请随时指出!
      猜你喜欢
      • 2013-10-21
      • 2022-08-16
      • 2020-08-27
      • 1970-01-01
      • 2021-04-28
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多