读懂操作系统之内存管理总结(八)

前言

内存由大量的字或字节组成,每个字或字节都有自己的地址。CPU根据程序计数器的值从内存中提取指令,这些指令可能会导致需要从特定的存储器地址进行额外的加载并将其存储到特定的存储器地址。通常,程序以二进制可执行文件的形式驻留在磁盘上,该程序必须被带入内存并放置在一个进程中才能执行。该执行过程可能会在磁盘和内存之间进行交互,磁盘上等待被带入内存以供执行的进程的集合形成了输入队列。将程序加载到进程中执行势必要进行内存管理,那么我们如何才能有效的进行内存管理呢?

内存管理

主内存必须同时容纳操作系统和各种用户进程。因此,我们需要以最有效的方式在主内存中分配不同部分。内存通常分为两个分区:一个分区用于驻留的操作系统,另一个分区用于用户进程。我们可能会将操作系统放在低内存或高内存中。使用这种方法,每个进程都包含在内存的单个连续部分中。在早期对内存管理采取连续分配方式,但是我们必须解决2个主要问题。首先是空间分配,这意味着我们如何以连续的方式存储数据。其次,是地址转换,这意味着CPU生成一个逻辑地址,该逻辑地址应用于访问辅助存储器,然后如何将逻辑地址转换为物理地址以访问主存储器。因此,首先我们将了解空间分配策略。

固定大小分区

连续内存空间分配是将内存划分为几个固定大小的分区。每个分区可能只包含一个进程。在这种多分区方法中,当一个分区空闲时,将从输入队列中选择一个进程并将其加载到空闲分区中。当进程终止时,该分区可用于另一个进程。假设辅助存储器中有进程P1,如果要将P1带入主存储器,则P1将以连续方式分配空间。如果有10 KB的内存,那么我们将分区划分为固定大小的分区,但是所有分区之间的大小可能并不相同。因此,这种分区方法称为固定大小分区。在固定大小分区中,  我们对内存进行分区,并且每个分区的大小都是固定的,无法更改

举一个栗子:当我们去餐馆吃饭时,我们会看到那里有固定的多个餐桌,有可供一人坐,有提供两人坐,甚至也有提供了四人座,如此而满足光顾餐馆的不同人数

如图两人坐,若此时来的是一个人,那么将剩余一个座位,若接下来餐馆来了两人以上,那么剩余的一个座位将不再满足需求,这就是我们所说的“碎片问题”。若通过连续内存空间分配将内存进行固定大小分区,现在,如果要在第2张图片中放置大小为4KB的进程P,则只能放置一个5KB的分区。当在5KB槽中放置4KB的进程时,将剩下1KB,这将导致内部碎片。因此,这是固定大小分区的一个主要缺点,即我们无法重用分区,并且会浪费内部空间。当进程从辅助存储器移动到主存储器时,由于固定大小分区,所以它不会被分成几部分,而是整体上将其放置在主存储器中。访问数组是连续内存分配的一个很好例子,因为在数组中,我们只需记住数组第一个元素的基地址,由于内存连续,因此我们可轻松访问各个元素,所以连续分配的优点是可快速访问即访问时间非常短。

 

如上,如果我们有5KB的数据并将其放置在上述存储块中,那么将无法放置它。即使我们有8KB可用的空间,但该8KB空间也是非连续的。这就是为什么我们不能在内存中放置5KB数据的原因。这将导致外部碎片。外部碎片意味着我们可以插入内存中的数据大小可用,但由于空间不连续,我们无法放置它们。在连续内存分配的情况下,这也是一个非常普遍的问题。

可变大小分区

为了消除固定大小分区的缺点,引入了可变大小分区。在可变大小分区中,我们不对内存进行分区。只要有内存,进程就会到来,我们就会在内存中分配空间。假设内存大小为10KB,若进程P1需要4KB,那么我们将为P1分配4KB,现在剩余大小为6KB。假设P2需要3KB,那么我们将为P2分配3KB,现在剩下3KB。在可变大小分区中,我们不会遇到内部碎片。

连续内存分配算法

无论我们通过【首次适配(选择第一满足存储需求的可用空闲块)】、【最优适配(选择使用最小的可用空闲块)】、【最差适配(选择使用最大的可用空闲块)】算法都会引起上述外部碎片的问题,这三个算法很简单,在这里我就不再详细阐述。

非连续内存分配

由于连续内存分配或多或少会都引起内部或外部碎片,同时也为了更好的对内存进行利用和管理,所以才有了我们前面所将讲解过的非连续内存分配的分段和分页,比如其优点除此之外呢,还有允许共享代码和数据,支持动态加载和动态链接(接下来我们也会讲到)在这种情况下,当进程从辅助存储器移动到主存储器时,我们可以将其分为几部分并放置在主存储器中。例如链表,我们可以直接访问链表的最后一个节点吗?当然不可以,因为我们只能从访问第一个节点开始,并且在第一个节点的帮助下,我们必须遍历到最后一个节点。同理,在非连续的内存分配中,数据会分散在内存中,并且我们只能访问该数据的开头。非连续内存分配完全不会受到外部碎片的影响。若在非连续内存分配的情况下,可以在上图中插入5KB数据,因为5KB可以分为几部分(第一部分为4KB,第二部分为剩余1KB)。但非连续内存分配的缺点是访问速度非常慢,因为我们必须在指针的帮助下才能访问其他节点,并且必须逐个遍历,这是很显然也是必然的,但是它带来的好处却远胜于此。

总结

内存管理大概内容基本都已讲解完毕,本节也是内存管理最后一小节内容,接下来我们将进入程序执行操作、线程、进程等内容的详细讲解,感谢您的阅读,我们下节见。

posted @ 2020-08-03 23:41  Jeffcky  阅读(513)  评论(0编辑  收藏  举报