模拟文件资料存储空间管理系统.docx
《模拟文件资料存储空间管理系统.docx》由会员分享,可在线阅读,更多相关《模拟文件资料存储空间管理系统.docx(12页珍藏版)》请在冰豆网上搜索。
模拟文件资料存储空间管理系统
实验三模拟文件存储空间管理
1.内容:
模拟文件存储空间的管理,采用空白文件目录法和空白块链法实施空间分配。
2.思想:
文件存储空间管理是文件系统的重要内容。
常用的管理思想有空白文件目录法、空白块链法和位示图法。
本实验采用前两种方法进行空间分配。
(1)空白文件目录法进行空间分配时,需要建立相关的数据结构,记录目前空白区域和已使用区域,假设开始时全部区域空闲。
当有文件需要存储时,先检查空白文件目录,找到适合区域立即分配,并修改空白文件目录表和已使用区域分配表。
为此需建立两张表格,分别记录相关数据。
空白文件目录表(初始)
序号
首空白块号
空白快个数
物理块号
备注
1
0
100
0,1,2,……,98,99
空白文件目录(中间)
序号
首空白块号
空白块个数
物理块号
标志
1
2
4
2,3,4,5
未分配
2
9
3
9,10,11
未分配
3
25
5
25,26,27,28,29
未分配
4
39
2
39,40
未分配
5
……
……
……
未分配
文件标识
首块号
文件块个数
状态
备注
beta
0
2
占用
Alpha
6
3
占用
Toyota
12
13
占用
Sony
30
9
占用
Ford
50
4
占用
……
……
……
……
已使用区域表(中间)
上述两张表的数据在系统运行中是发生变化的。
文件空闲区分配和释放算法如下图所示:
图一文件空闲区分配算法
图二文件空闲区回收算法
(2)空白块链法进行空间分配时,需要建立链表数据结构,将空闲块按顺序加以组织,分配和回收时在链首完成,同时建立文件目录,记录文件占用空间情况。
文件标识
首块号
备注
beta
0
Alpha
6
Toyota
12
Sony
30
Ford
50
……
……
3.要求:
(1)自拟模拟数据演示运行结果(假定系统可用空闲块数为100)。
为便于检查,建立和删除文件顺序如下:
分配文件:
F1,3
分配文件:
F2,5
分配文件:
F3,3
分配文件:
F4,8
分配文件:
F5,4
分配文件:
F6,2
删除文件:
F1
删除文件:
F2
分配文件:
F7,6
删除文件:
F3
分配文件:
F8,4
删除文件:
F5
分配文件:
F9,4
……
每完成一个文件的分配和删除后,显示空白文件目录当前内容。
(2)空白文件目录法必须完成,空白块链法选做。
4.书写实验报告:
①实验题目;
②程序中所用的数据结构及说明;
③源程序并附上必要的说明;
④按照文件的创建和删除顺序,打印输出结果。
一、实验步骤
#include
#include
usingnamespacestd;
structAllocatedSpace//已分配内存空间结构体
{
intstart_address;
intlength;
charjob;
structAllocatedSpace*next;
};
structFreeSpace//未分配内存空间结构体
{
intstart_address;
intlength;
structFreeSpace*next;
};
structAllocatedSpace*allocated_header;
structFreeSpace*free_header;
structFreeSpace*freenext;
voidallocatememory()//分配内存函数
{
charjobname;
intjoblength;
intmin,l=0;
cout<<"请输入作业名(一个字母):
\n";
cin>>jobname;
cout<<"请输入作业长度(整数):
\n";
cin>>joblength;
structFreeSpace*w=free_header;
structFreeSpace*p=free_header;//指向第一个可以分配的空闲结点
p=p->next;
structFreeSpace*s=free_header;//指向p的前一个结点
structAllocatedSpace*t=allocated_header;
while(p->length{
p=p->next;
if(p==NULL)
break;
}
if(p==NULL)
cout<<"无法分配!
\n";
else
{
w=p;
min=p->length-joblength;
while(p!
=NULL)//现在p指向当前要被切割的结点
{
if(p->length>joblength)
l=p->length-joblength;
if(l{
w=p;
min=l;
}
p=p->next;
}
structAllocatedSpace*q=newAllocatedSpace;
q->job=jobname;
q->length=joblength;
q->start_address=w->start_address;
while(t->next!
=NULL)
t=t->next;
q->next=t->next;
t->next=q;
while(s->next!
=w)
s=s->next;
if(w->length==q->length)
{
s->next=w->next;
deletew;
}
else
{
w->start_address=w->start_address+q->length;
w->length=w->length-q->length;
}
}
}
voidreclaimmemory()
{
charjobname;
cout<<"请输入要回收的作业名:
\n";
cin>>jobname;
structFreeSpace*p=newstructFreeSpace;//指向当前被创建的空闲结点
structFreeSpace*s=free_header;//指p的前一个结点
structFreeSpace*m=free_header;//指向s的前一个结点
structAllocatedSpace*q=allocated_header;//指向被回收的结点
structAllocatedSpace*t=allocated_header;//指向被回收的结点的前一个结点
while(q->job!
=jobname)//找到被回收的结点
q=q->next;
if(q==NULL)
cout<<"回收错误,要回收的结点不存在!
\n";
else
{
p->length=q->length;
p->start_address=q->start_address;
while(s->start_addressstart_address)
s=s->next;
while(m->next!
=s)
m=m->next;
p->next=s;
m->next=p;
cout<<"回收成功!
\n";
}
while(t->next!
=q)
t=t->next;
t->next=q->next;
deleteq;
s=free_header;
m=free_header;
s=s->next;
m=m->next;
while(m!
=NULL)
{
m=m->next;
if(m==NULL)
break;
if(s->start_address+s->length==m->start_address)
{
s->length=s->length+m->length;
s->next=m->next;
continue;
}
s=s->next;
}
}
voidshowmemory()
{
structFreeSpace*s=free_header;//指向FreeSpace的头结点,开始往后遍历
s=s->next;
structAllocatedSpace*q=allocated_header;//指向AllocatedSpace的头结点,开始往后遍历
q=q->next;
cout<<"已分配区的情况如下:
\n";
while(q!
=NULL)
{
cout<<"作业名:
"<job<<"开始地址:
"<start_address<<"长度:
"<length<q=q->next;
}
cout<<"空闲结点的情况如下:
\n";
while(s!
=NULL)
{
cout<<"开始地址:
"<start_address<<"长度:
"<length<s=s->next;
}
}
intmain()
{
intn;
allocated_header=newstructAllocatedSpace;
free_header=newstructFreeSpace;
freenext=newstructFreeSpace;
freenext->length=100000;
freenext->start_address=0;
freenext->next=NULL;
free_header->next=freenext;
allocated_header->next=NULL;
while
(1)
{
cout<<"请输入您要进行的操作:
0退出1分配内存2回收内存3显示内存状态\n";
cin>>n;
switch(n)
{
case0:
exit(0);
case1:
allocatememory();break;
case2:
reclaimmemory();break;
case3:
showmemory();break;
}
}
}