【问题标题】:Virtually contiguous vs. physically contiguous memory虚拟连续内存与物理连续内存
【发布时间】:2014-03-28 01:40:35
【问题描述】:

虚拟连续的内存也总是物理上连续的吗?如果不是,如何在物理上不连续的 RAM 块上分配和映射几乎连续的内存?非常感谢您提供详细的答案。

【问题讨论】:

  • 详细的答案是书本大小的。

标签: linux memory memory-management virtual-machine


【解决方案1】:

简短回答:您无需关心(除非您是内核/驱动程序开发人员)。对你来说都是一样的。

更长的答案:相反,几乎连续的内存通常不是物理上连续的(只有非常少的数量)。除非是巧合,或者机器刚启动不久。但是,这不是必需的。

分配大量物理上连续 RAM 的唯一方法是使用大页面(因为一页内的内存需要是连续的)。然而,这是无用的努力,因为对于您的进程而言,您认为它是连续的内存是否实际上是连续的,并没有明显的区别,但是使用大页面也有缺点。

物理上非连续 RAM 上的内存映射没有特别“特殊”的方式。它遵循与所有内存管理相同的方法。

操作系统将虚拟内存划分为“页面”并为您的进程创建页表条目。当你访问某个位置的内存时,要么对应的页面根本不存在,要么存在并且对应于 RAM 中的一个真实页面,或者它存在但 em> 对应于 RAM 中的 真实 页。

如果页面存在于 RAM 中,则什么也不会发生1。否则会产生故障并运行一些操作系统代码。如果事实证明该页面根本不存在(或没有正确的访问权限),您的进程将因分段错误而被终止。

否则,操作系统会选择一个未使用的任意页面(或换出它认为最不重要的页面),并将数据从磁盘加载到该页面。在内存映射的情况下,数据来自映射文件,否则来自交换(对于全新分配的内存,将复制零页)。然后操作系统将控制权返回给您的进程。你永远不知道这件事发生了。

如果您访问位于不同页面的“连续”(或者您认为!)内存区域中的另一个位置,则会运行完全相同的过程。


1 实际上,它有点复杂,因为一个页面可能存在于 RAM 中,但不是“正式”存在的,它是要回收的页面列表的一部分等。但这变得太复杂了。

【讨论】:

    【解决方案2】:

    不,没必要。虚拟内存的任何页面都可以映射到任意物理页面。因此,您可以让虚拟内存的相邻页面指向不相邻的物理页面。此映射由操作系统维护,并由 CPU 的 MMU 单元使用。

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多