一.设计目的
掌握内存的连续分配方式的各种分配算法。
二.设计内容
本系统模拟操作系统内存分配算法的实现,实现动态分区分配,算法,采用 PCB 定义
结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存
分区表采用单链表来模拟实现。定义与算法相关的数据结构,如 PCB,空闲分区;在使用
动态分区分配算法时必须实现紧凑功能。
三.设计原理
1.首次适应算法分配内存:空闲分区链以地址递增的次序链接。进行内存分配时,从链首
开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,
从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链
首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给
该进程,内存分配结束,返回。
2.回收内存:当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链中找到相
应的插入点:
(1)回收区与插入点的前一个空闲分区 F1 相邻接,此时应将回收区与插入点的前一分区
合并,不必为回收分区分配新表项,而只需要修改前一分区 F1 的大小。
(2)回收区与插入点的后一个空闲分区 F2 相邻接,此时将两分区合并形成新的空闲分区,
但用回收区的首址作为新空闲区的首址,大小为两者之和。
(3)回收区与插入点的前后两个空闲分区相邻接,此时将三个分区合并,使用 F1 的表项
和 F1 的首址,取消 F2 的表项,大小为三者之和。
(4)回收区与插入点的前后两个空闲分区均不相邻接,此时应为回收区单独建立一个新
表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。
3.紧凑:将内存中的所有作业移动,使他们全都相邻接。可以把原来分散的多个空闲小分
区拼接成一个大分区,可将一个作业装入该区。这种技术称为“紧凑”。
四.详细设计及编码
1.模块分析
①paixu():排序算法。按分区的起始位置以递增的次序排序。
②compact():紧凑算法。记录每个忙碌分区的首址及大小,改变其首址。计算所有空闲
分区的大小为新空闲分区的大小,首址为所有忙碌分区的大小总和。
③show(FENQU *p):输出函数。输出分区信息(首址,大小,状态,进程号)。
④input():输入函数。输入分区信息(分区个数,各分区首址,大小,状态,进程号)。
调用 show(FENQU *p)函数。
⑤FENQU *scsf():(递归算法)首次适应算法。进行内存分配时,从链首开始顺序查找,
直到找到一个大小能满足要求的空闲分区为止。调用 compact()函数。
⑥FENQU * huishou():回收算法。当进程运行完毕释放内存时,系统根据回收区的首址,
从空闲区链中找到相应的插入点,判断相应情况进行后续动作。
⑦void function():逻辑函数。从键盘输入选择,实现相应操作。调用
scsf(),huishou(),show(p)函数。
⑧int main():主函数。调用 input(),function()函数。
评论1