您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 可变分区的分配与回收(最先适应算法)-C++程序代码
#includeiostream//#includemalloc.h//#includestdio.h//#includestdlib.h#includecmathusingnamespacestd;structmap{unsignedm_size;//空闲区大小char*m_addr;//空闲区首地址structmap*next,*prior;//指向前一个和后一个空闲区结点的指针};//定义链表以管理空闲区structprocess{unsignedp_size;//进程大小char*p_addr;//进程首地址};processarray[100];//定义数组以管理进程map*head;//定义头指针map*cursor;//定义指向当前空闲区的游标指针unsignedsiz,room;//定义分配的整个内存空间的大小intchoice;voidcreate();//初始化管理空闲区的链表voidbegin();//主体函数char*lmalloc(unsignedsize);//分配进程函数voidlfree(unsignedsize,char*addr);//释放进程函数voidprint_proess();//打印当前进程情况voidmain()//主函数{create();begin();}voidcreate()//初始化循环链表{head=newmap;head-prior=head;head-next=head;//创建头指针cursor=head;cout请输入要分配的系统的总空间大小:;cinsiz;room=siz;head-m_addr=(char*)malloc(room*sizeof(char));//初始化首地址head-m_size=room;//初始化整个空闲区大小cout分配的首地址:head-m_addrendl;coutendl;cout分配的总空间大小:head-m_sizeendl;for(intj=1;j=100;j++){array[j].p_size=0;}//初始化进程数组,使其大小全为0}voidbegin(){unsignedm_size;inti=1;unsignednum;while(choice!=3){coutendl请选择操作:endl;cout1:分配进程空间endl;cout2:释放进程空间endl;cout3:结束操作endl;//选择操作cinchoice;if(choice==1)//若选择分配进程{coutendl请输入要分配空间的大小:;cinm_size;if(array[i].p_addr=lmalloc(m_size)){//调用lmalloc,分配内存,若成功分配array[i].p_size=m_size;//给进程数组赋值coutendl此次分配进程为:进程i'\t'endl;cout首地址:array[i].p_addrendl;//输出进程首地址coutendl进程大小:array[i].p_sizeendl;cout*******************************;i++;print_proess();//每次分配进程后,打印(输出)系统当前进程的总情况}}else{if(choice==3)continue;//若选择退出操作,回到while判断else{if(choice==2){//若选择释放进程if(head-m_size==siz){//判断系统是否有进程存在cout无进程可释放,当前系统为空!endl;continue;//回到while判断}coutendl请输入要释放的进程号:;cout(当前存在的进程有:;for(intj=1;j=100;j++){if(array[j].p_size!=0)coutj,;}//输出当前可释放的进程情况cout);cinnum;//输入释放进程号if(array[num].p_size==0){//判断此进程是否驻于内存cout无此进程!endl;continue;//回到while}else{lfree(array[num].p_size,array[num].p_addr);//执行lfree函数array[num].p_size=0;//令进程数组中该进程的大小置0cout释放中......endl;cout进程num已释放!endl;cout*******************************;print_proess();//每次释放进程后,亦打印(输出)系统当前进程的总情况}//else}//ifelsecout输入字符无效!endl;}//else}//else}//while}voidprint_proess()//打印系统当前的进程的总情况{coutendl系统当前进程总情况:endlendl;if(head-m_size==siz){cout无进程,系统为空!endl;}for(intj=1;j=100;j++){if(array[j].p_size!=0){cout进程:jendl;cout首地址:array[j].p_addrendl;coutendl进程大小:array[j].p_sizeendlendl;}//访问进程数组,并打印}//cout当前空闲存储区表:endl;}char*lmalloc(unsignedsize)//分配进程函数{map*bp,*p;char*aa;unsigneda;bp=cursor;//采用循环首次适应法,从游标指针cursor开始查找空闲区do{//循环查找是否存在合适的空闲区if(bp-m_size=size){//判断是否当前空闲区大于进程大小aa=bp-m_addr;a=bp-m_size;bp-m_size-=size;//将空闲区扣除进程大小bp-m_addr+=size;//调整空闲区首地址if(bp-m_size==0){//若该空闲区正好用完if(bp==head&&bp-next!=head){//若该结点为头结点且空闲区链表不止一个结点p=head;head=head-next;head-prior=p-prior;p-prior-next=head;deletep;}//删除头结点else{if(bp!=head){//若非头结点p=bp;bp=bp-next;bp-prior=p-prior;p-prior-next=bp;deletep;}//删除该结点if(bp==head&&bp-next==head){//若为唯一的结点cout系统空间正好全部被占用!endl;}//if}//else}//ifcursor=bp;//使游标指针指向该空闲区,以便下次分配时从此开始处查找return(aa);//返回进程首地址}//ifbp=bp-next;}while(bp!=cursor);//直到正好走遍链表的所有结点cout对不起,没有可分配的合适空间endl;return(0);//没找到,返回0值}voidlfree(unsignedsize,char*addr)//释放进程函数{map*bp,*ps,*p,*pt;char*aa;aa=addr;if(head-m_addraa){//如果所释放的进程地址小于第一个空闲区的首地址if(aa+size==head-m_addr||head-m_size==0){//进程尾部与下一空闲区粘连head-m_addr=aa;head-m_size+=size;//修改此空闲区的首地址和大小}else{//进程尾部与空闲区不粘连ps=newmap;ps-m_addr=aa;ps-m_size=size;ps-next=head;ps-prior=head-prior;head-prior-next=ps;head-prior=ps;head=ps;//创建一个新的空闲区结点,记录此次释放进程}}//ifelse{//释放的进程所在内存位置前已有空闲区bp=head;do{bp=bp-next;}while(bp-m_addr=aa&&bp!=head);//走到该进程后的一个空闲区结点if(bp-prior-m_addr+bp-prior-m_size==aa){//该进程与前一空闲区粘连bp-prior-m_size+=size;//修改空闲区大小if(aa+size==bp-m_addr&&bp!=head){//若该进程亦与后一空闲区粘连且后空闲区并非第一个空闲区(循环链表)bp-prior-m_size+=bp-m_size;//修改空闲区大小p=bp;if(cursor==p)//若后空闲区结点为当前游标结点,游标指向上一结点cursor=p-prior;bp-prior-next=p-next;bp-next-prior=p-prior;bp=bp-next;deletep;//删除后空闲区结点}}//ifelse{if(aa+size!=bp-m_addr||bp==head){pt=newmap;pt-m_addr=aa;pt-m_size=size;pt-next=bp;pt-prior=bp-prior;bp-prior-next=pt;bp-prior=pt;}//为进程创建新的空闲区结点else{bp-m_addr-=size;bp-m_size+=size;}}}//else}//lfree
本文标题:可变分区的分配与回收(最先适应算法)-C++程序代码
链接地址:https://www.777doc.com/doc-5230385 .html