虚拟内存的影响以及分页和分段之间的关系

时间:2018-08-02 20:15:28

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

这是我的第一篇文章。我想问一下虚拟内存与分页和分段的关系如何。我在互联网上搜索了几天,但仍然无法正确处理这些信息。这是到目前为止我所知道的:

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

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

  • 逻辑级别。这是对物理地址的抽象。在此处理是否要求内存(假定成功分配)的地址,该地址与RAM中的单元没有直接关系。我们可以说这些地址与物理地址来自不同的池(世界?)。如前所述,内存控制器仅了解物理地址,因此要使用逻辑地址,我们需要将其转换为物理地址。操作系统可以通过两种方式创建逻辑地址:

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

      内部碎片-当属于进程的内存未100%使用时。因此,如果进程要使用2个字节,则OS需要分配总页数大于或等于程序请求的内存量的页面。页面的典型大小为4KB。 OS为其提供内存以供处理的单位是页面。因此它不能少于4KB。因此,如果我们使用2个字节,则会浪费4KB-2B = 4094个字节(内存与我们的进程相关联,因此其他进程无法使用它。只有我们可以使用它,但我们只需要2B)。

      外部碎片-当分配的内存块彼此相邻时,但是它们之间有一个小孔。它是免费的,因此其他程序也可以使用它,但它非常小,因为它很小。高概率的漏洞将被浪费。更多的漏洞-浪费的内存。

      分页可能会导致内部碎片的影响。分段可能会导致外部分段的影响。

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

    • 分页细分-将细分分为页面的方法。
    • 分段分页-使用较少的方法,但也可以。

    将它们结合起来对两种解决方案都具有积极意义。

    我所读到的有关虚拟内存利弊的内容:
    PROS

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

    缺点

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

所以我们来到了我不太了解的部分:

  1. 为什么在某些源中将逻辑地址和虚拟地址描述为同义词?我有什么问题吗?

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

  3. 分页分段与分段分页之间的真正区别是什么。我知道这两者之间的区别将是地址的构造方式(页码,段号等),但是我想这不足以开发两种策略。这个原因无可厚非。我读到分段分页的弹性较小,这就是为什么很少使用它的原因。但是为什么它的弹性较小?这样做的原因是,在程序中您只能有几个段而不是很多页面。如果这样的话,分页确实允许更好的“粒度”。

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

在该主题上的任何帮助将不胜感激。

编辑:#1
好。我终于明白,按需分页也是虚拟内存。我只是发现一些澄清有助于理解该主题。以下是我为可视化差异而制作的图像的链接。感谢您的帮助。

differences between paging, demand paging and swapping

1 个答案:

答案 0 :(得分:0)

  

为什么在某些来源中将逻辑地址和虚拟地址描述为同义词?我有什么问题吗?

许多来源将逻辑和虚拟内存转换混合在一起。在过去,逻辑地址转换是在没有虚拟地址转换的情况下进行的,因此处理器文档将它们视为相同。

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

  

虚拟内存真的在为进程提供保护吗?

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

  

分页分段与分段分页之间的真正区别是什么。

您实际上可以忽略细分。 1970年后没有设计合理设计的处理器体系结构使用细分市场,而这些细分市场最终将消失。

  

如果VM为每个进程分配了单独的地址空间,这是否意味着没有VM的页面调度会使用“一个池”中的逻辑地址

它是逻辑存储器,为每个进程创建单独的地址空间。分页是虚拟内存。你不能一无所有。

相关问题