一、实验要求
从基于连续分配思想的动态分区分配方案和基于离散分配思想的分页中选择一种方案进行内存空间的模拟管理,具有管理工作包括:
利用分配算法找到满足要求的内存块,设请求的内存大小为size:
根据释放区首址和大小,查找空闲分区表/链表,判断是否有相邻的空闲分区存在:
- 模拟实现1M内存空间的管理;
- 利用内存空间的数据结构(如分页系统中空闲块链表或位示图法),记录空间的使用情况;
- 设计内存分配算法(如动态分区中可采用首次适应法、最佳适应法、最坏适应法或循环首次适应法)和过程,完成要运行的进程的空间分配,可能要考虑进程分配空间的记录,比如页表的设计;
- 当进程运行完成时,设计内存回收算法(如动态分区中考虑相邻空间的合并)实现释放空间的回收;
- 可动态显示内存使用状况;
- 针对用户给出的逻辑地址能计算出对应的物理地址。
二、实验目标
开发一个C语言程序实现内存空间管理的动态分区分配方案。
三、实验原理
动态分区分配:根据进程的实际需要,动态地创建分区为之分配内存空间,在实现动态分区分配时,将涉及分区分配中所使用的数据结构,分区分配算法和分区的分配与回收操作等问题。
- 分区分配中的数据结构
- 空闲分区表:一个数据表,用于记录每个空闲块的情况,如起始地址、大小、使用情况等;
- 空闲分区链表:把所有的空闲分区链接成一个链表,便于内存空间查看与分配回收。
- 内存分配过程
-
- 若找到的空闲分区的大小等于size,完全分配;
- 若找到的空闲分区大小大于size,且一分为二后,剩余大小小于1K,则不再分割,作为整体进行分配;否则一分为二,剩余部分仍然作为空闲分区存在;
- 若无满足要求空闲分区,则分配失败
-
- 释放区与前空闲区相邻:将释放区与前空闲区合并为一个空闲区。其首址仍为前空闲区首址,大小为释放区大小与空闲区大小之和。
- 释放区与前后两个空闲区相邻:将这三个区合为一个空闲区,其首址为前空闲区首址,大小为这三个区大小之和,并取消原后空闲区表目。
- 释放区与后空闲区相邻:则把释放区合并到后空闲,首地址为释放区首地址,大小为二者大小之和。
- 释放区不与任何空闲区相邻:将释放区作为一个空闲区,将其大小和首址插入到空闲区表的适当位置。
- 分配算法
- 最坏适应法:空闲分区按空闲分区大小递减次序组织,每次查找时直接判断最大空闲分区是否满足要求。
- 内存回收 根据释放区首址和大小,查找空闲分区表/链表,判断是否有相邻的空闲分区存在