动态分区存储管理
操作系统课程实验报告 实验名称动态分区存储管理 姓 名 学 号 地 点 指导老师 专业班级 、实验目的 1、熟悉并掌握动态分区分配的算法。 2、熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。 二、实验内容用高级语言模拟实现动态分区存储管理,要求 1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适 应算法中的至少一种。熟悉并掌握各种算法的空闲区组织方式。 2、分区的初始化可以由用户输入初始分区的大小。(初始化后 只有一个空闲分区,起始地址为0,大小是用户输入的大小) 3、分区的动态分配过程由用户输入作业号和作业的大小,实现 分区过程。 4、分区的回收用户输入作业号,实现分区回收,同时,分区的 合并要体现出来。(注意不存在的作业号要给出错误提示) 5、分区的显示任何时刻,可以查看当前内存的情况(起始地址 是什么,大小多大的分区时空闲的,或者占用的,能够显示出 来) 6、要求考虑(1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如 果这个作业名不存在,也要有相应的提示。 三、实验代码 includestdio h //// 内存初始大小 碎片最小值 includestdlib. h define SIZE 800 define MINSIZE 5 enum STATE { Free, Busy }; struct subAreaNode { int addr; int size; int taskTd; STATE state; subAreaNode *pre;subAreaXode *nxt; //起始地址 //分区大小 //作业号 //分区状态 //分区前向指针//分区后向指针 }subHead; //初始化空闲分区链 void intSubAreaO //分配初始分区内存 subAreaNode *fir subAreaNode *mallocsizeofsubAreaNode; //给首个分区赋值 firaddr 二 0; fir-size 二 SIZE; fir-state Free; fir-taskld -1; fir-pre fesubHead; fir-nxt 二 NULL; //初始化分区头部信息 subHead, pre NULL; subHead, nxt fir; } //首次适应算法 int f irstFit int taskld, int size subAreaNode *p subHead, nxt; whilep 二 NULL { if p-state Free p-size size { //找到要分配的空闲分区 ifp-size - size MINSIZE { //整块分配 p-state 二 Busy; p-taskld taskld; } else { //分配大小为size的区间 subAreaNode *node subAreaNode *mallocsizeofsubAreaNode; node-〉addr p-addr size; node-size p-size - size; node-state Free; node-〉taskld 1; //修改分区链节点指针 nodepre p; node-nxt p-nxt; ifp-nxt NULL { p-nxtpre node; } p-nxt node; //分配空闲区间 p-size size; pstate 二 Busy; p-taskld 二 taskld; printf C内存分配成功 \n〃; return 1; p p-nxt; } printf C找不到合适的内存分区,分配失败..・\n〃; return 0; //最佳适应算法 int bestFitint taskld, int size subAreaNode *tar NULL; int tarSize SIZE 1; subAreaNode *p subHead, nxt; whilep NULL { //寻找最佳空闲区间 ifp-state Free p-size size p-size tarSize { tar p; tarSize p-size; } p p-nxt; } if tar NULL { //找到要分配的空闲分区 iftar-size - size MINSIZE //整块分配 tar-state 二 Busy; tar-taskld taskld; } else { //分配大小为size的区间 subAreaNode *node 二subAreaNode *mallocsizeofsubAreaNode; node-addr tar-addr size; node-size tar-size - size; nodestate Free; nodetaskld -1; //修改分区链节点指针 node-pre tar; node-nxt tar-nxt; if tar-nxt 二 NULL tar-nxtpre node; tar-nxt node; //分配空闲区间 tar-size 二 size; tar-state Busy; tar-taskld taskld; } printf /z内存分配成功 \n〃; return 1; } else { //找不到合适的空闲分区 printf C找不到合适的内存分区,分配失败..・\n〃; return 0; } } //回收内存 int freeSubAreaint taskld { int flag 0; subAreaNode *p subHead, nxt, *pp; whilep NULL { ifp-state 二二 Busy p-taskTd 二二 taskld { flag 1; ifp-pre subHead p-pre-state Free p-nxt NULL p-nxt-state Fr