ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:109.24KB ,
资源ID:6223529      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6223529.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(文件系统存储空间管理模拟实验报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

文件系统存储空间管理模拟实验报告.docx

1、文件系统存储空间管理模拟实验报告课程名称 计算机操作系统 实验名称 文件系统存储空间管理模拟 姓 名 学 号 专业班级 实验日期 成 绩 指导老师 1、实验目的 根据提出的文件分配和释放请求,动态显示磁盘空闲空间的态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。2、实验原理 用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。当释放某

2、一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。3、主要仪器设备 PC机(含有VC)4、实验内容与步骤实验内容:1. 模拟文件空间分配、释放过程,可选择连续分配、链式分配、 索引分配方法;2. 文件空闲空间管理,可采用空白块链、空白目录、位示图方法;步骤如下:1. 输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图;(1)磁盘基本信息:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q;(2)假设采用整数数组存放位示图,则数组大小为:Size= ceil(柱面数*每柱面磁道数*每磁道物理块数)/(sizeof(int)*8) (3

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号磁盘

4、块的状态,以此类推。1514131211109876543210map01514131211109876543210map131302928272625242322212019181716map247464544434241403938373635343332map363626160595857565554535251504948如上表所示, 29号磁盘的状态存在map1中,对应于第13位;2. 输出初始位示图信息;3. 输入文件分配或释放请求, (1)格式:“+ 文件名 申请块数” 或 “ - 文件名 ” “+”表示申请文件分配,“-”表示删除文件 如: + F1 54. 根据请求完成相应操

5、作。 (1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为“1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR地址或相对磁盘块号记录在文件目录中。输出位示图修改位置、分配的磁盘块CHR地址、修改后的目录和位示图信息。否则,空间不够,退出执行下一条请求; 计算公式如下:a. 已知位示图中的下标i , j, 计算相对块号 Block= i*sizeof( int )*8+j b. 已知相对块号计算柱面、磁道、物理块号如下: 柱面号 C= 相对块号/(每柱面磁道数*每磁道物理块数) 磁道号 H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数 物理块

6、号 R= 相对块号%每磁道物理块数 文件目录如下(以索引表分配为例):文件名首个物理块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”, 并从目录中

7、删除该目录项。输出删除的磁盘块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; /当前目录 s

8、truct 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;

9、 /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+)

10、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+) /

11、将空闲块的信息用成组链接的方法写进每组的最后一个块中 /存储空间初始化 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(已经初始化完

12、毕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,

13、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

14、; /需要提供要回收的文件的地址 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

15、_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)

16、; 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 filena

17、me,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

18、=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=root

19、i.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_no

20、dek.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_nod

21、ek.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(strc

22、mp(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.

23、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(str

24、cmp(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_ad

25、dressj); /文件具体占用的盘块号 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(*

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1