实验报告课程名称操作系统原理实验名称文件管理姓名学号专业班级实验日期成绩指导教师赵安科(①实验目的②实验原理③主要仪器设备④实验内容与步骤⑤实验数据记录与处理⑥实验结果与分析⑦问题建议)实验三文件管理模拟文件存储空间管理1.内容:模拟文件存储空间的管理,采用空白文件目录法和空白块链法实施空间分配。2.思想:文件存储空间管理是文件系统的重要内容。常用的管理思想有空白文件目录法、空白块链法和位示图法。本实验采用前两种方法进行空间分配。(1)空白文件目录法进行空间分配时,需要建立相关的数据结构,记录目前空白区域和已使用区域,假设开始时全部区域空闲。当有文件需要存储时,先检查空白文件目录,找到适合区域立即分配,并修改空白文件目录表和已使用区域分配表。为此需建立两张表格,分别记录相关数据。空白文件目录表(初始)空白文件目录(中间)序号首空白块号空白快个数物理块号备注101000,1,2,……,98,99序号首空白块号空白块个数物理块号标志已使用区域表(中间)上述两张表的数据在系统运行中是发生变化的。文件空闲区分配和释放算法如下图所示:1242,3,4,5未分配2939,10,11未分配325525,26,27,28,29未分配439239,40未分配5………………未分配文件标识首块号文件块个数状态备注beta02占用Alpha63占用Toyota1213占用Sony309占用Ford504占用……………………图一文件空闲区分配算法图二文件空闲区回收算法(2)空白块链法进行空间分配时,需要建立链表数据结构,将空闲块按顺序加以组织,分配和回收时在链首完成,同时建立文件目录,记录文件占用空间情况。3.要求:(1)自拟模拟数据演示运行结果(假定系统可用空闲块数为100)。为便于检查,建立和删除文件顺序如下:分配文件:F1,3分配文件:F2,5分配文件:F3,3分配文件:F4,8分配文件:F5,4分配文件:F6,2删除文件:F1删除文件:F2分配文件:F7,6删除文件:F3分配文件:F8,4删除文件:F5分配文件:F9,4……每完成一个文件的分配和删除后,显示空白文件目录当前内容。(2)空白文件目录法必须完成,空白块链法选做。4.书写实验报告:文件标识首块号备注Beta0Alpha6Toyota12Sony30Ford50…………①实验题目;②程序中所用的数据结构及说明;③源程序并附上必要的说明;④按照文件的创建和删除顺序,打印输出结果。代码:#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;}}}(部分略)删除f1:删除f3:分配:f84: