【问题标题】:Contiguous blocks of memory and VM连续的内存块和虚拟机
【发布时间】:2011-09-29 20:57:04
【问题描述】:

我正在阅读虚拟内存,据我了解,每个进程都有自己的 VM 表,该表将 VM 地址映射到实际内存中的物理地址。因此,如果一个进程连续分配对象,它们可能会存储在物理内存中完全不同的位置。我的问题是,如果我分配一个应该存储在连续内存块中的数组,并且如果数组的大小需要的空间超过一页可以提供的空间,那么据我所知,该数组将连续存储在 VM 中但可能在 PM 中完全不同的位置。它是否正确?如果我误解了 VM 的工作原理,请纠正我。如果它是正确的,那是否意味着我们只关心分配是否在 VM 中是连续的?

【问题讨论】:

    标签: memory memory-management virtual


    【解决方案1】:

    现代内存处理程序永远无法真正知道与页面边界重叠的内容在物理内存中是否实际上是连续的。内存粘合逻辑本质上将所有可寻址的内存页面视为一个无序集,并且排序本质上与一个进程相关联;对于最终被分配相同的两个物理内存页面(在不同时间点)的不同进程,不能保证这些物理页面之间的表达关系是相同的。实际上,在 CPU 和处理这些东西的内存之间有一个翻译层。

    【讨论】:

      【解决方案2】:

      没错。数组只能在您的应用程序中看起来是连续的,但可能在物理上分散在内存中。

      【讨论】:

      • ...没有问题
      【解决方案3】:

      我只是想补充/明确一点,从用户空间程序的角度来看,一块分配的内存总是出现连续的。操作系统与 CPU 的内存管理单元 (MMU) 一起处理所有虚拟到物理内存的映射,程序员永远需要担心这种映射是如何处理的(当然,除非上述程序员是编写操作系统)。

      编译器(或以汇编形式编写代码的编译器)可以将程序的地址视为从 0 开始,一直到该特定程序所需的最大地址为止。然后操作系统为每个进程创建一个页表,并使用该表对每个虚拟内存位置的物理地址进行部分解码。操作系统将程序中的地址视为两个独立的部分,即页地址和该页的偏移量。然后,MMU 将页面地址转换为物理帧地址。请注意,从操作系统的角度来看,物理内存“帧”类似于概念上的“页面”;这两个大小相同(例如 4096 字节)。

      由于物理内存被分成大小相等的帧,并且页面大小与帧大小相同,因此您可以知道有多少虚拟地址用作页面位置以及该页面的偏移量。例如,如果您的操作系统为每个进程“分配”4 GB(如 Linux 中的情况),并且您的页面/帧大小为 4096 字节,您可以知道 20 位(4,294,967,296 字节 / 4096 字节 = 2 ^ 20 = 32位地址的1,048,576个页面/页地址)作为页地址,然后由MMU转换为物理帧地址,其余12位作为偏移量,确定地址起始位置从页面/框架的开头。

      VM(用户步调)地址-->页面+偏移量(OS)-->帧+偏移量(MMU)=物理地址

      【讨论】:

        猜你喜欢
        • 2014-03-28
        • 1970-01-01
        • 2013-01-24
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2021-01-10
        • 1970-01-01
        • 2012-08-04
        相关资源
        最近更新 更多