·1·沈阳工程学院学生实验报告实验室名称:计算机实验室实验课程名称:操作系统实验项目名称:存储管理(1)实验日期:2年月9日班级:姓名:学号:2指导教师:批阅教师:成绩:一.实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。二.实验设备PC机一台,WIN-TC软件。三.实验项目编写程序实现采用可变分区方法管理内存。1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。3、在设计好的数据结构上设计一个主存分配算法。4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。5、(附加)若需要可以实现程序的浮动,对内存空间进行紧凑。四.实验代码(附页)#includestdio.h#includestdlib.h#defineOK1//完成#defineERROR0//出错typedefintStatus;typedefstructfree_table//定义一个空闲区说明表结构{intnum;//分区序号longaddress;//起始地址longlength;//分区大小intstate;//分区状态}ElemType;typedefstructNode//线性表的双向链表存储结构{ElemTypedata;structNode*prior;//前趋指针structNode*next;//后继指针}Node,*LinkList;LinkListfirst;//头结点LinkListend;//尾结点intflag;//记录要删除的分区序号·2·StatusInitblock()//开创带头结点的内存空间链表{first=(LinkList)malloc(sizeof(Node));end=(LinkList)malloc(sizeof(Node));first-prior=NULL;first-next=end;end-prior=first;end-next=NULL;end-data.num=1;end-data.address=40;end-data.length=600;end-data.state=0;returnOK;}voidsort()//分区序号重新排序{Node*p=first-next,*q;q=p-next;for(;p!=NULL;p=p-next){for(q=p-next;q;q=q-next){if(p-data.num=q-data.num){q-data.num+=1;}}}}//显示主存分配情况voidshow(){intflag=0;//用来记录分区序号Node*p=first;p-data.num=0;p-data.address=0;p-data.length=40;p-data.state=1;sort();printf(\n\t\t》主存空间分配情况《\n);printf(**********************************************************\n\n);printf(分区序号\t起始地址\t分区大小\t分区状态\n\n);while(p){printf(%d\t\t%d\t\t%d,p-data.num,p-data.address,p-data.length);if(p-data.state==0)printf(\t\t空闲\n\n);else实验报告·3·printf(\t\t已分配\n\n);p=p-next;}printf(**********************************************************\n\n);}//首次适应算法StatusFirst_fit(intrequest){//为申请作业开辟新空间且初始化Node*p=first-next;LinkListtemp=(LinkList)malloc(sizeof(Node));temp-data.length=request;temp-data.state=1;p-data.num=1;while(p){if((p-data.state==0)&&(p-data.length==request)){//有大小恰好合适的空闲块p-data.state=1;returnOK;break;}elseif((p-data.state==0)&&(p-data.lengthrequest)){//有空闲块能满足需求且有剩余temp-prior=p-prior;temp-next=p;temp-data.address=p-data.address;temp-data.num=p-data.num;p-prior-next=temp;p-prior=temp;p-data.address=temp-data.address+temp-data.length;p-data.length-=request;p-data.num+=1;returnOK;break;}p=p-next;}returnERROR;}//最佳适应算法//分配主存Statusallocation(inta){intrequest;//申请内存大小printf(请输入申请分配的主存大小(单位:KB):);scanf(%d,&request);if(request0||request==0){printf(分配大小不合适,请重试!);returnERROR;}·4·switch(a){case1://默认首次适应算法if(First_fit(request)==OK)printf(\t****分配成功!****);elseprintf(\t****内存不足,分配失败!****);returnOK;break;}}Statusdeal1(Node*p)//处理回收空间{Node*q=first;for(;q!=NULL;q=q-next){if(q==p){if(q-prior-data.state==0&&q-next-data.state!=0){q-prior-data.length+=q-data.length;q-prior-next=q-next;q-next-prior=q-prior;q=q-prior;q-data.state=0;q-data.num=flag;}if(q-prior-data.state!=0&&q-next-data.state==0){q-data.length+=q-next-data.length;q-next=q-next-next;q-next-next-prior=q;q-data.state=0;q-data.num=flag;}if(q-prior-data.state==0&&q-next-data.state==0){q-prior-data.length+=q-data.length;q-prior-next=q-next;q-next-prior=q-prior;q=q-prior;q-data.state=0;q-data.num=flag;}if(q-prior-data.state!=0&&q-next-data.state!=0){q-data.state=0;}}}returnOK;}Statusdeal2(Node*p)//处理回收空间实验报告·5·{Node*q=first;for(;q!=NULL;q=q-next){if(q==p){if(q-prior-data.state==0&&q-next-data.state!=0){q-prior-data.length+=q-data.length;q-prior-next=q-next;q-next-prior=q-prior;q=p-prior;q-data.state=0;q-data.num=flag-1;}if(q-prior-data.state!=0&&q-next-data.state==0){q-data.state=0;}if(q-prior-data.state==0&&q-next-data.state==0){q-prior-data.length+=q-data.length;q-prior-next=q-next;q-next-prior=q-prior;q=q-prior;q-data.state=0;q-data.num=flag-1;}if(q-prior-data.state!=0&&q-next-data.state!=0){q-data.state=0;}}}returnOK;}//主存回收Statusrecovery(intflag){Node*p=first;for(;p!=NULL;p=p-next){if(p-data.num==flag){if(p-prior==first){if(p-next!=end)//当前P指向的下一个不是最后一个时{if(p-next-data.state==0)//与后面的空闲块相连{·6·p-data.length+=p-next-data.length;p-next-next-prior=p;p-next=p-next-next;p-data.state=0;p-data.num=flag;}elsep-data.state=0;}if(p-next==end)//当前P指向的下一个是最后一个时{p-data.state=0;}}//结束if(p-prior==block_first)的情况elseif(p-prior!=first){if(p-next!=end){deal1(p);}else{deal2(p);}}//结束if(p-prior!=block_first)的情况}//结束if(p-data.num==flag)的情况}printf(\t****回收成功****);returnOK;}//主函数voidmain(){inti;//操作选择标记inta;//算法选择标记printf(**********************************************************\n);printf(\t\t使用首次适应算法实现主存空间的分配\n);printf(**********************************************************\n);printf(\n);printf(请输入1调用内存分配算法:);scanf(%d,&a);while(a1||a1){printf(输入错误,请重新输入所使用的内存分配算法:\n);scanf(%d,&a);}switch(a){case1:printf(\n\t****使用首次适应算法:****\n);break;}Initblock();//开创空间表while(1)实验报告·7·{show();printf(\t1:分配内存\t2:回收内存\t0:退出\n);printf(请输入您的操作:);scanf(%d,&i);if(i==1)allocation(a);//分配内存elseif(i==2)//内存回收{printf(请输入您要释放的分区号:);scanf(%d,&flag);recovery(flag);}elseif(i=