已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程名称 计算机操作系统 实验名称 文件系统存储空间管理模拟 姓 名 学 号 专业班级 实验日期 成 绩 指导老师 1、 实验目的 根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。2、 实验原理 用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。3、 主要仪器设备 PC机(含有VC)4、 实验内容与步骤实验内容:1. 模拟文件空间分配、释放过程,可选择连续分配、链式分配、 索引分配方法;2. 文件空闲空间管理,可采用空白块链、空白目录、位示图方法;步骤如下:1. 输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图;(1)磁盘基本信息:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q;(2)假设采用整数数组存放位示图,则数组大小为:Size= ceil(柱面数*每柱面磁道数*每磁道物理块数)/(sizeof(int)*8) (3)申请大小为size的整数数组map,并对其进行随机初始化。 例如:假设m=2, p=4, q=8, 共有64个磁盘块, 若sizeof(int)=2, 则位示图大小为4,map4如下: 1514131211109876543210map00011010011001010map11010110000110000map2011001110011001map31000100001100110位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。即map0的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map1的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。1514131211109876543210map01514131211109876543210map131302928272625242322212019181716map247464544434241403938373635343332map363626160595857565554535251504948如上表所示, 29号磁盘的状态存在map1中,对应于第13位;2. 输出初始位示图信息;3. 输入文件分配或释放请求, (1)格式:“+ 文件名 申请块数” 或 “ - 文件名 ” “+”表示申请文件分配,“-”表示删除文件 如: + F1 54. 根据请求完成相应操作。 (1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为“1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR地址或相对磁盘块号记录在文件目录中。输出位示图修改位置、分配的磁盘块CHR地址、修改后的目录和位示图信息。否则,空间不够,退出执行下一条请求; l 计算公式如下:a. 已知位示图中的下标i , j, 计算相对块号 Block= i*sizeof( int )*8+j b. 已知相对块号计算柱面、磁道、物理块号如下: 柱面号 C= 相对块号/(每柱面磁道数*每磁道物理块数) 磁道号 H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数 物理块号 R= 相对块号%每磁道物理块数l 文件目录如下(以索引表分配为例):文件名首个物理块CHR地址块个数索引表beta(0,0,0)2(0,0,0)(0,0,1)Alpha(2,3,0)3(2,3,0)Toyota43(4 9 12)(Sony文件名首个物理块地址(相对)块个数索引表beta02(0,2,3)Alpha33(3,6,7)Toyota83(8, 9,12)(2)若为删除申请,则从目录中找到要删除的文件所在的目录项,读取索引表,依次读取文件相应的盘块CHR地址, 计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置( i,j),将位示图中的相应位有“1”改为“0”, 并从目录中删除该目录项。输出删除的磁盘块CHR地址、相应位示图修改位置、修改过的位示图和目录。计算过程如下:相对磁盘块号 = 柱面号*每柱面磁道数*每磁道物理块数+ 磁道号*每磁道物理块数+ 物理块号i = 相对磁盘块号/ (sizeof(int)*8)j = 相对磁盘块号% (sizeof(int)*8)5、 实验流程图图一 文件空闲区分配算法图二 文件空闲区回收算法6、 实验代码#include stdio.h #include #include #include int physic100; /文件地址缓冲区int style=1; /文件的类型char cur_dir10=root; /当前目录 struct commandchar com10;cmd13;struct block int n; /空闲的盘快的个数 int free50; /存放空闲盘快的地址 int a; /模拟盘快是否被占用memory20449;struct block_superint n; /空闲的盘快的个数 int free50; /存放进入栈中的空闲块 int stack50; /存放下一组空闲盘快的地址super_block;struct node /i结点信息int file_style; /i结点 文件类型 int file_length; /i结点 文件长度 int file_address100; /i结点 文件的物理地址 i_node640;struct dir /目录项信息char file_name10; /文件名 int i_num; /文件的结点号 char dir_name10; /文件所在的目录 root640;void format() /格式化int i,j,k; super_block.n=50; for(i=0;i50;i+) /超级块初始化 super_block.freei=i; /存放进入栈中的空闲块 super_block.stacki=50+i; /存放下一组的盘块 for(i=0;i640;i+) /i结点信息初始化 for(j=0;j100;j+) i_nodei.file_addressj=-1;/文件地址 i_nodei.file_length=-1; /文件长度 i_nodei.file_style=-1; /文件类型 for(i=0;i640;i+) /根目录区信息初始化 strcpy(rooti.file_name,); rooti.i_num=-1; strcpy(rooti.dir_name,); for(i=0;i20449;i+) /存储空间初始化 memoryi.n=0; /必须有这个 memoryi.a=0; for(j=0;j50;j+) memoryi.freej=-1; for(i=0;i20449;i+) /将空闲块的信息用成组链接的方法写进每组的最后一个块中 /存储空间初始化 if(i+1)%50=0) k=i+1; for(j=0;j50;j+) if(k20450) memoryi.freej=k;/下一组空闲地址 memoryi.n+; /下一组空闲个数 注意在memoryi.n+之前要给其赋初值 k+; else memoryi.freej=-1; memoryi.a=0; /标记为没有使用 continue; /处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环 for(j=0;j50;j+) memoryi.freej=-1; memoryi.n=0; printf(已经初始化完毕n); printf(进入UNIX文件模拟.nn); void write_file(FILE *fp) /将信息读入系统文件中int i; fp=fopen(system,wb); for(i=0;i20449;i+) fwrite(&memoryi,sizeof(struct block),1,fp); fwrite(&super_block,sizeof(struct block_super),1,fp); for(i=0;i640;i+) write(&i_nodei,sizeof(struct node),1,fp); for(i=0;i640;i+) fwrite(&rooti,sizeof(struct dir),1,fp); fclose(fp);void read_file(FILE *fp) /读出系统文件的信息 int i; fp=fopen(system,rb); for(i=0;i20449;i+) fread(&memoryi,sizeof(struct block),1,fp); fread(&super_block,sizeof(struct block_super),1,fp); for(i=0;i640;i+) fread(&i_nodei,sizeof(struct node),1,fp); for(i=0;i=0;i-) k=physici; /需要提供要回收的文件的地址 m=49-super_block.n; /回收到栈中的哪个位置 if(super_block.n=50) /注意 当super_block.n=50时 m=-1;的值 /super_block.n=50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中 for(j=0;j50;j+) memoryk.freej=super_block.freej; super_block.n=0; memoryk.n=50; memoryk.a=0; if(m=-1) m=49; /将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息 super_block.freem=physici; /将下一个文件地址中的盘块号回收到栈中 super_block.n+; void allot(int length) /分配空间 int i,j,k,m,p; for(i=0;ilength;i+) k=50-super_block.n; /超级块中表示空闲块的指针 m=super_block.freek; /栈中的相应盘块的地址 p=super_block.free49; /栈中的最后一个盘块指向的地址 if(m=-1|memoryp.a=1) /检测是否还有下一组盘块 printf(内存不足,不能够分配空间n); callback(length); break; if(super_block.n=1) memorym.a=1; /将最后一个盘块分配掉 physici=m; super_block.n=0; for(j=0;jmemorym.n;j+) /从最后一个盘块中取出下一组盘块号写入栈中 super_block.freej=memorym.freej; super_block.n+; continue; /要跳过这次循环,下面的语句在IF中已经执行过 physici=m; /栈中的相应盘块的地址写进 文件地址缓冲区 memorym.a=1; super_block.n-; void create_file(char filename,int length) /创建文件 int i,j; for(i=0;i640;i+) if(strcmp(filename,rooti.file_name)=0) printf(文件已经存在,不允许建立重名的文件n); return; for(i=0;i640;i+) if(rooti.i_num=-1) rooti.i_num=i; strcpy(rooti.file_name,filename); strcpy(rooti.dir_name,cur_dir); /把当前目录名 给新建立的文件 i_nodei.file_style=style; i_nodei.file_length=length; allot(length); for(j=0;jlength;j+) i_nodei.file_addressj=physicj; break; void create_dir(char filename) /创建目录style=0; /0代表文件类型是目录文件 create_file(filename,4); style=1; /用完恢复初值,因为全局变量,否则void del_file(char filename) /删除文件 int i,j,k; for(i=0;i640;i+) if(strcmp(filename,rooti.file_name)=0) k=rooti.i_num; for(j=0;ji_nodek.file_length;j+) physicj=i_nodek.file_addressj; callback(i_nodek.file_length); /调用 回收函数 for(j=0;j100;j+) /删除文件后要将文件属性和目录项的各个值恢复初值 i_nodek.file_addressj=-1; /地址恢复初值 strcpy(rooti.file_name,); /文件名恢复初值 rooti.i_num=-1; /目录项的I结点信息恢复初值 strcpy(rooti.dir_name,); /目录项的文件目录信息恢复初值 i_nodek.file_length=-1; /文件长度恢复 i_nodek.file_style=-1; /文件类型恢复初值 break; if(i=640) printf(不存在这个文件n); void del_dir(char filename) /删除目录 需要判断目录下时候为空,不为空就不删除 int i,j,k; for(i=0;i640;i+) /还要加条件判断要删除的目录是不是当前目录 k=rooti.i_num; /找到目录名字 if( strcmp(rooti.file_name,filename)=0 & strcmp(cur_dir,filename)!=0 & (i_nodek.file_style)=0 ) for(j=0;j640;j+) if(strcmp(filename,rootj.dir_name)=0) printf(目录不为空不能直接删除n); break; if(j=640) del_file(filename); break; break; if(i=640) printf(这个不是目录文件 或者不存在这个目录,或者你要删除的是当前目录n); void display_curdir() /显示当前目录下的文件列表 int i,k; printf(tt文件名字 文件类型 文件长度 所属目录n); for(i=0;i640;i+) if(strcmp(cur_dir,rooti.dir_name)=0) /查询文件中 所在目录信息和当前目录信息相同的数据 k=rooti.i_num; printf(tt %st,rooti.file_name); /文件名 printf(t%dt,i_nodek.file_style); /文件的类型 printf(%dt,i_nodek.file_length); /文件的长度 printf(%sn,rooti.dir_name); /文件所在的目录 void display_dir(char filename) /进入指定的目录 int i,k; for(i=0;i640;i+) k=rooti.i_num; /判断文件类型是不是目录类型 if(strcmp(filename,rooti.file_name)=0) & (i_nodek.file_style=0) strcpy(cur_dir,filename); /将要进入的指定目录设置为当前目录 赋值不要反了strcpy(目的,源) break; if(i=640) printf(没有这个目录n); void open_file(char filename) /打开文件 int i,j,k; printf(tt文件名字 文件类型 文件长度 所属目录n); for(i=0;i640;i+) k=rooti.i_num; if(strcmp(filename,rooti.file_name)=0 & (i_nodek.file_style=1) printf(tt %st,rooti.file_name); /文件名 printf(t%dt,i_nodek.file_style); /文件的类型 printf(%dt,i_nodek.file_length); /文件的长度 printf(%sn,rooti.dir_name); /文件所在的目录 printf(tt文件占用的物理地址n); for(j=0;ji_nodek.file_length;j+) /显示物理地址 printf(%d ,i_nodek.file_addressj); /文件具体占用的盘块号 printf(n); break; if(i=640) printf(没有这个文件 或者这个文件不是正规文件n); void back_dir() /返回上一级目录 int i,k; for(i=0;i640;i+) /查询和当前目录名相同的目录文件名 k=rooti.i_num; if(strcmp(cur_dir,rooti.file_name)=0 & (i_nodek.file_style=0) strcpy(cur_dir,rooti.dir_name); /将查询到的目录文件名 所在的目录赋值给当前目录 void display_sys() /显示系统信息(磁盘使用情况) int i,m,k=0; for(i=0;i20449;i+) if(memoryi.a=0) k+; m=20449-k; printf(空闲的盘块数是:t); printf(%dn,k); printf(使用的盘块数是:t); printf(%dn,m); void help() /显示帮助信息printf(*n); printf(* 以下是文件管理已分配盘块- *n); printf(* 1.初始化-format *n); printf(* 2.查看当前目录文件列表-dir *n); printf(* 3.查看文件-cat-(cat + 空格 + 文件名) *n); printf(* 4.查看系统信息-ls *n); printf(* 5.创建目录-md-(md + 空格 + 目录名) *n); printf(* 6.创建文件-vi-(vi + 空格 + 文件名 + 文件长度) *n); printf(* 7.删除文件-del-(del + 空格 + 文件名) *n); printf(* 8.删除目录-deldir-(del + 空格 + 目录名) *n); printf(* 9.进入当前目录下的指定目录-cd-(cd + 空格 + 目录名) *n); printf(* 10.返回上一级目录-cd. *n); printf(* 11.显示帮助命令-help *n); printf(* 12.退出文件模拟-quit *n); printf(* 13,进入成组链接-guo *n); printf(*n);int MA4; /*空闲块数组*/int A94=3,1,2,3,3,4,5,6,0,0,0,0,0,0,0,0,3,0,7,8, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; /*磁盘空间*/int mark9; /*存放已分配的块*/int No=0; /*已分配的块数*/void display1() int i,j,temp,count; No=0; if(MA1!=0) i=MA0; printf(ngroup1:); for(j=1;j=i;j+) printf(%d ,MAj); mark+No=MAj; temp=MA1; count=2; while(Atemp1!=0) printf(ngroup%d:,count); i=Atemp0; for(j=1;j=i;j+) printf(%d ,Atempj); mark+No=Atempj; count+; temp=Atemp1; printf(ngroup%d:,count); i=Atemp0; for(j=2;j0) printf(%d ,Atempj); mark+No=Atempj; else i=MA0; if(i=1) printf(nThe blocks are all assigned); else printf(ngroup1:); for(j=2;j=i;j+) printf(%d ,MAj); mark+No=MAj; void display() /*显示分组情况*/ int i,j; if(MA0!=0) display1(); else i=MA1; for(j=0;j1) /*若该组不止一个空闲块*/ i=MA0; s=MAi; MA0-; printf(nnumber of the block:%d,s); else if(MA0=1) /*只剩一个空闲块*/ if(MA1!=0) /*还有其它空闲块组*/ s=MA1; for(i=0;i=3;i+) A0i=Asi; MA0-; printf(nnumber of the block:%d,s); else /*没有其它空闲块组*/ printf(nThere isnt any space); return; else /*当前组已分配完*/ for(i=0;i=3;i+) MAi=A0i; assign(); display(); /*显示分组情况*/ void callback() /*回收空闲块*/ int i,j,temp; printf(ninput the No. of the block you want to callback:); scanf(%d,&j); getchar(); /*得到待回收的空闲块号*/ for(temp=1;temp=No;temp+) if(marktemp=j) break; if(tempNo+1) /*若该空闲块已在,退出*/ printf(nThe block is in the disk); return; if(MA03) /*当前组不满3块*/ i=MA0; MAi+1=j; MA0+; else /*已有3块*/ for(i=0;i=3;i+) Aji=MAi; MA0=1; MA1=j; display(); /*显示*/ int filecontrol();void menu() /*功能选择函数*/ int choice; char judge; printf(文件管理空间管理n); printf(ninput your choice:(1-assign,2-callback,3-backtofilecontrol):n); scanf(%d,&choice); getchar(); if(choice=1) assign(); else if(choice=2) callback(); else if(choice=3) filecontrol(); else printf(ninvalid command!); printf(ncontinue or not?(y-Yes,n-Not):); scanf(%c,&judge); getchar(); if(judge=y) menu(); else printf(nNow the graph is:); display(); printf(npress any key to quit); getchar(); void guolink() int i; for(i=0;i=3;i+) MAi=A0i; display(); menu(); int filecontrol() /主函数 int i, j=0,p,len=0; char tmp10,com10,tmp110,k; struct command tmp210; FILE *fp; help(); strcpy(,format); /将各个命令存进命令表 strcpy(,dir); strcpy(,cat); strcpy(,ls); strcpy(,md); strcpy(,vi); strcpy(,del); strcpy(,deldir); strcpy(,cd); strcpy(,cd.); strcpy(,help); strcpy(,quit); strcpy(,guo); if(fp=fopen(system,rb)=NULL) /判断系统文件是否存在 printf(can not open filen); printf(format the disk Y / N n); scanf(%c,&k); if(k=y) format(); else read_file(fp); /读取系统文件的内容 while(1) j=0; /必须重新给恢复0否则出错 strcpy(tmp,cur_dir); while(strcmp(tmp,root)!=0) f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东警官学院教师招聘考试参考题库及答案解析
- 2026年丽江文化旅游学院教师招聘考试备考试题及答案解析
- 2026年肇庆学院教师招聘考试参考题库及答案解析
- 2026年零担物流管理方案
- 2026年大连大学教师招聘考试备考试题及答案解析
- 企业质量管理体系评审技术路径方案
- 2026年眉山药科职业学院教师招聘考试备考题库及答案解析
- 2025-2030年轨道交通列控系统行业跨境出海战略分析研究报告
- 2025-2030年手开式太阳伞行业直播电商战略分析研究报告
- 企业内部财务沟通流程优化
- 清洗空调简易合同范本
- 深基坑开挖与支护施工监理实施细则
- (正式版)YBT 6328-2024 冶金工业建构筑物安全运维技术规范
- 【发酵工程】余龙江版-第11章-发酵产物的分离纯化
- 计算机室器材台账
- 人设心理学:用心理学塑造故事人物
- 课件《基础教育课程教学改革深化行动方案》全文解读实用PPT
- 《疫苗管理法》法律法规解读课件
- 中考语文议论文阅读复习-论证思路(过程)教学设计
- 2023年泸州市江阳区小升初英语考试模拟试题及答案解析
- GB/T 2-2016紧固件外螺纹零件末端
评论
0/150
提交评论