虚拟内存效应以及分页和分段之间的关系



这是我的第一篇文章。我想问一下虚拟内存是如何与分页和分段相关的。我在网上搜索了几天,但还是没能把这些信息整理好。以下是我目前所知道的:

我们可以讨论内存中的地址(我们可以说它们是内存抽象级别):

  • 物理级别(CPU与内存控制器对话,"嘿,给我地址0xFFEBABCD的内容",这些地址是RAM中单元的地址,因此单元0xABCD具有物理地址0xABCD。内存控制器只能使用物理地址,因此如果地址不是物理地址,则必须更改为物理地址。

  • 逻辑级别。这是对物理地址的抽象。在这里,如果请求内存,(假设成功分配)会得到与RAM中的单元没有直接关系的地址。我们可以说这些地址与物理地址来自不同的池(世界?)。正如我之前所说的,内存控制器只了解物理地址,所以要使用逻辑地址,我们需要将它们转换为物理地址。操作系统有两种方法可以创建逻辑地址:

    • 分页-其中物理内存(RAM)被划分为连续的内存块(称为帧),逻辑内存(另一个世界)也被划分为相同长度的块(也称为页面)。现在操作系统将称为页表的数据结构保存在RAM中。它是一个关联数组(map),其存在的主要目标是将逻辑级地址转换为物理级地址。分页具有以下效果:进程在RAM中分配的内存(因此,属于程序的物理内存中的帧)可能不连续(因此,内部可能存在漏洞)
    • 分段-程序分为称为分段的部分。分段大小不是固定的,因此不同的分段可能具有不同的大小。程序分为几个段,每个段在RAM(物理)内存中都有自己的位置。因此,一个片段(称之为segmentA)和另一个片段可能不在彼此附近。换句话说,segmentA不必将segmentB作为邻居。

      内部碎片-属于进程的内存没有100%使用。所以,若进程想要使用2个字节,操作系统需要分配一个或多个页面,这些页面的总大小需要大于或等于程序请求的内存量。页面的典型大小为4KB。操作系统为处理页面提供内存的单元。所以它不能提供小于4KB的数据。因此,如果我们使用2个字节,4KB-2B=4094个字节将被浪费(内存与我们的进程相关,因此其他进程无法使用它。只有我们可以使用它,但我们只需要2B)。

      外部碎片-当分配的内存块彼此靠近,但它们之间有一个小洞时。它是免费的,所以其他程序可以使用它,但它不太显眼,因为它很小。那个洞很有可能会被浪费掉。更多的漏洞-更多的内存浪费。

      分页可能会引起内部碎片的影响。分割可能会造成外部碎片化的影响。

  • 虚拟级别-虚拟内存中使用的地址。这是逻辑内存级别的扩展。现在,程序甚至不需要在RAM中分配所有页面就可以开始执行。它可以通过以下技术实现:

    • 分页分割-将分段划分为页面的方法
    • 分段分页-使用较少,但也是可能的

    将它们结合起来会从两种解决方案中获得积极的方面。

    我读到的关于虚拟内存的利弊:
    pros:

    • 进程有自己的地址空间,这意味着如果我们有两个进程A和B,并且它们都有一个指向地址的指针,例如17进程A指针将显示到与进程B中指针不同的帧。这导致了更大的过程隔离。进程之间是相互保护的(因此,如果一个进程不是共享内存,那么它就不能用另一个进程内存做事情,因为在它的映射中不存在这样的映射条目),操作系统更容易受到进程的保护
    • 具有比物理一阶内存(RAM,由于交换为二阶内存)更多的内存
    • 更好地利用内存,因为:
      • 将程序中未使用的部分交换到辅助内存
      • 使共享页面成为可能,也使"写时复制"成为可能
    • 改进了多程序功能(当程序中不需要的部分被交换到辅助存储器时,它们在ram中腾出了可用空间,可以用于新的进程。)
    • 提高了CPU利用率(如果你能把更多的进程加载到内存中,你就有更大的概率比现在需要做CPU的程序,而不是IO的程序。在这种情况下,你可以更好地利用CPU)

    CONS

    • 虚拟内存有开销,因为我们需要两次访问内存(但这里使用TLB缓冲区可以实现很多改进)
    • 这使得操作系统部分管理内存更加复杂

所以我们来到了我并不真正理解的部分:

  1. 为什么在某些来源中,逻辑地址和虚拟地址被描述为同义词?我做错什么了吗?

  2. 虚拟内存真的能保护进程吗?我的意思是,例如,在分段中,还检查进程是否不访问其他内存(如果访问了,则会导致segfault),分页在页表中也有一个保护位,所以保护不是来自于简单地扩展逻辑级地址的抽象吗?如果VM(虚拟内存)带来了扩展的保护功能,它们是什么?它们是如何工作的?换句话说:是否为每个进程创建单独的地址空间,带来扩展的内存保护。如果是这样的话,没有虚拟机就无法实现分页?

  3. 分页分段和分段分页的区别。我知道这两者之间的区别在于地址的构建方式(页码、段号等等),但我认为这还不足以制定两种策略。这个理由根本不算什么。我读到分段分页的弹性较小,这就是为什么它很少被使用的原因。但为什么它的弹性较小?原因是,在程序中,你可以只有几个片段,而不是很多页面。如果是这种情况,分页确实允许更好的"粒度"。

  4. 如果VM为每个进程创建单独的地址空间,这是否意味着没有VM的分页使用"一个池"中的逻辑地址(在这种情况下,每个逻辑地址是否全局唯一?)。

如有关于该主题的任何帮助,我们将不胜感激。

编辑:#1
好。我终于明白,分页不按需也是一种虚拟内存。我只是发现一些澄清有助于理解这个话题。下面是我制作的图像链接,用来显示差异。谢谢你的帮助。

寻呼、需求寻呼和交换之间的差异

为什么在某些源中将逻辑地址和虚拟地址描述为同义词?我做错什么了吗?

许多源将逻辑内存转换和虚拟内存转换混为一谈。在过去,如果没有虚拟地址转换,逻辑地址转换就不会发生,所以处理器文档将它们称为相同的。

现在我们有了使用逻辑内存转换而不使用虚拟内存的大型内存系统。

虚拟内存真的能保护进程吗?

它是实现页面保护的逻辑内存转换。

分页分段与分段分页的真正区别。

您确实可以忽略分段。1970年后设计的处理器体系结构没有合理设计,使用了分段,它们最终正在消亡。

如果VM为每个进程留出单独的地址空间,这是否意味着没有VM的分页使用来自"一个池"的逻辑地址

是逻辑内存为每个进程创建单独的地址空间。分页是虚拟内存。没有另一个你就不能有一个。

最新更新