您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统实验3-动态分区存储管理
实验三动态分区存储管理一:实验目的了解动态分区存储管理方式中的数据结构和分配算法,加深对动态分区存储管理方式及其实现技术的理解。二:实验内容用C语言或Pascal语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程Allocate()和回收过程Free()。其中,空闲分区采用空闲分区链来组织,内存分配时,优先使用空闲区低地址部分的空间。三:实验类别动态分区存储管理四:实验类型模拟实验五:主要仪器计算机六:结果和小结七:程序#includestdio.h#includetime.h#includestdlib.h#defineSIZE640//内存初始大小#defineMINSIZE5//碎片最小值structmemory{structmemory*former;//前向指针intaddress;//地址intnum;//作业号intsize;//分配内存大小intstate;//状态0表示空闲,1表示已分配structmemory*next;//后向指针}linklist;voidintmemory()//初始化空闲分区链{memory*p=(memory*)malloc(sizeof(memory));//分配初始分区内存p-address=0;//给首个分区赋值p-size=SIZE;p-state=0;p-num=-1;p-former=&linklist;p-next=NULL;linklist.former=NULL;//初始化分区头部信息linklist.next=p;}intfirstFit(intnum,intsize)//首次适应算法{memory*p=linklist.next;while(p!=NULL){if(p-state==0&&p-size=size)//找到要分配的空闲分区{if(p-size-size=MINSIZE)//整块分配{p-state=1;p-num=num;}else//分配大小为size的区间{memory*node=(memory*)malloc(sizeof(memory));node-address=p-address+size;node-size=p-size-size;node-state=0;node-num=-1;//修改分区链节点指针node-former=p;node-next=p-next;if(p-next!=NULL){p-next-former=node;}p-next=node;//分配空闲区间p-size=size;p-state=1;p-num=num;}printf(内存分配成功!\n);return1;}p=p-next;}printf(找不到合适的内存分区,分配失败...\n);return0;}intbestFit(intnum,intsize)//最佳适应算法{memory*tar=NULL;inttarSize=SIZE+1;memory*p=linklist.next;while(p!=NULL){if(p-state==0&&p-size=size&&p-sizetarSize)//寻找最佳空闲区间{tar=p;tarSize=p-size;}p=p-next;}if(tar!=NULL){if(tar-size-size=MINSIZE)//找到要分配的空闲分区{tar-state=1;//整块分配tar-num=num;}else//分配大小为size的区间{memory*node=(memory*)malloc(sizeof(memory));node-address=tar-address+size;node-size=tar-size-size;node-state=0;node-num=-1;//修改分区链节点指针node-former=tar;node-next=tar-next;if(tar-next!=NULL){tar-next-former=node;}tar-next=node;//分配空闲区间tar-size=size;tar-state=1;tar-num=num;}printf(内存分配成功!\n);return1;}else{//找不到合适的空闲分区printf(找不到合适的内存分区,分配失败!!\n);return0;}}intfreememory(intnum)//回收内存{intflag=0;memory*p=linklist.next,*pp;while(p!=NULL){if(p-state==1&&p-num==num){flag=1;if((p-former!=&linklist&&p-former-state==0)&&(p-next!=NULL&&p-next-state==0)){//情况1:合并上下两个分区//先合并上区间pp=p;p=p-former;p-size+=pp-size;p-next=pp-next;pp-next-former=p;free(pp);//后合并下区间pp=p-next;p-size+=pp-size;p-next=pp-next;if(pp-next!=NULL){pp-next-former=p;}free(pp);}elseif((p-former==&linklist||p-former-state==1)&&(p-next!=NULL&&p-next-state==0)){//情况2:只合并下面的分区pp=p-next;p-size+=pp-size;p-state=0;p-num=-1;p-next=pp-next;if(pp-next!=NULL){pp-next-former=p;}free(pp);}elseif((p-former!=&linklist&&p-former-state==0)&&(p-next==NULL||p-next-state==1)){//情况3:只合并上面的分区pp=p;p=p-former;p-size+=pp-size;p-next=pp-next;if(pp-next!=NULL){pp-next-former=p;}free(pp);}else{//情况4:上下分区均不用合并p-state=0;p-num=-1;}}p=p-next;}if(flag==1){//回收成功printf(内存分区回收成功...\n);return1;}else{//找不到目标作业,回收失败printf(找不到目标作业,内存分区回收失败...\n);return0;}}//显示空闲分区链情况voidshowmemory(){printf(当前的内存分配情况如下:\n);printf(*********************************************\n);printf(起始地址|空间大小|工作状态|作业号\n);memory*p=linklist.next;while(p!=NULL){printf(******************************************\n);printf(**);printf(%5dk|,p-address);printf(%5dk|,p-size);printf(%5s|,p-state==0?0:1);if(p-num0){printf(%5d,p-num);}else{printf();}p=p-next;}}intmain(){intoption,ope,num,size;//初始化空闲分区链intmemory();//选择分配算法l1:while(1){printf(***************************************\n);printf(请选择要模拟的分配算法:\n1表示首次适应算法\n2表示最佳适应算法\n);printf(***************************************\n);scanf(%d,&option);system(cls);if(option==1){printf(你选择了首次适应算法,下面进行算法的模拟\n);break;}elseif(option==2){printf(你选择了最佳适应算法,下面进行算法的模拟\n);break;}else{printf(错误:请输入0/1\n\n);}}//模拟动态分区分配算法while(1){printf(\n);printf(*********************************************\n);printf(1:分配内存\n2:回收内存\n3:返回上一级菜单\n\n);printf(*********************************************\n);scanf(%d,&ope);system(cls);if(ope==0)break;if(ope==1){//模拟分配内存printf(请输入作业号:);scanf(%d,&num);printf(请输入需要分配的内存大小(KB):);scanf(%d,&size);if(size=0){printf(错误:分配内存大小必须为正值\n);continue;}//调用分配算法if(option==0){firstFit(num,size);}else{bestFit(num,size);}//显示空闲分区链情况showmemory();}elseif(ope==2){//模拟回收内存printf(请输入要回收的作业号:);scanf(%d,&num);freememory(num);//显示空闲分区链情况showmemory();}elseif(ope==3){gotol1;}else{printf(错误:请输入0/1/2\n);}}printf(分配算法模拟结束\n);return0;}
本文标题:操作系统实验3-动态分区存储管理
链接地址:https://www.777doc.com/doc-2280093 .html