操作系统文件管理实验报告_第1页
操作系统文件管理实验报告_第2页
操作系统文件管理实验报告_第3页
操作系统文件管理实验报告_第4页
操作系统文件管理实验报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

/实验报告课程名称计算机操作系统实验名称文件管理班级学号姓名成绩指导教师赵安科实验日期2015年6月18日实验题目:文件管理实验内容:模拟文件存储空间的管理,采用空白文件目录法和空白块链法实施空间分配。实验说明:文件存储空间管理是文件系统的重要内容。常用的管理思想有空白文件目录法、空白块链法和位示图法。本实验采用前两种方法进行空间分配。(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占用……已使用区域表(中间)上述两张表的数据在系统运行中是发生变化的。文件空闲区分配和释放算法如下图所示:图一文件空闲区分配算法图二文件空闲区回收算法空白块链法进行空间分配时,需要建立链表数据结构,将空闲块按顺序加以组织,分配和回收时在链首完成,同时建立文件目录,记录文件占用空间情况。文件标识首块号备注beta0Alpha6Toyota12Sony30Ford50…………实验要求:(1)自拟模拟数据演示运行结果(假定系统可用空闲块数为100)。为便于检查,建立和删除文件顺序如下:分配文件:F1,3分配文件:F2,5分配文件:F3,3分配文件:F4,8分配文件:F5,4分配文件:F6,2删除文件:F1删除文件:F2分配文件:F7,6删除文件:F3分配文件:F8,4删除文件:F5分配文件:F9,4……每完成一个文件的分配和删除后,显示空白文件目录当前内容。空白文件目录法必须完成,空白块链法选做。程序中所用数据结构及说明:实验中,定义了两个结构体类型—SPACE(空白区)和OCCUPY(占用区),其结构如下:structSPACE//空白区{ intid;//空白文件序号intfirst;//首空白块号 intnum;//空白块个数 intblock[30];//物理块号};structOCCUPY//占用区{ charfilename[20];//文件名 intfirstf;//首块号 intnumf;//文件块个数 intblockf[30];//物理块号};分别用来描述空白区和占用区的相关属性,再定义它们的结构数组OCCUPYo[20]和SPACEs[20]用来表示两个表(存储相关数据),定义变量smax和omax分别用来初始空白区文件数目和初始占用区文件数目,函数spaceprint和函数occupyprit分别用来显示空白区和占用区的情况,函数fenpei和函数shanchu分别用来分配文件和删除文件,随用户的选择可动态的分配和删除文件,并且将每次执行的结果显示出来(即空白区情况和占用区情况),用户根据两个表的情况可实时观察到操作所执行的结果及过程,最终比较实验结果可进一步加深和理解空白目录法的过程和本质。程序清单及描述:#include<iostream.h>#include<string.h>intsmax=1;//初始空白区文件数目intomax=0;//初始占用区文件数目structSPACE//空白区{ intid;//空白文件序号intfirst;//首空白块号 intnum;//空白块个数 intblock[30];//物理块号};structOCCUPY//占用区{ charfilename[20];//文件名 intfirstf;//首块号 intnumf;//文件块个数 intblockf[30];//物理块号};//初始化OCCUPYo[20];SPACEs[20]={{1,0,100,{0,1,2,3,98,99}}};voidbubble(inta[],intn)//冒泡法排序{ inti,j,t,flag=1; for(i=1;i<n&&flag==1;i++) { flag=0; for(j=0;j<n-1;j++) { if(a[j]>a[j+1]) { flag=1; t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } }}//空白区输出显示voidspaceprint(){ inta[20]; for(intj=0;j<smax;j++)//将首块号排序 { a[j]=s[j].first; }bubble(a,smax); cout<<"空白文件序号\t"<<"首空白块号\t"<<"空白块个数\t"<<"物理块号\n"; for(intz=0;z<smax;z++) { for(inti=0;i<smax;i++) { if(a[z]==s[i].first)//按首块号从小到大顺序输出 { cout<<z+1<<"\t\t"<<s[i].first<<"\t\t"<<s[i].num<<"\t\t"; cout<<s[i].first<<"—"<<s[i].first+s[i].num-1; cout<<endl; } } } cout<<"当前空白文件数目为="<<smax<<endl;cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";}//占用区输出显示voidoccupyprint(){ cout<<"文件名\t首块号\t文件块个数\t物理块号\n"; for(inti=0;i<omax;i++) { cout<<o[i].filename<<"\t"<<o[i].firstf<<"\t"<<o[i].numf<<"\t\t"; cout<<o[i].firstf<<"—"<<o[i].firstf+o[i].numf-1; cout<<endl; } cout<<"当前文件数目为="<<omax<<endl;}voidfenpei()//分配文件{ charfilen[20];//文件名 intsize;//申请块数 intfirsti=0;//中间过渡临时变量 cout<<"您执行的操作为:文件分配\n"; cout<<"请输入分配文件名:";cin>>filen; cout<<"请输入申请块数:";cin>>size; for(inti=0;i<smax;i++) { for(intj=0;j<omax;j++) { if(!strcmp(filen,o[j].filename)) { cout<<"文件已分配过!\n"; return; } } if(size<=0) { cout<<"申请块数错误!\n"; return; } if(i>=smax) { cout<<"此次分配失败!\n"; return; } if(s[i].num==size)//空白块个数等于申请块个数 { firsti=s[i].first;//修改空白区 for(i;i<smax-1;i++) { s[i].first=s[i+1].first; s[i].num=s[i+1].num; } strcpy(o[omax].filename,filen);//修改占用区 o[omax].firstf=firsti; o[omax].numf=size; omax++; cout<<"文件分配成功!\n"; smax--; break; } if(s[i].num>size)//空白块个数大于申请块个数 { firsti=s[i].first;//修改空白区 s[i].first+=size; s[i].num-=size; strcpy(o[omax].filename,filen);//修改占用区 o[omax].firstf=firsti; o[omax].numf=size; omax++; cout<<"文件分配成功!\n"; break; } } spaceprint(); occupyprint();}voidshanchu()//删除文件{ charfilen[20];//文件名 intf;//文件首块号 intn;//文件所占的块数 cout<<"您执行的操作为:文件删除\n"; cout<<"请输入删除文件名:";cin>>filen; intexits=1;//标记,判断文件是否存在 for(inti=0;i<omax;i++) { if(!strcmp(o[i].filename,filen))//文件存在 { exits=0; intf1=0;//标记上临 intf2=0;//标记下临 intp1,p2;//存储上临、下临的序号 f=o[i].firstf; n=o[i].numf; for(i;i<omax-1;i++)//修改占用区 { o[i]=o[i+1]; } omax--; for(intj=0;j<smax;j++)//修改空白区 { if(s[j].first+s[j].num==f)//上临 { f1=1; p1=j; } if(s[j].first==f+n)//下临 { f2=1; p2=j; } } //四种情况 if(f1&&!f2)//有上临无下临 { s[p1].num+=n; } if(!f1&&f2)//无上临有下临 { s[p2].first=f; s[p2].num+=n; } if(f1&&f2)//既有上临又有下临 { s[p1].num=s[p1].num+n+s[p2].num; for(p2;p2<smax-1;p2++) { s[p2]=s[p2+1]; s[p2].id=p2+1; } smax--; } if(!f1&&!f2)//既无上临也无下临 { s[smax].id=smax+1; s[smax].first=f; s[smax].num=n; smax++; } } } if(exits)//文件不存在 { cout<<"输入文件名有误!\n"; } spaceprint(); occupyprint();}intmain(){ spaceprint(); occupyprint(); while(1) { charch; cout<<"************************************************************************\n"; cout<<"您可以选择以下操作:";cout<<"1.分配文件\t"<<"2.删除文件\n"; cin>>ch;if(ch=='1') {fenpei(); } if(ch=='2') { shanchu(); } if(ch!='1'&&ch!='2') { cout<<"输入有误,请重新输入!\n"; } } return0;}执行结果:实验结果分析:对比实验运行结果,文件的分配过程和文件的删除过程与人工分析的结果一致,实验基本达到预期的目标。总结与体会:在本次试验的过程中,由于前期的理论准备不足和对课本知识的掌握的不足,在编写程序的过程中,考虑的情况不全面,所写的程序结构较混乱而且可读性不强,错误较多,尤其是文件分配过程中修改空白区和占用区,文件删

温馨提示

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

评论

0/150

提交评论