【问题标题】:Is Virtual memory really useful all the time?虚拟内存真的一直有用吗?
【发布时间】:2011-10-10 13:56:41
【问题描述】:

虚拟内存是现代操作系统当前使用的一个很好的概念。但是我被困在回答一个问题并且对此不太确定。问题来了:

假设一台机器上只有几个应用程序运行,这样 系统的物理内存大于所有系统所需的内存 应用程序。为了支持虚拟内存,操作系统需要做很多工作。因此,如果 运行的应用程序都装在物理内存中,是虚拟内存 真的需要吗?

(此外,一起运行的应用程序将始终适合 RAM。)

【问题讨论】:

  • 我认为你需要用更好的措辞重写你的问题。
  • 是的 Nayuki,我同意,但以更好的方式询问它超出了我的专业知识。如果您可以或可以进行编辑或提出建议,我一定会做出改变。

标签: operating-system kernel virtual-memory


【解决方案1】:

即使所有应用程序的内存使用量适合物理内存,虚拟内存仍然有用。 VM 可以提供以下功能:

  • 特权内存隔离(每个应用都不能接触内核或内存映射的硬件设备)
  • 进程间内存隔离(一个应用看不到另一个应用的内存)
  • 静态内存地址(例如,每个应用在地址 0x0800 0000 处都有 main()
  • 惰性内存(例如,堆栈中的页面在第一次访问时被分配并设置为零)
  • 重定向内存(例如memory-mapped files
  • 共享程序代码(如果一个程序或库的多个实例正在运行,则其代码只需在内存中存储一​​次)

【讨论】:

  • +1 Nayuki 的好答案。我正在寻找有关此类事情的更多详细信息。
  • 恐怕我无法提供任何细节,因为您需要了解虚拟内存的工作原理才能了解它为什么可以提供这些功能。
  • 这是一个小优势,但我认为值得一提。当 DLL 被加载到 RAM 中时,虚拟内存管理器可以检测到同一个 DLL 被多次加载,它使进程共享相同的物理 RAM。所以我们的现代操作系统分配的内存更少。
【解决方案2】:

虽然在这种情况下并非绝对需要,但虚拟内存不仅仅是提供比物理可用内存“更多”的内存(交换)。例如,它有助于避免内存碎片(从应用程序的角度来看),并且根据动态/共享库的实现方式,它可以帮助避免重定位(重定位是当动态链接器需要调整库或可执行文件中的指针时)刚刚加载)。

【讨论】:

  • 好评+1 但是如果我们没有虚拟机,这意味着应用程序将具有物理内存访问权限。在这种情况下,我们将无法限制某个应用访问或破坏其他应用的数据。
  • @abhinav:理论上,内存权限与内存映射无关(这是我们通常看到的“虚拟内存”的主要特征)。但是单独的权限没有多大意义,因此几乎总是与映射一起使用。
【解决方案3】:

还有几点需要考虑:

  • 不处理内存分配代码中的故障的有缺陷的应用程序
  • 有漏洞的应用程序会泄漏分配的内存

虚拟内存降低了这些错误的严重性。

【讨论】:

    【解决方案4】:

    其他回复列出了虚拟内存有用的正当理由,但 我想更直接地回答这个问题:不,虚拟内存 在您描述的情况下不需要并且不使用虚拟 在这种情况下,内存可能是正确的权衡。

    Seymour Cray 提出“虚拟内存导致虚拟 性能。”并且大多数(全部?)克雷向量机缺乏虚拟 记忆。这通常会导致流程级别的更高性能 (不需要翻译,进程在 RAM 中是连续的)但可以导致 降低系统级别的资源使用率(操作系统无法利用 RAM 完全,因为它在进程级别上变得碎片化)。

    因此,如果系统以最大性能为目标(而不是最大 资源利用率)跳过虚拟内存是有意义的。

    当您遇到严重的性能(和稳定性)问题时 当用户在现代基于 Unix 的 HPC 集群节点上经常看到 超额认购 RAM 并且系统开始分页到磁盘,有一个 对过程开始的 Cray 模型有一定的同情心 并以最高性能运行,或者根本不启动。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2018-07-09
      • 1970-01-01
      • 2018-11-12
      • 2013-10-21
      • 1970-01-01
      相关资源
      最近更新 更多