预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共12页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

《操作系统》课程实验报告 实验名称:动态分区存储管理 姓名: 学号: 地点: 指导老师: 专业班级: 实验目的: 1、熟悉并掌握动态分区分配的算法。 2、熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。 二、实验内容:用高级语言模拟实现动态分区存储管理,要求: 分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少一种。熟悉并掌握各种算法的空闲区组织方式。 分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小) 分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。 分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。(注意:不存在的作业号要给出错误提示!) 分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来) 要求考虑:(1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。 三、实验代码 #include<stdio.h> #include<stdlib.h> #defineSIZE800//内存初始大小 #defineMINSIZE5//碎片最小值 enumSTATE{Free,Busy}; structsubAreaNode{ intaddr;//起始地址 intsize;//分区大小 inttaskId;//作业号 STATEstate;//分区状态 subAreaNode*pre;//分区前向指针 subAreaNode*nxt;//分区后向指针 }subHead; //初始化空闲分区链 voidintSubArea() { //分配初始分区内存 subAreaNode*fir=(subAreaNode*)malloc(sizeof(subAreaNode)); //给首个分区赋值 fir->addr=0; fir->size=SIZE; fir->state=Free; fir->taskId=-1; fir->pre=&subHead; fir->nxt=NULL; //初始化分区头部信息 subHead.pre=NULL; subHead.nxt=fir; } //首次适应算法 intfirstFit(inttaskId,intsize) { subAreaNode*p=subHead.nxt; while(p!=NULL) { if(p->state==Free&&p->size>=size){ //找到要分配的空闲分区 if(p->size-size<=MINSIZE){ //整块分配 p->state=Busy; p->taskId=taskId; }else{ //分配大小为size的区间 subAreaNode*node=(subAreaNode*)malloc(sizeof(subAreaNode)); node->addr=p->addr+size; node->size=p->size-size; node->state=Free; node->taskId=-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->taskId=taskId; } printf("内存分配成功!\n"); return1; } p=p->nxt; } printf("找不到合适的内存分区,分配失败...\n"); return0; } //最佳适应算法 intbestFit(inttaskId,intsize) { subAreaNode*tar=NULL; inttarSize=SIZE+1; subAreaNode*p=subHead.nxt; while(p!=NULL) { //寻找最佳空闲区间 if(p->state==Free&&p->size>=size&&p->size<tarSize){ tar=p; tarSize=p->size; } p=p->nxt; } if(tar!=NULL){ //找到要分配的空闲分区 if(tar->size-size<=MINSIZE){ //整块分配 tar->state=Busy; tar->taskId=taskId; }else{ //分配大小为size的区间 subAreaNode*node=(su