您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 文件管理模拟文件存储空间管理采用空白文件目录法
实验报告课程名称操作系统实验名称文件管理班级计科1203学号201207010321姓名马万里指导教师赵安科实验日期2015.6.19成绩模拟文件存储空间管理一.内容:模拟文件存储空间的管理,采用空白文件目录法和空白块链法实施空间分配。二.思想:图一文件空闲区分配算法图二文件空闲区回收算法三.要求:(1)自拟模拟数据演示运行结果(假定系统可用空闲块数为100)。为便于检查,建立和删除文件顺序如下分配文件:F1,3分配文件:F2,5分配文件:F3,3分配文件:F4,8分配文件:F5,4分配文件:F6,2删除文件:F1删除文件:F2分配文件:F7,6删除文件:F3分配文件:F8,4删除文件:F5分配文件:F9,4四.主要源代码#includeiostream#includeiomanipusingnamespacestd;intB=1;//空白序号intU=100;//文件标示序号typedefstruct_Black{intBnum;intBfirst;intBleng;intBlast;}Black;typedefstruct_Use{charUfile[8];intUfirst;intUleng;intUlast;intUflg;}Use;Blackblack[]={{0,0,100,99}};//初始化Useuse[100]={};voidbubbleSort(Blacka[],intm)//为了实现再次新建文件时提高分配利用率(将空白块按空白个数由从小到排序){for(inti=0;im-1;i++){for(intj=0;jm-1-i;j++){if(a[j].Bfirsta[j+1].Bfirst){Blacktemp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}}voidPrintBlack(){intnum=1;cout########当前的空文件目录表########endl;cout序号首块号空白块个数末块号endl;for(inti=0;iB;i++){coutnumsetw(10)black[i].Bfirstsetw(10)black[i].Blengsetw(10)black[i].Blastendl;num++;}coutendl;}voidPrintUse(){cout#######当前的已使用文件目录#######endl;cout文件名首块号空白块个数末块号endl;for(inti=0;iU;i++){if(use[i].Uflg==1){coutuse[i].Ufilesetw(10)use[i].Ufirstsetw(10)use[i].Ulengsetw(10)use[i].Ulastendl;}}coutendl;}voidDistribute(){cout输入文件名和块数endl;charfname[8];//文件名intm;//块数inttemp;//记录要插入的首块号(空白区中的)intt=1;//为了遍历完空白表的验证非法的输入(即块数大于空白区的所有的块数)cinfnamem;for(inti=0;iB;i++){t++;for(intj=0;jU;j++){if(!strcmp(fname,use[j].Ufile)){cout!!!!!!!!!!!!!!!此文件名已经存在!!请换文件名!!!!!!!!!!!!!!!!endl;return;}}if(black[i].Bleng=m){temp=black[i].Bfirst;if(black[i].Bleng==m)//删除空白区{for(;iB-1;i++){black[i].Bfirst=black[i+1].Bfirst;black[i].Bleng=black[i+1].Bleng;black[i].Blast=black[i+1].Blast;}B--;}else//修改空白区{black[i].Bleng-=m;black[i].Bfirst+=m;}strcpy(use[U].Ufile,fname);use[U].Ufirst=temp;use[U].Uleng=m;use[U].Ulast=use[U].Ufirst+use[U].Uleng-1;use[U].Uflg=1;U++;break;}else{if(t==B)//当遍历完整个空白表而且不存在小于m的空白区cout由于m块数大于空闲区无法分配endl;}}bubbleSort(black,B);PrintBlack();PrintUse();}voidRelease(){intflag=0;//标记输入的文件名是否存在intufirst;//首块号intuleng;//文件快数intulast;//文件末块charfname[8];cout输入删除文件的文件名endl;cinfname;for(inti=0;iU;i++){if(!strcmp(fname,use[i].Ufile)){flag=1;intfT=0;//上邻标记intTnum=0;intfB=0;//下邻标记intBnum=0;ulast=use[i].Ulast;ufirst=use[i].Ufirst;uleng=use[i].Uleng;use[i].Uflg=-1;for(intj=0;jB;j++)//遍历判断上下邻{if((black[j].Blast+1)==ufirst){fT=1;//存在上邻Tnum=j;}if((black[j].Bfirst-1)==ulast){fB=1;//存在下邻Bnum=j;}}if(fT&&(!fB))//有上邻,无下邻{black[Tnum].Bleng+=uleng;black[Tnum].Blast=ulast;}if(fT&&fB)//有上邻,有下邻{black[Tnum].Bleng+=(uleng+black[Bnum].Bleng);black[Tnum].Blast=black[Bnum].Blast;for(;BnumB;Bnum++){black[Bnum]=black[Bnum+1];black[Bnum].Bnum=Bnum+1;}B--;}if((!fT)&&(!fB))//无上邻,无下邻{black[B].Bnum=B;black[B].Bfirst=ufirst;black[B].Bleng=uleng;black[B].Blast=ulast;B++;}if((!fT)&&fB)//无上邻,有下邻{black[Bnum].Bleng+=uleng;black[Bnum].Bfirst=ufirst;}}}if(flag==0){cout!!!!!!!!!!!!输入文件不存在!!!!!!!!!!!!endl;}bubbleSort(black,B);PrintBlack();PrintUse();}voidmain(){cout*****模拟文件存储空白文件目录*****endlendl;PrintBlack();PrintUse();intn;while(1){cout***********************************endlendl;;cout请按如下输入进行操作(分配:1释放:2结束:3);fflush(stdin);cinn;system(cls);if(n==1)Distribute();elseif(n==2)Release();elseif(n==3)return;else{cout重新输入endl;}}}五.实验抓图(主要部分)初始化:分配:f13(部分略)删除f1:删除f2分配:f76:删除f3:分配:f84:六.实验心得本次实验相对来说比较完美,最主要的是对流程图的深入理解,对于第二个流程图中,当出现无下邻无上邻时流程图给出的处理结果不是很明了(原话是:在空白表中增加一行)但是,加在空白表的左后呢?还是按首块号的位置增加呢?,这两种处理结果,会导致最终后面的分配和释放不同的结果,我认为如果每次将空白表中数据按空白块的个数排序,这样可以减少碎片.总的来说,这次模拟实验不难.
本文标题:文件管理模拟文件存储空间管理采用空白文件目录法
链接地址:https://www.777doc.com/doc-2336571 .html