文件系统存储空间管理模拟实验报告Word文档下载推荐.docx
《文件系统存储空间管理模拟实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《文件系统存储空间管理模拟实验报告Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
14
13
12
11
10
9
8
7
6
5
4
3
2
1
map[0]
map[1]
map[2]
map[3]
位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。
即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。
map[0]
map[1]
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
map[2]
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
map[3]
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
如上表所示,29号磁盘的状态存在map[1]中,对应于第13位;
2.输出初始位示图信息;
3.输入文件分配或释放请求,
(1)格式:
+文件名申请块数”或“-文件名”
+”表示申请文件分配,-”表示删除文件
如:
+F15
4.根据请求完成相应操作。
(1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为
1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR地
址或相对磁盘块号记录在文件目录中。
输出位示图修改位置、分配的磁盘块CHR
地址、修改后的目录和位示图信息。
否则,空间不够,退出执行下一条请求;
计算公式如下:
a.已知位示图中的下标i,j,计算相对块号
Block=i*sizeof(int)*8+j
b.已知相对块号计算柱面、磁道、物理块号如下:
柱面号C=相对块号/(每柱面磁道数*每磁道物理块数)
磁道号H=相对块号%(每柱面磁道数*每磁道物理块数)/每磁道物理块数
物理块号R=相对块号%每磁道物理块数
文件目录如下(以索引表分配为例):
文件名
首个物理块CHR
块个数
索引表
beta
地址
(0,0,0)
(0,0,0)(0,0,1)
Alpha
(2,3,0)
Toyota
(4912)…
Sony
(
首个物理块地址
\,
(相对)
(0,2,3)…
(3,6,7)…
(8,9,12)…
(2)若为删除申请,则从目录中找到要删除的文件所在的目录项,读取索引表,依次读
取文件相应的盘块CHR地址,计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置(i,j),将位示图中的相应位有“1”改为0”,并从目录中删除该目录项。
输出删除的磁盘块CHR地址、相应位示图修改位置、修改过的位示图
和目录。
计算过程如下:
相对磁盘块号=柱面号*每柱面磁道数*每磁道物理块数+磁道号*每磁道物理块数+物理块号
i=相对磁盘块号/(sizeof(int)*8)
j=相对磁盘块号%(sizeof(int)*8)
五、实验流程图
f=f+l
▼
文flS-File存入系统'
S-File为支件名*M为申请块数
T
置空白区号f=l
N
诫后一个空口
坯次无法分配
区号
Y
保存空白区.首块号
理
空白匿f
<
的块数PM
*修改空闲目录表前首块号和块数
图一文件空闲区分配算法
円+1
请求剧除一牛文件释放空剧
齊卒白文件冃录表
丿崔屮块塹丿栏申當块吕=F
*r*
u
u+i)rd-ny?
'
仅有H邻
Fg中首块号+
j栏空白块牡十】
¥
有上郛
有上邻也有下郭
yE空口块數+日
空白文件中增加一豪H
0T块号寸
空甲块融-样
丿栏中首決号不变
/拦中寺白块曾+7+1)拦中
空向块ITT
丽陳/+[栏杀目
图二文件空闲区回收算法
六、实验代码
#include"
stdio.h"
#include<
stdlib.h>
#inelude<
conio.h>
string.h>
intphysic[100];
//文件地址缓冲区
intstyle=1;
//文件的类型
charcur_dir[10]="
root"
;
//当前目录structcommand
{charcom[10];
}cmd[13];
structblock
{intn;
//空闲的盘快的个数
intfree[50];
//存放空闲盘快的地址
inta;
//模拟盘快是否被占用
}memory[20449];
structblock_super
{intn;
//存放进入栈中的空闲块
intstack[50];
//存放下一组空闲盘快的地址
}super_block;
structnode//i结点信息
{intfile_style;
//i结点文件类型
intfile_length;
//i结点文件长度
intfile_address[100];
//i结点文件的物理地址
}i_node[640];
structdir//目录项信息
{charfile_name[10];
//文件名
inti_num;
//文件的结点号
chardir_name[10];
//文件所在的目录
}root[640];
voidformat。
//格式化
{inti,j,k;
super_block.n=50;
for(i=6i<
50;
i++)//超级块初始化
{super_block.free[i]=i;
super_block.stack[i]=50+i;
//存放下一组的盘块
}-
for(i=0;
i<
640;
i++)//i结点信息初始化
{for(j=0;
j<
100;
j++)
{i_node[i].file_address[j]=-1;
//文件地址
}--
i_node[i].file_length=-1;
//文件长度i_node[i].file_style=-1;
//文件类型
i++)//根目录区信息初始化
{strcpy(root[i].file_name,"
"
);
root[i].i_num=-1;
strcpy(root[i].dir_name,"
}-
20449;
i++)//存储空间初始化
{memory"
].n=0;
//必须有这个
memory[i].a=0;
for(j=0;
{memory[i].free[j]=-1;
}
i++)//将空闲块的信息用成组链接的方法写进每组的最后一个块中
{//存储空间初始化
if((i+1)%50==0)
{k=i+1;
{if(k<
20450)
{memory[i].free[j]=k;
〃下一组空闲地址
memory"
].n++;
//下一组空闲个数注意在memory"
].n++之前要给其赋初值
k++;
else
//标记为没有使用
continue;
//处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环
memory[i].n=0;
printf(”已经初始化完毕\n”);
printf(”进入UNIX文件模拟\n\n"
voidwrite_file(FILE*fp)//将信息读入系统文件中
{inti;
fp=fopen("
system"
"
wb"
i++)
{fwrite(&
memory[i],sizeof(structblock),1,fp);
fwrite(&
super_block,sizeof(structblock_super),1,fp);
{write(&
i_node[i],sizeof(structnode),1,fp);
i