连续分配存储管理方式存在的主要优缺点有哪些

2024-02-03 19:22:00 来源 : haohaofanwen.com 投稿人 : admin

下面是好好范文网小编收集整理的连续分配存储管理方式存在的主要优缺点有哪些,仅供参考,欢迎大家阅读!

可变分区方式

连续分配管理方式是指为用户分配一个连续的内存空间,连续分配的方式有单一连续分区,固定分区和可变分区三种方式。

单一连续分区

这种方案,整个内存区域被分成了系统区域跟用户区域两部分,其中,系统区域提供给操作系统使用,用户区域使用用户区域。这种方式可以在用户区域跟系统区域之间设置一种保护机构,方式操作系统收到用户有意无意的破坏。这个过程使用界限寄存器,当执行每条指令的时候,用物理地址与界限存储地址进行比较,不超出范围(用户),再执行。常见的组织方式有三种:

其中ab只是其实位置不同,而c将驱动设备放于Rom中,只读存储器。这部分就是我们熟悉的BIOS。因为这种模式永远只有一个应用程序。所以不会产生外部碎片。且实现简单。但是只能用于单用户单任务的操作系统中,存储器的利用率显然是极低的。

固定分区

这种方式的做法是,在进程装入之前,由操作员或者操作系统将内存划分为若干个大小不等的分区,一旦划分好分区后,在操作系统运行的过程中就不能再重新划分。 此时,系统将建立一个说明表,用来记录每个分区的大小,起始地址,分配状态。进程在装入时,分配程序从该表中找出一块能满足要求的,尚未分配的分区,分配给该进程,然后修改分区说明表中的状态位。否则,拒绝这次的分配。如下图:

左边是分配说明表,右边是主存空间。状态1表示已经有进程在使用,0表示没有进程在使用(即空闲)。所以这个时候如果来一个8mb的进程,那么恰好可以分配第三个存储块。但是如果来个20mb的进程,则拒绝分配。

优点:这种分区技术简单,适用于进程大小以及数量已知的系统中。

缺点:但是一个进程大小恰好等于某个分区块大小的情况是非常少的,如果分区不合理,就会造成空间的浪费,并且产生大量的内部碎片,内存利用率不高。

可变分区

可变分区是指在进程装入内存时,将可用的内存空间“切出”一个连续的区域,分配给进程,以适应进程的大小需要。整个内存分区的大小和分区的个数是随着装入的进程的大小动态变化的。见下图:

这种方式内存利用率高,可以按照进程的大小分配,但是这种方式会存在一些内部碎片。

内部碎片和外部碎片

刚刚我们提到了两个名词,内部碎片和外部碎片,那么它们到底是什么呢? 以固定分区的图片为例,我们考虑这样一个问题,如果说这个时候来的是一个7MB的进程,那么按照规则,我们给它分配8MB那个空闲的主存块,那么由于是固定分区,所以这个时候就有1MB的空间多余,这个多余的空间,由于在分区的内部,所以称为内部碎片。这个时候即使这个时候来了一个1MB的进程,它也不能进入这个空闲的1MB,因为这个分区是早就已经固定了的。所以这些碎片是不可利用的。

以可变分区的图片为例,我们考虑这样一个问题,在e -> g的过程中,2退出,4进入,那么4跟3之间就存在着6MB大小的空间,由于它存在与进程的外部,所以又从称为外部碎片。那么外部碎片能不能被利用呢?假设这个时候来了个5MB的进程,当然是可以运行的,但是随着时间的推移,这样的空间将会越来越小,假设当空间为1kb的时候,我想一般来说这个时候没有什么进程能小到这样的情况了吧。她就不能再被利用。

再谈谈可变分区

由于可变分区的灵活性,现在大多数操作系统使用这类方式,所以我们研究一下如何设计这样的分区。

可变分区的数据结构

空闲分区表:为内存中每个尚未分配的分区设置一个表,包括分区号,起始地址,分区大小等等。

空闲分区链:在每个空闲分区中,设置用于控制分区分配信息以及用于链接各个分区的指针,用于把空闲分区链接成一个链表。

可变分区的分配算法

首次适应算法。该算法要求空闲分区以地址递增的次序排序,分配时,从链表开始位置来进行查找,直到找到一个能满足进程大小要求的空闲分区为止。然后按进程的大小从分区中“切出”一块内存给请求者。余下的空闲分区留在链表中。总结起来就是:只要有合适的分区,那就使用。。 然而这种做法也存在一些缺点,因为它倾向于优先从低地址查起,而低地址会被不断的分割,使其不再容易找到适应运行的空闲空间,查找效率不高。

下次适应法。该做法在给进程分配内存的时候,不从链表的最开始地方开始,而是从上次找到的空闲分区的,下一个空闲分区开始继续查找。这种算法采用循环链表来实现,如果链表尾部仍然找不到满足要求的空闲块,那么就返回链表首部,继续查找。这么做的优点在于:使得内存得以均衡使用,减少了查找空闲分区的开销。缺点:但是这样子均衡分割,会导致几乎每一块空闲的内存都会被分割,时间长了,就会使得链表中没有大的空闲块,导致可能有大的进程无法使用。

最佳适应法。即每次为进程分配内存的时候,总是把与进程大小最匹配的空闲分区分配出去,首先将空闲分区按分区大小递增(注意与首次适应法的区别)的顺序排列,形成一块空闲分区链。那么当进程要求分配内存的时候,第一次找到的满足要求的空闲块就一定是最佳的。这种做法看起来是最佳的方案,但是实际上往往效率很低。因为越是接近合适就有可能产生的外部碎片就越小,越多。所以会导致链表头部有很多小的不能被利用的外部碎片,影响查找效率。

最坏适应法。顾名思义,与最佳适应法相反。将空闲分区按分区大小递减排列。每次的分配都是从最大的空闲分区“切出”一块进行匹配。这样一来就不会那么容易形成碎片。但是大的空闲块被一直切割,当有大进程要进行的时候,操作系统往往不能满足其需求。

动态重定位分区

之前我们说到,可变分区容易产生外部碎片。在操作系统中,可以采用紧凑的方式,将内存中所有的进程都向前移动,使得它们之间紧紧挨着,这样进程与进程之间的空隙(即外部碎片)也就不复存在了。而且这样做,分散的空闲分区便拼接成为了一个大的空闲分区。由于进程的位置发生了变化,所以要对进程在内存中的地址进行修改。修改的过程就是重定位的过程,所以这种做法也叫动态重定位分区。

但是这种做法虽然解决了碎片问题,却由于内存中进程的大量移动,增大了系统的开销。


相关文章

专题分类