操作系统-内存管理-内存空间的连续分配方式

来源:互联网 发布:英语课文朗读软件 编辑:程序博客网 时间:2024/05/21 19:37

操作系统-内存管理-内存空间的连续分配方式


1.概述、分类

内存空间的连续分配方式,是指为一个用户程序(作业)分配一个连续的内存空间。
按照内存空间划分方式的不同可将连续分配方式划分为以下四种方式:

  1. 单一连续分配
  2. 固定分区分配
  3. 动态分区分配
  4. 可重定位分区分配

1.1.单一连续分配

概念:将内存空间分为系统区用户区。系统区放在内存低地址部分,且仅供OS使用。用户区是除系统区外的其他地内存空间,用户区给用户使用。

缺陷:只适用于单用户、单任务环境。

1.2.固定分区分配

概念:将内存空间分为若干个固定大小的分区,每个分区中只装入一道作业,允许有几道作业并发运行。

与磁盘分区相区别:固定分区分配中的分区指的是对内存空间的分配,而磁盘分区指的是对磁盘空间的分配。

分区划分方法

  1. 分区大小相等:将内存空间划分为若干个大小相等的分区。这种划分方式的缺点是缺乏灵活性,当程序太小时,空间浪费;程序太大,程序无法加载进内存
  2. 分区大小不等:将内存空间划分为多个小分区、适量中等分区、少量大分区。解决了分区大小相等时的不灵活,可依据程序大小分配合适大小的分区

缺陷:由于每个分区的大小固定,所以会造成内存空间的浪费

1.3.动态分区分配

概念:按照进程的实际需要,动态的为该进程分配一段连续的内存空间。与固定分区的本质区别是该分区的大小不是固定不变的,但是需要注意的是,在进程的生命周期中,属于该进程的分区大小是不变的。

为了描述分区的使用情况,有两种数据结构可供选择

  1. 空闲分区表:用于记录空闲分区的情况。每一个分区占用一个表项,表项中包含空闲分区的序号、分区起始地址、分区大小等。空闲分区表与分区使用表相似,本质区别是,一个分区使用表的表项对应的是一个固定分区,无论该固定分区是否被作业占用;而一个空闲分区表对应的是一个未被进程占用的空闲分区。
  2. 空闲分区链:一个空闲分区对应一个双向链表节点,每个链表节点包含指向前一个空闲分区和指针和指向后一个空闲分区的指针,还包含分区大小和状态位(是否已分配)。

分区分配算法(以空闲分区链来说明情况):

  1. 首次适应算法:
    空闲分区链以地址递增方式次序链接;从链表首部开始查找大小满足要求的空闲分区(首次适应的含义);将找到的空闲分区中的一块内存空间分配给对应作业。优点是保留了高地址部分的内存空间给以后到达的大作业。缺点是地址部分不断被划分会留下很多难以被重新利用的零头(碎片),而且每次查找链表都是从低地址部分查找,然而低地址部分已经被占用,这样就增加了查找空闲分区的时间。

  2. 循环首次适应算法:
    与首次适应算法类似,本质区别是,循环首次适应算法的链表是一个双向循环链表,所以每次查找空闲分区不是从链表的首部开始查,而是从上一个找到的空闲分区的下一个空闲分区开始查找(起始查询指针指向该链表节点)。优点是能够使内存中的空闲分区分布地更均匀,从而可以减少查找空闲分区的时间。缺点是这样做会使内存空间中缺少大的空闲分区

  3. 最佳适应算法:
    为了加速在链表中查找空闲分区的时间,将空闲分区按照内存容量大小排序,在内存分配时,总能找到容量大小最佳的空闲分区。优点是可以最大程度的减少查找空闲分区的时间。缺点是会留下许多难以被重新利用的零头(碎片)

内存的分配与回收

Created with Raphaël 2.1.0开始查找空闲分区表/链还有表项/节点没查找?m.size>u.size?m.size-u.size<=size?将该分区从链表中移除将该移除的分区全部分配给作业修改相应的数据结构(链表表项、链表重排序、起始查询指针)结束从该分区中划分出u.size大小的分区并分配给作业回收该分区剩余内存,可能会进行分区合并yesnoyesnoyesno

备注:

  1. u.size:作业运行需要的的分区大小
  2. m.size:空闲分区的大小
  3. size:事先规定的不再切割的剩余分区的大小

1.4.可重定位分区分配

概念:在动态分区分配中有很多分散的不能被利用的小分区(零头、碎片)。通过移动内存中作业的位置可以将这些分散的小分区拼接成一个大分区,这种技术成为拼接(紧凑)。但是每次拼接(紧凑)后都需要对程序和程序需要的数据进行重定位

与动态分区分配本质的区别:可重定位分区分配利用拼接(紧凑)将原来分散的小分区拼接成了大分区,这其中涉及到程序移动重定位

动态重定位的实现:
采取动态运行时装入的装入方式,实现装入模块(可执行文件)在装入内存后仍然是相对地址,只有在程序指令真正要执行时才将相对地址转换为物理地址。之所以叫做动态重定位,是因为地址变换的过程是随着程序中的每条指令和数据的访问自动进行的。地址转换过程由硬件地址变换机构完成,真正的物理地址=相对地址+重定位寄存器里存放的程序的起始地址。当程序和数据移动后,不需要对程序做任何修改,只需要将程序新的起始地址放入重定位寄存器即可。

动态重定位分区分配算法
与动态分区分配算法的主要区别在于动态重定位分区分配算法中增加了拼接(紧凑)功能。

Created with Raphaël 2.1.0开始查找空闲分区表/链还有表项/节点没查找?m.size>u.size?m.size-u.size<=size?将该分区从链表中移除将该移除的分区全部分配给作业修改相应的数据结构(链表表项、链表重排序、起始查询指针)结束从该分区中划分出u.size大小的分区并分配给作业回收该分区剩余内存,可能会进行分区合并空闲分区总和>=u.size?进行分区的拼接(紧凑),形成连续的空闲分区,修改相关的数据结构yesnoyesnoyesnoyesno
原创粉丝点击