动态分区分配核心问题:
1.系统要用什么样的数据结构记录内存的使用情况?
2.当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
3.如何进行分区的分配与回收操作?
系统要用什么样的数据结构记录内存的使用情况?
两种常用的数据结构:空闲分区表和空闲分区链
每一时刻系统分配如下:
采用空闲分区表:
空闲分区表:每 个空闲分区对应 一个表项。表项 中包含分区号、 分区大小、分区 起始地址等信息
分区号大小(MB)起始地址(M)状态
1208空闲
21032空闲
3460空闲
空闲分区链:
空闲分区链:每个分区的起始部分和末尾部分分别设置前向指 针和后向指针。起始部分处还可记录分区大小等信息
当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
现有进程5(4MB)调入内存,应该用最大的分区进行分配?还是用最小的分区进行分配?又或是用地址最低的部分进行分配?
把一个新作业装入内存时,须按照一定的动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。
如何进行分区的分配与回收操作? 假设系统采用的数据结构是“空闲分区表”… 如何分配?
情况一:回收区的后面有一个相邻的空闲分区
此时分区表是
分区号大小(MB)起始地址(M)状态
11032空闲
2460空闲
假设此时进程4运行结束,将进程4占用的4M内存空间回收,而后面有一块10M的相邻空闲区
此时空闲分区表:
分区号大小(MB)起始地址(M)状态
11428空闲
2460空闲
两个相邻的空闲分区合并为一个
情况二:回收区的前面有一个相邻的空闲分区
此时空闲分区表:
分区号大小(MB)起始地址(M)状态
1208空闲
21032空闲
假设此时进程3运行结束,将进程3占用的18M内存空间回收,而前面有一块10M的相邻空闲区
此时空闲分区表:
分区号大小(MB)起始地址(M)状态
1208空闲
22832空闲
两个相邻的空闲分区合并为一个
情况三:回收区的前、后各有一个相邻的空闲分区
此时空闲分区表:
分区号大小(MB)起始地址(M)状态