1、21map0map1map2map3位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。即map0的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map1的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。313029282726252423222120191817164746454443424140393837363534333263626160595857565554535251504948如上表所示, 29号磁盘的状态存在map1中,对应于第13位;2. 输出初始位示图信息;3. 输入文件分配或释放请求, (1)格式:“+ 文件
2、名 申请块数” 或 “ - 文件名 ” “+”表示申请文件分配,“-”表示删除文件 如: + F1 54. 根据请求完成相应操作。 (1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为“1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR地址或相对磁盘块号记录在文件目录中。输出位示图修改位置、分配的磁盘块CHR地址、修改后的目录和位示图信息。否则,空间不够,退出执行下一条请求; 计算公式如下:a. 已知位示图中的下标i , j, 计算相对块号 Block= i*sizeof( int )*8+j b. 已知相对块号计算柱面、磁道、物理块号如下: 柱面号 C=
3、相对块号/(每柱面磁道数*每磁道物理块数) 磁道号 H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数 物理块号 R= 相对块号%每磁道物理块数 文件目录如下(以索引表分配为例):文件名首个物理块CHR地址块个数索引表beta(0,0,0)(0,0,0)(0,0,1)Alpha(2,3,0)Toyota(4 9 12)(Sony首个物理块地址(相对)(0,2,3)(3,6,7)(8, 9,12)(2)若为删除申请,则从目录中找到要删除的文件所在的目录项,读取索引表,依次读取文件相应的盘块CHR地址, 计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置( i,j),将位示
4、图中的相应位有“1”改为“0”, 并从目录中删除该目录项。输出删除的磁盘块CHR地址、相应位示图修改位置、修改过的位示图和目录。计算过程如下:相对磁盘块号 = 柱面号*每柱面磁道数*每磁道物理块数+ 磁道号*每磁道物理块数+ 物理块号i = 相对磁盘块号/ (sizeof(int)*8)j = 相对磁盘块号% (sizeof(int)*8)5、实验流程图图一 文件空闲区分配算法图二 文件空闲区回收算法6、实验代码#include stdio.h#include conio.hstring.hint physic100; /文件地址缓冲区int style=1; /文件的类型char cur_d
5、ir10=root; /当前目录 struct commandchar com10;cmd13;struct block int n; /空闲的盘快的个数 int free50; /存放空闲盘快的地址 int a; /模拟盘快是否被占用memory20449;struct block_superint n; /存放进入栈中的空闲块 int stack50; /存放下一组空闲盘快的地址super_block;struct node /i结点信息int file_style; /i结点 文件类型 int file_length; /i结点 文件长度 int file_address100; /i结
6、点 文件的物理地址 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; /存放下一组的盘块 640;i+) /i结点信息初始化 for(j=0;j100;j+) i_nodei.file_addressj=-1;
7、/文件地址 i_nodei.file_length=-1; /文件长度 i_nodei.file_style=-1; /文件类型i+) /根目录区信息初始化 strcpy(rooti.file_name,); rooti.i_num=-1; strcpy(rooti.dir_name, for(i=0;20449;i+) /存储空间初始化 memoryi.n=0; /必须有这个 memoryi.a=0; for(j=0; memoryi.freej=-1;i+) /将空闲块的信息用成组链接的方法写进每组的最后一个块中 /存储空间初始化 if(i+1)%50=0) k=i+1; if(k=0;i
8、-) k=physici; /需要提供要回收的文件的地址 m=49-super_block.n; /回收到栈中的哪个位置 if(super_block.n=50) /注意 当super_block.n=50时 m=-1;的值 /super_block.n=50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中 memoryk.freej=super_block.freej; super_block.n=0; memoryk.n=50; memoryk.a=0; if(m=-1) m=49; /将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址的信息 super_blo
9、ck.freem=physici; /将下一个文件地址中的盘块号回收到栈中 super_block.n+;void allot(int length) /分配空间 int i,j,k,m,p;length; k=50-super_block.n; /超级块中表示空闲块的指针 m=super_block.freek; /栈中的相应盘块的地址 p=super_block.free49; /栈中的最后一个盘块指向的地址 if(m=-1|memoryp.a=1) /检测是否还有下一组盘块内存不足,不能够分配空间n callback(length); break; if(super_block.n=1)
10、 memorym.a=1; /将最后一个盘块分配掉 physici=m;memorym.n;j+) /从最后一个盘块中取出下一组盘块号写入栈中 super_block.freej=memorym.freej; /要跳过这次循环,下面的语句在IF中已经执行过 /栈中的相应盘块的地址写进 文件地址缓冲区 super_block.n-;void create_file(char filename,int length) /创建文件 int i,j; if(strcmp(filename,rooti.file_name)=0)文件已经存在,不允许建立重名的文件n return; if(rooti.i_
11、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); i_nodei.file_addressj=physicj;void create_dir(char filename) /创建目录style=0; /0代表文件类型是目录文件 create_file(filename,4); style=1; /用完
12、恢复初值,因为全局变量,否则void del_file(char filename) /删除文件 int i,j,k; if(strcmp(filename,rooti.file_name)=0) k=rooti.i_num;i_nodek.file_length; physicj=i_nodek.file_addressj; callback(i_nodek.file_length); /调用 回收函数j+) /删除文件后要将文件属性和目录项的各个值恢复初值 i_nodek.file_addressj=-1; /地址恢复初值 strcpy(rooti.file_name, /文件名恢复初值
13、/目录项的I结点信息恢复初值 /目录项的文件目录信息恢复初值 i_nodek.file_length=-1; /文件长度恢复 i_nodek.file_style=-1; /文件类型恢复初值 if(i=640)不存在这个文件nvoid del_dir(char filename) /删除目录 需要判断目录下时候为空,不为空就不删除i+) /还要加条件判断要删除的目录是不是当前目录 /找到目录名字 if( strcmp(rooti.file_name,filename)=0 & strcmp(cur_dir,filename)!=0 & (i_nodek.file_style)=0 ) if(s
14、trcmp(filename,rootj.dir_name)=0)目录不为空不能直接删除n if(j=640) del_file(filename);这个不是目录文件 或者不存在这个目录,或者你要删除的是当前目录nvoid display_curdir() /显示当前目录下的文件列表 int i,k;tt文件名字 文件类型 文件长度 所属目录n if(strcmp(cur_dir,rooti.dir_name)=0) /查询文件中 所在目录信息和当前目录信息相同的数据tt %st,rooti.file_name);t%dt,i_nodek.file_style);%dt,i_nodek.fil
15、e_length); /文件的长度%sn,rooti.dir_name);void display_dir(char filename) /进入指定的目录 /判断文件类型是不是目录类型 if(strcmp(filename,rooti.file_name)=0) & (i_nodek.file_style=0) strcpy(cur_dir,filename); /将要进入的指定目录设置为当前目录 赋值不要反了strcpy(目的,源)没有这个目录nvoid open_file(char filename) /打开文件 if(strcmp(filename,rooti.file_name)=0
16、& (i_nodek.file_style=1)tt文件占用的物理地址nj+) /显示物理地址%d ,i_nodek.file_addressj); /文件具体占用的盘块号n没有这个文件 或者这个文件不是正规文件nvoid back_dir() /返回上一级目录i+) /查询和当前目录名相同的目录文件名 if(strcmp(cur_dir,rooti.file_name)=0 & strcpy(cur_dir,rooti.dir_name); /将查询到的目录文件名 所在的目录赋值给当前目录void display_sys() /显示系统信息(磁盘使用情况) int i,m,k=0; if(memoryi.a=0) m=20449-k;空闲的盘块数是:t%dn,k);使用的盘块数是:,m);void help() /显示帮助信息printf(*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1