目录
前言
单一连续分配
固定分区分配
分区大小相等
分区大小不等
分区说明表
动态分区分配
问题
用什么样的数据结构记录内存的使用情况
应该选择哪个分区进行分配
分区的分配与回收操作
分配
回收
结论
本节思维导图
前言
连续分配指为用户进程分配的必须是一个连续的内存空间
单一连续分配
基本概念:在单一连续分配方式中,内存被分为系统区(通常位于内存的低地址部分,用于存放操作者系统的相关数据)和用户区(用于存放用户进程相关数据)
注意事项:内存中只能有一道用户数据(不支持并发),用户程序独占整个用户区空间
优点:
- 实现简单
- 无外部碎片
- 可以采用覆盖技术扩充内存
- 不一定需要采用内存保护
缺点:
- 只能用于单用户、单任务的操作系统中
- 有内部碎片
- 存储器利用率低
固定分区分配
历史背景:20世纪60年代出现了支持多道程序的系统,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式
分区大小相等
优点:很适合于用一台计算机控制多个相同对象的场合(所需内存大小相同)
缺点:缺乏灵活性
分区大小不等
优点:增加灵活性,可以满足不同大小的进程需求,根据常在系统中运行的作业大小情况进行划分(可以划分为小分区、适量中等分区、少量大分区)
缺点:缺乏灵活性,内存碎片
分区说明表
目标:实现各个分区的分配与回收
基本概念:每个表项对应一个分区,通常按照分区大小排列,每个表项对应分区的大小、起始地址、状态(是否已分配)
当用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表,从中找到一个能满足大小的、系统分配的分区,将之分配给该程序,然后修改状态为”已分配“
优点:
- 实现简单
- 无外部碎片(10MB放进12MB大小的空间中,只占用了该空间,其它空间都不占用)
缺点:
- 当用户程序太大时,可能所有分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能
- 会产生内部碎片(10MB放进12MB大小的空间中,该空间中多余的2MB内存空余)
- 内存利用率低
动态分区分配
基本概念: 不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使用分区地大小正好适合进程地需要,因此系统分区的大小和数目是可变的
问题
- 系统要用什么样的数据结构记录内存的使用情况
- 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配
- 如何进行分区的分配与回收操作
用什么样的数据结构记录内存的使用情况
空闲分区表:每个空闲分区对应一个表项。表项中包含分区号、分区大小、分区起始地址等信息
空闲分区链:每个分区的起始部分和末尾部分分别设置前驱指针和后继指针。起始部分处还可记录分区大小等信息
应该选择哪个分区进行分配
分区的分配与回收操作
分配
1、空闲分区表中某一块分区的分区大小大于进程需要的空间大小:
只需通过算法将某块分区中的部 分空间划分给该进程即可,然后在分区表中更新该分区大小以及起始地址
2、空闲分区表中某一块分区的分区大小等于进程需要的空间大小:
将分配出去的某块空间从分区表中删除即可
回收
1、回收区后面有一个相邻的空闲分区:
将两个相邻的空闲分区合并为一个新的空闲分区,并更新分区表的分区大小和起始地址
2、会收区的前面有一个相邻的空闲分区:
将两个相邻的空闲分区合并为一个新的空闲分区,并更新分区表的分区大小和起始地址
3、回收区的前、后各有一个相邻的空闲分区:
将三个相邻的空闲分区合并为一个新的空闲分区,并更新分区表的分区大小和起始地址
4、回收区的前、后都没有相邻的空闲分区:
新增一个表项(各表项的顺序不一定按照地址·1递增顺序排列。具体的排列方式需要依据动态分区算法来确定)
结论
- 动态分区分配没有内部碎片,但是有外部碎片
- 内部碎片:分配给某进程的内存区域中,如果有些部分没用用上
- 外部碎片:指内存中的某些空闲分区由于太小而难以利用
本节思维导图
~over~