操作系统中的连续内存分配

2025年4月4日 | 阅读7分钟

为软件应用程序分配空间称为内存分配。内存是由大量的字节组成的。连续内存分配和非连续内存分配是内存分配的两种基本类型。连续内存分配允许任务在单个内存区域中完成。相反,非连续内存分配将过程分布在不同内存区域的多个内存位置。

在本篇文章中,我们将更深入地探讨连续内存分配及其优缺点。

什么是连续内存分配?

操作系统中的内存分配方法是连续内存分配。但是,什么是内存分配呢?软件或进程需要内存空间才能运行。因此,必须为进程分配与其需求相对应的特定数量的内存。内存分配是这个过程的术语。

连续内存分配是这些内存分配策略之一。顾名思义,我们使用此策略为每个进程分配连续的内存块。因此,当进程请求访问主内存时,我们会根据其大小,从完全空闲的区域分配一个连续的段给进程。

连续内存分配技术

根据请求内存的进程的需求,分配一个连续的内存块。

通过创建固定大小的内存分区,并将单个进程分配给每个分区来完成。因此,多道程序设计的数量将受限于基于内存的固定分区数量。

此分配也会导致内部碎片。考虑一种情况,其中分配给进程的固定大小内存块比实际需要的略大。内部碎片是这种情况下的剩余内存空间的术语。当一个进程完成其在分区中的工作后,该分区即可供另一个进程运行。

在可变分区方案中,操作系统维护一个表,列出哪些内存分区是空闲的,哪些被进程使用。连续内存分配减少了地址转换开销,加快了进程执行速度。

根据连续内存分配技术,如果需要为进程分配内存空间,我们必须为其提供一个连续的空闲空间块。有两种分配方法:

  • 固定大小分区法
  • 可变大小分区法

让我们深入探讨这两种策略,以及它们的优缺点。

固定大小分区法

在此连续内存分配方法中,每个进程在主内存中被分配一个固定大小的连续块。这意味着整个内存将被划分为固定大小的连续块,并且每次进程进入系统时,都会被分配一个可用块。因为每个进程获得的内存空间块大小相同,而不管进程的大小如何。静态分区也是此方法的别称。

Contiguous Memory Allocation in Operating System

在上图中,输入队列中的三个进程需要内存空间分配。由于我们使用的是固定大小分区技术,内存具有固定大小的块。除了 4MB 的进程,第一个 3MB 的进程被分配了一个 5MB 的块。第二个 1MB 的进程也分配了一个 5MB 的块。因此,进程的大小无关紧要。每个进程都分配相同的固定大小内存块。

显然,在此系统中,内存将被划分为连续块的数量将取决于每个块覆盖的空间量,而这反过来将决定一次可以在主内存中驻留多少进程。

多道程序设计的程度指的是可以同时在内存中运行的进程数量。因此,RAM 中形成的块数决定了系统的多道程序设计水平。

优点

固定大小分区系统具有以下优点:

  • 此策略易于使用,因为每个块的大小都相同。现在,只需将进程分配给已划分好的固定内存块即可。
  • 易于跟踪仍有多少内存块可用,这决定了还可以为多少进程分配内存。
  • 此方法可用于需要多道程序设计的系统,因为可以同时在内存中维护多个进程。

缺点

尽管固定大小分区策略提供了许多好处,但也存在一些缺点:

  • 我们无法为大小超过块的进程分配空间,因为块的大小是固定的。
  • 多道程序设计的数量由块大小决定,并且一次只能有与可用块数量相同的进程在内存中同时运行。
  • 如果块的大小大于进程的大小,我们必须将进程分配给该块;然而,这会在块中留下大量空闲空间。本来可以利用这个开放区域来支持另一个进程。
Contiguous Memory Allocation in Operating System

可变大小分区法

在使用这种风格的连续内存分配技术时,不创建固定的块或内存分区。相反,根据其需求,为每个进程分配一个可变大小的块。这意味着,如果空间可用,当新进程请求时,就会为其分配相应数量的 RAM。因此,每个块的大小取决于使用它的进程的需求和规格。

Contiguous Memory Allocation in Operating System

上述图示中没有固定大小的分区。相反,第一个进程仅获得 3MB 的 RAM,因为它需要这么多。其余三个进程也只获得对其而言所需的空间量。

此方法也称为动态分区,因为块的大小是可变的,并且在新的进程启动时确定。

优点

可变大小分区系统具有以下优点:

  • 由于根据其需求为进程分配空间块,因此没有内部碎片。因此,此技术不会浪费 RAM。
  • 一次内存中有多少进程以及它们占用多少空间将决定可以同时运行多少进程。因此,它会因情况而异,并且是动态的。
  • 即使是大型进程也可以获得空间,因为没有固定大小的块。

缺点

尽管可变大小分区方案有许多好处,但也存在一些缺点:

  • 此方法是动态的,因此实现可变大小分区方案具有挑战性。
  • 难以维护进程和可用内存空间的记录。

连续内存分配技术的输入队列

到目前为止,我们已经检查了两种不同的连续内存分配策略。但是,当需要为新进程在主内存中分配位置时会发生什么?它将接收的块或段是如何选择的?

分配给进程的连续内存块导致主内存始终已满。然而,当一个过程完成时,它会留下一个称为“空洞”的空块。新的过程可能可以实现这个区域。因此,主内存中存在进程和空洞,并且这些空洞中的每一个都可以分配给新进入的进程。

首次适应

这是一种相当直接的技术,我们从头开始,分配第一个足够满足进程需求的空洞。首次适应技术也可以应用于我们可以在上次搜索首次适应空洞的地方继续。

最佳适应

这个贪心算法分配满足进程需求的最小空洞,目标是最大限度地减少在静态分区情况下由于内部碎片而可能丢失的内存。因此,为了在不浪费内存的情况下为进程选择最佳匹配,我们必须首先根据空洞的直径对它们进行排序。

最差适应

该策略与最佳适应策略相反。一旦根据大小对空洞进行了排序,最大的空洞将被选中分配给进入的进程。此分配背后的理论是,由于进程被分配了一个很大的空洞,因此会留下很多内部碎片。因此,会留下一个可以容纳几个额外进程的空洞。

连续内存分配的优点和缺点

连续内存分配具有一系列的优点和缺点。以下是一些优点和缺点:

优点

  • 易于跟踪剩余内存块的数量,这会影响可以为多少其他进程分配内存空间。
  • 连续内存分配具有良好的读取性能,因为整个文件可以从磁盘一次性读取。
  • 连续分配工作良好且易于设置。

缺点

  • 碎片不是问题,因为每个新文件都可以写入磁盘的末尾,紧跟在前一个文件之后。
  • 为了在创建新文件时选择正确的空洞大小,需要知道其最终大小。
  • 当磁盘已满时,空洞中的额外空间需要被压缩或使用。

结论

  • 当进程被调入主内存执行时,连续内存分配会为该进程分配连续的内存块。
  • 有两种分配连续内存的方法:
  • 固定大小分区:每个进程都可以访问主内存中的一个固定大小的连续块。
  • 可变大小分区:根据每个进程的需求分配空间。没有固定的块大小。
  • 有三种方法可以为进入的进程分配一个空洞:
  • 首次适应:将进程分配给第一个足够大的空洞。
  • 应将满足进程需求的最小空洞分配给进程。
  • 最差适应:将所有空洞中最大的那个分配给进入的进程。