内存动态分配和回收的模拟实验_第1页
内存动态分配和回收的模拟实验_第2页
内存动态分配和回收的模拟实验_第3页
内存动态分配和回收的模拟实验_第4页
内存动态分配和回收的模拟实验_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汕萍*醇XIAhJGTAKIUMIVERSITY操作系统实验报告内存动态分区分配和回收的模拟实现班级:2013级软件工程1班学号:XXX姓名:萧氏一郎数据结构说明:StructSubAreaListA分配空间链表StructSubAreaListF空闲分区链表ViodSwap(Task&task,Task&task1)交换作业顺序函数ViodInitDate。初始化链表ViodMAllocate(Tasktask,intM)为申请分配内存ViodMFree(Tasktask,intN)释放内存流程图:a.内存分配检查完成?NOM.size>u/size?NOYesNOYesYes将该分区分配给请求者,修改有关数据将该分区移出从该分区划出u.size大小的分区继续检索下一项从头开始查表检查完成?NOM.size>u/size?NOYesNOYesYes将该分区分配给请求者,修改有关数据将该分区移出从该分区划出u.size大小的分区继续检索下一项从头开始查表返回b.内存回收源代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#defineSIZE_MIN2#defineMEMSIZE_MAX1024#defineFALSE0#defineTRUE!FALSE/*采用最佳分配法*/typedefintBOOL;typedefstruct_MEM_LINK{charcName;/*作业名*/intiStartAddr;/*分区起始地址*/intiMemSize;/*分区大小*/BOOLiState;/*分区状态,1表示已分配,0表示未分配*/struct_MEM_LINK*next;}MEM_LINK,*PMEM_LINK;PMEM_LINKg_pslnkHead;/*初始化内存使用情况*/voidinit(){g_pslnkHead=(PMEM_LINK)malloc(sizeof(MEM_LINK));memset(g_pslnkHead,0,sizeof(MEM_LINK));g_pslnkHead->iMemSize=MEMSIZE_MAX;}intmenu(){inti;printf("\n\n1.分配内存\n〃);printf("2.回收内存\n〃);printf("3.显示内存使用情况\n〃);printf(〃4.退出\n〃);printf("\n请输入选择:");scanf(〃%d〃,&i);getchar();return(i);/*分配内存函数,3作业名,usize是要分配的大小*/intmy_malloc(charc,intusize){PMEM_LINKpsNewMem=NULL,plnkTmp=NULL;BOOLbRepeatName=FALSE;intiTmp=g_pslnkHead->iMemSize-usize*SIZE_MIN;if(iTmp<=0)/*如果没有足够的空间分配*/returnFALSE;plnkTmp=g_pslnkHead;while(plnkTmp!=NULL){if(plnkTmp->cName==c){bRepeatName=TRUE;break;}plnkTmp=plnkTmp->next;}if(bRepeatName)/*如果作业名重复*/{returnFALSE;}/*创建新的节点*/psNewMem=(PMEM_LINK)malloc(sizeof(MEM_LINK));/*结构体设零*/memset(psNewMem,0,sizeof(MEM_LINK));/*设置节点内容*/psNewMem->cName=c;psNewMem->iMemSize=usize*SIZE_MIN;psNewMem->iStartAddr= MEMSIZE_MAXg_pslnkHead->iMemSize;psNewMem->iState=TRUE;plnkTmp=g_pslnkHead;/*查找链表最尾节点*/while(plnkTmp->next!=NULL)plnkTmp=plnkTmp->next;/*把新创建的节点加入到链表中*/plnkTmp->next=psNewMem;/*在整体内存中去掉以分配的部分*/g_pslnkHead->iMemSize-二usize*SIZE_MIN;returnTRUE;}/*回收内存函数,c是撤销的进程的作业名;*/intmy_free(charc){PMEM_LINKplnkBK=g_pslnkHead,/*保留上次搜索的节点*/plnkTmp=g_pslnkHead->next;BOOLbFind=FALSE;intiFreeSize=0;/*搜索链表*/while(plnkTmp!=NULL){if(plnkTmp->cName==c){/*如果找到节点,退出循环*/bFind=TRUE;break;}plnkBK=plnkTmp;plnkTmp=plnkTmp->next;}if(bFind){/*把找到的节点从链表中摘除并释放*/g_pslnkHead->iMemSize+=plnkTmp->iMemSize;plnkBK->next=plnkTmp->next;/*保留要释放内存的大小*/iFreeSize=plnkTmp->iMemSize;/*释放*/free(plnkTmp);/*把未释放内存的开始地址提前,防止内存碎片*/plnkTmp=plnkBK->next;while(plnkTmp!=NULL)plnkTmp->iStartAddr-二iFreeSize;plnkTmp=plnkTmp->next;}}returnbFind;}voiddisp(){PMEM_LINKpTmp;inti=0;pTmp=g_pslnkHead;printf("\n分区号作业名起始地址分区大小状态〃);while(pTmp){printf(〃\n%4d%c%4d %4d%4d〃,i,pTmp->cName,pTmp->iStartAddr,pTmp->iMemSize,pTmp->iState);pTmp=pTmp->next;i++;}}voidmain(){inti;charc;init();i=menu();while(i!=4){if(i==1){printf(〃\n作业名(一个字符):〃);scanf(〃%c〃,&c);printf(〃作业占内存大小:〃);scanf(〃%d〃,&i);if(my_malloc(c,i))printf("\n分配成功!!!〃);elseprintf("\n分配失败!!!〃)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论