动态分区存储管理
《操作系统》课程实验报告 实验名称:动态分区存储管理 姓 名: 学 号: 地 点: 指导老师: 专业班级: —、实验目的: 1、熟悉并掌握动态分区分配的算法。 2、熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。 二、实验内容:用高级语言模拟实现动态分区存储管理,要求: 1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适 应算法中的至少一种。熟悉并掌握各种算法的空闲区组织方式。 2、分区的初始化——可以由用户输入初始分区的大小。(初始化后 只有一个空闲分区,起始地址为0,大小是用户输入的大小) 3、分区的动态分配过程:由用户输入作业号和作业的大小,实现 分区过程。 4、分区的回收:用户输入作业号,实现分区回收,同时,分区的 合并要体现出来。(注意:不存在的作业号要给出错误提示!) 5、分区的显示:任何时刻,可•以查看当前内存的情况(起始地址 是什么,大小多大的分区时空闲的,或者占用的,能够显示出 来) 6、要求考虑:(1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如 果这个作业名不存在,也要有相应的提示。 三、实验代码 #includeaddr 二 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; while(p !二 NULL) { if (p->state == Free p->taskld = taskld; } else { //分配大小为size的区间 subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode)); node-〉addr = p->addr + size; node->size = p->size - size; node->state = Free; node-〉taskld = ~1; //修改分区链节点指针 node~>pre = p; node->nxt = p->nxt; if(p->nxt != NULL) { p->nxt~>pre = node; } p->nxt = node; //分配空闲区间 p->size = size; p~>state 二 Busy; p->taskld 二 taskld; printf C内存分配成功! \n〃); return 1; p = p->nxt; } printf C找不到合适的内存分区,分配失败・\n〃); return 0; //最佳适应算法 int bestFit(int taskld, int size) subAreaNode *tar = NULL; int tarSize = SIZE + 1; subAreaNode *p = subHead, nxt; while(p != NULL) { //寻找最佳空闲区间 if(p->state == Free } p = p->nxt; } if (tar != NULL) { //找到要分配的空闲分区 if(tar->size - size state 二 Busy; tar->taskld = taskld; } else { //分配大小为size的区间 subAreaNode *node 二(subAreaNode *)malloc(sizeof(subAreaNode)); node->addr = tar->addr + size; node->size = tar->size - size; node~>state = Free; node~>taskld = -1; //修改分区链节点指针 node->pre = tar; node->nxt = tar->nxt; if (tar->nxt !二 NULL) ( tar->nxt~>pre = 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 freeSubArea(int taskld) { int flag = 0; subAreaNode *p = subHead, nxt, *pp; while(p != NULL) { if(p->state 二二 Busy if((p->pre != &subHead && p->pre->state == Free) && (p->nxt != NULL && p->nxt->state == Fr