广西师范大学计算机科学与信息工程学院操作系统实验书1操作系统课程实验年级2015级专业软件工程指导教师黄玲广西师范大学计算机科学与信息工程学院操作系统实验书2实验四、存储管理实验1.实验目的理解内存分配和回收原理2.实验环境Ubutu8.0或者以上,Eclipse集成开发环境。3.实验内容3.1在控制台内观察Linux内存分配情况在命令行界面完成下面工作。1)、建立如下程序mymem.c#includestdlib.h#includestdio.h#includestring.hmain(){char*ptr;ptr=(char*)malloc(0xfffff);//申请1MBif(ptr==0)printf(memoryallocatefail\n);strcpy(ptr,hello);printf(%sisallocatedat%p.pressreturntocontinue.\n,ptr,ptr);getchar();free(ptr);printf(memoryfree.pressreturntocontinue.\n);getchar();printf(end\n);}2)、在终端1编译连接、执行该程序广西师范大学计算机科学与信息工程学院操作系统实验书33)、在程序运行以后,打开一个新的终端2,使用ps–a–opid,cmd,sz,rsz,vsz命令观察程序占用的空间,sz表示进程以物理页面为单位的虚存大小,rsz为进程以KB为单位物理内存大小(Intel电脑的LINUX的每页大小为4KB)。4)、回到终端1,按任意键,继续程序的执行。5)、回到终端2,使用ps–a–opid,cmd,sz,rsz,vsz命令观察程序占用的空间SZ。广西师范大学计算机科学与信息工程学院操作系统实验书43.2存储管理模拟实验要求:写一动态分区管理程序,使其内存分配采用最佳适应分配算法。学习例子说明:本系统模拟动态分区管理方案,内存分配算法是最先适应分配算法。系统为作业分配内存时,根据指针freep查找空闲分区链。当找到第一块可以满足请求的空闲分区时便分配。当空间被分配后剩余的空间大于规定的碎片,则形成一个较小的空闲分区留在空闲链中。当某个分配请求不能被满足时,但此时系统中所有碎片容量满足请求时,系统立即进行“内存紧缩”,即搬家,以消除碎片。然后,再次进行分配。内存紧缩,是将所有作业移到地址高端区,则低端就形成较大的一块空闲分区。当回收内存时,将回收分区插入空闲分区链。若回收区有前邻或后邻空闲分区,则将它们拼接成一块较大的空闲分区。关键数据结构:作业链、空闲分区链。#includestdlib.h#includestring.h#includestdio.h#definetotal5000//总的内存大小#definesetaddress2000//内存起始地址广西师范大学计算机科学与信息工程学院操作系统实验书5#definemin100//可做碎片的界限#definemax10//作业数上界structmat{//已分配块的数据结构charjobname[10];//作业名字intjobaddress;//作业的起始地址intjoblength;//作业大小structmat*next;//作业链的后向链指针structmat*back;//作业链的前向链指针};structmat*jobp;//内存作业链链首,从高址块链向低址块。structfreearea{//空闲块intfreeaddress;//空闲分区的起始地址intfreesize;//空闲分区大小structfreearea*next;//空闲分区双向链指针structfreearea*back;};structfreearea*freep;//空白块链首指针,从低址块链向高址块。inttotalfree;//当前剩余总空间charjobnumber;//当前占用内存的作业数intmain();voidinitiation();voidffallocation(intlength,charname[],int*adds);voidffcollection(charname[]);voidshowyou();voidcoalesce();//--------------------------------------------------------------------------------------intmain(){intover=0,select;charname[10];intlength;intaddress,*addressptr;//initiation();//初始化addressptr=&address;while(!over){printf(\n\n选择功能:1-分配2-回收3-内存分配状况4-退出\n);广西师范大学计算机科学与信息工程学院操作系统实验书6scanf(%d,&select);switch(select){case1:{if(jobnumber=max)printf(作业太多。\n);else{printf(请输入作业名字:);scanf(%s,name);printf(\n);printf(请输入作业大小:);scanf(%d,&length);printf(\n);//为作业分配大小length的空间,返回起始地址address.ffallocation(length,name,addressptr);if(address==-1)printf(空间已满,不能分配。\n);elseif(address==0){coalesce();//搬家ffallocation(length,name,addressptr);showyou();//显示内存作业分配情况}elseshowyou();//显示内存作业分配情况}break;}case2:{printf(输入要回收的作业名字:);scanf(%s,name);printf(\n);ffcollection(name);showyou();break;}case3:{showyou();//显示内存作业分配情况break;广西师范大学计算机科学与信息工程学院操作系统实验书7}case4:over=1;//退出}}return0;}//---------------------------------------------------------------------------------------//初始化voidinitiation(){freep=calloc(1,sizeof(structfreearea));freep-freeaddress=setaddress;//填写空闲链第一个节点freep-freesize=total;freep-next=NULL;freep-back=NULL;totalfree=total;jobnumber=0;}//------------------------------------------------------------------------------------//有两个链:空白块链及作业链.空白块链描述空白块,链首指针freep,初始为一大块空白块.//作业链按从高址到低址的顺序链接,链首指针jobp//为作业jn分配jl大小内存,起始地址为javoidffallocation(intjl,charjn[10],int*ja){structmat*jp=NULL;//作业链当前节点structmat*jp2=NULL;//新的作业节点structmat*jp1=NULL;//structfreearea*fp=NULL;//当前空白块inti;*ja=-1;if(totalfreejl)//剩余空间大小不能满足作业要求return;*ja=0;fp=freep;//取空白块链首块,将顺着链寻找第一块满足作业要求的块。while(fp!=NULL){if(fp-freesizejl)fp=fp-next;//当前空白块大小不满足要求else//将当前空白块分配给作业{广西师范大学计算机科学与信息工程学院操作系统实验书8jobnumber++;totalfree=totalfree-jl;jp2=calloc(1,sizeof(structmat));//在节点上登记为该作业分配的内存空间//for(i=0;i10;i++)(jp2-jobname)[i]='';i=-1;while(jn[++i])(jp2-jobname)[i]=jn[i];(jp2-jobname)[i]='\0';jp2-joblength=jl;jp2-jobaddress=fp-freeaddress;//登记该作业的起始地址(块的最低地址)*ja=jp2-jobaddress;//将节点jp2插入作业链jobp,按高址到低址的顺序。if(jobp==NULL){//插入链首jp2-next=NULL;jp2-back=NULL;jobp=jp2;}else{jp=jobp;//取链首指针while((jp!=NULL)&&(jp2-jobaddressjp-jobaddress)){jp1=jp;//jp1为jp的前一个节点jp=jp-next;//继续搜索}//将jp2插入到jp1之后、jp之前jp2-next=jp;if(jp==NULL){//插到链尾jp2-back=jp1;jp1-next=jp2;}else{//插在链中间jp2-back=jp-back;if(jp-back!=NULL)//jp不是首节点jp1-next=jp2;elsejobp=jp2;//jp是首节点jp-back=jp2;}广西师范大学计算机科学与信息工程学院操作系统实验书9}//if(jobp==NULL)//剩余空白块处理if(fp-freesize-jlmin)//剩余空间小于最小量,碎片{//抛弃碎片fp:从空闲分区链删除此节点。但碎片大小依然反映在totalfree.if(fp-next!=NULL)(fp-next)-back=fp-back;//fp非尾节点if(fp-back!=NULL)(fp-back)-next=fp-next;//fp非首节点elsefreep=fp-next;//fp为首节点}else{//登记余下空白块fp:节点链指针不变,调整块的大小及地址fp-freesize=fp-freesize-jl;fp-freeaddress=fp-freeaddress+jl;//分配空白块前半部分}return;}//else//将当前空白块分配给作业}//while(fp!=NULL)}//-------------------------------------------------------------------------------------//回收//jn为要回收的作业名voidffcollection(charjn[]){structmat*jp=NULL;//作业链当前节点structfreearea*fp=NULL;structfreearea*fp1=NULL;structfreearea*fp2=NULL;//当前空白块charf;//表示回收块前后邻空白块状况jp=jobp;//取作业链链首指针f=0;//在作业链中寻找作业名为jn的作业while(jp!=NULL&&strcmp(jn,jp-jobname))jp=jp-next;if(jp==NULL)return;//找不到作业//作业节点jpjobnumber--;广西师范大学计算机科学与信息工程学院操作系统实验书10totalfree+=jp-joblength;if(freep==NUL