完整word版模拟实现用位示图法管理文件存储空间的分配与回收Word格式.docx
《完整word版模拟实现用位示图法管理文件存储空间的分配与回收Word格式.docx》由会员分享,可在线阅读,更多相关《完整word版模拟实现用位示图法管理文件存储空间的分配与回收Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
文件存储器上的物理块依次编号为:
0、1、2、…。
定义为一维数组WST[],操作起来更为方便。
下表号与盘块号对应。
在输出的时候控制输出为二维形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┇
位示图
2、申请空间算法
首先要输入文件名和大小,查找与已存在的文件是否重名。
没有,则比较空闲区中空闲块数是否大于欲分配的块数。
有的话分配。
分配的时候该作业要记录下自己所占盘块的其实盘号和所占用的盘快数。
并修改对应盘块的位示图的值。
m=r->
start_location;
//空闲区的起始地址
s->
begin_location=r->
//作业从空闲区的起始地址开始分配
r->
start_location=r->
start_location+s->
office_number;
//改变空闲区空闲块数的起始地址
free_number=r->
free_number-s->
//改变空间区块数的大小
n=(r->
start_location-1);
//新的空间区的起始地址-1
for(i=m;
i<
=n;
i++)//模拟分配
WST[i]=1;
3、回收空间算法
首先输入文件名,查找申请空间作业链表找到该作业。
找到该作业时回收该盘块。
回收时要判断盘块前后的是否为空。
决定回收的盘块来加入哪个空闲区。
(1)if((WST[s->
begin_location-1]==0&
&
WST[s->
begin_location+s->
office_number]==1&
begin_location-1>
=0)||(WST[s->
office_number==256&
=0)){//前面为空盘块区,后面为已分配,并入前面
(2)if((WST[s->
begin_location-1]==1&
office_number]==0&
office_number<
256)||(s->
begin_location==0&
256)){//后面为空盘,并入后面区域
(3)if(WST[s->
=0&
256){//前后都空,合为一个空盘区
(4)if((WST[s->
256)||(WST[s->
=0)||(s->
office_number==256)){//要回收的区域自成一个空盘结点
4.各算法流程图
盘块的分配:
否
是
盘块的回收:
否
五、记录实验结果并分析
1、在dos窗口界面下,我们看到的如下所示,这是程序初始化时出现的界面:
2现在我们对其进行操作:
选择1—分配文件,出现如下界面:
我们不妨设文件名位“caozuoxitong”,并令块数为10,执行,得到如下的界面:
看到从第一行的第一列一直到第一行的第九列共10个盘块均已经被分配,并且令“0”该为“1”,表示盘块已分配。
盘块的分配已经完成,下面是盘块的回收:
选择2—回收文件,出现如下界面:
输入我们刚刚输入的文件名“caozuoxitong”,并回车,界面如下
我们看到从第一行的第一列一直到第一行的第九列已经全部变为“0”了,表示此时盘块已经回收。
按“3”退出。
对于程序中的其他的一些事项,比如盘块不够大;
输入错误;
找不到文件等情况,程序也给予相应的提示,用户在使用时,根据提示会很快改正相关的错误的。
六、实验总结及体会。
在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在老师讲解时就会听不懂,这将使你在做实验时的难度加大,浪费做实验的宝贵时间。
如果你不清楚,在做实验时才去摸索,这将使你极大地浪费时间,使你事倍功半。
做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。
做实验时,老师还会根据自己的亲身体会,将一些课本上没有的知识教给我们,拓宽我们的眼界,使我们认识到这门课程在生活中的应用是那么的广泛。
实验的过程全是我们学生自己动手来完成的,这样,我们就必须要弄懂实验的原理。
在这里我深深体会到哲学上理论对实践的指导作用:
弄懂实验原理,而且体会到了实验的操作能力是靠自己亲自动手,亲自开动脑筋,亲自去请教别人才能得到提高的。
我们做实验绝对不能人云亦云,要有自己的看法,这样我们就要有充分的准备,若是做了也不知道是个什么实验,那么做了也是白做。
七、源程序清单及注释。
#include"
stdio.h"
malloc.h"
windows.h"
string.h"
iostream.h"
intWST[256];
/*************************************
空闲区结构体定义
start_location空闲区对象变量的开始位置
free_number空闲区块数目
next指向下一个空闲区的指针
**************************************/
typedefstructnode{
intstart_location;
intfree_number;
structnode*next;
}free_link;
申请空间作业结构体定义
office[]作业名
begin_location作业申请空间后的开始位置
office_number作业申请空间区的数目
next指向下一个申请空闲区的作业指针
typedefstructlink{
charoffice[20];
intbegin_location;
intoffice_number;
structlink*next;
}office;
/**************************************
相关位示图操作的结构体定义
p空间区链表指针
q作业链表指针
***************************************/
typedefstruct{
free_link*p;
office*q;
}work;
/***************************************
程序菜单
****************************************/
voidmenu(){
printf("
文件的存取和回收\n"
);
1--分配文件\n"
2--回收文件\n"
3--退出\n\t"
请输入选项:
"
}
置空位示图
进行初始化
voidzero_wst(){
inti;
for(i=0;
256;
i++)
WST[i]=0;
/****************************************
位示图输出显示
将初始化或者申请或者回收后的位示图进行显示
*****************************************/
voidprint_wst(intWST[256]){
inti,j=0;
%3s"
"
16;
printf("
%3d"
i);
\n"
0);
i++){
j++;
WST[i]);
if(j%16==0&
i!
j!
=256){
printf("
j/16);
}
}
已经申请空间的作业相关情况输出显示
包括:
作业名
申请空间的开始位置和截至位置
voidprint_office(work*w){
q=w->
q;
q=q->
next;
if(q!
=NULL){
已有文件:
while(q!
\t%s:
%d-%d\n"
q->
office,q->
begin_location,q->
begin_location+q->
office_number-1);
q=q->
位示图操作的初始化
空闲区链表的初始化
作业链表的初始化
work*start(){
work*w;
w=(work*)malloc(sizeof(work));
p=(free_link*)malloc(sizeof(free_link));
p->
start_location=0;
free_number=256;
next=NULL;
q=(office*)malloc(sizeof(office));
q->
w->
p=p;
q=q;
returnw;
申请空间操作
work*request(work*w,intWST[256]){
inti,m,n,flag=0;
free_link*p,*r,*e;
//r->
free_number用于查找空闲区的块数
office*q,*s,*t,*u;
//s创建新节点,存储新建文件的信息,n用于查找是否有重复节点
p=w->
p;
r=p;
t=q;
u=q->
请输入文件名和块数:
"
s=(office*)malloc(sizeof(office));
s->
while(t->
next!
=NULL)
t=t->
scanf("
%s%d"
&
(s->
office),&
office_number));
while(u!
if(strcmp(s->
office,u->
office)==0){
flag=1;
对不起,该文件已存在!
free(s);
break;
u=u->
if(flag==0){
while(r!
if((r->
free_number)>
=(s->
office_number))//用于查找空闲区中空闲块数是否大于欲分配的块数
break;
r=r->
if(r==NULL){
对不起,没有足够的空间分配失败!
else{
t->
next=s;
m=r->
s->
r->
n=(r->
for(i=m;
WST[i]=1;
if(r->
free_number==0){
if(p==r){//p==r说明内存中只有一个整块的空闲区
free(r);
p=NULL;
}
else{
e=p;
while(e!
if(e->
next==r)
break;
e=e->
}
e->
next=r->
}
/*********************************************
回收空间操作
**********************************************/
work*delect(work*w,intWET[]){
charname[20];
free_link*p,*r,*t;
office*q,*s,*e;
t=p;
s=q;
e=q;
s=s->
if(s==NULL){
没有可以回收的文件!
else{
请输入文件名:
cin>
>
name;
while(s!
if(strcmp(s->
office,name)==0)
s=s->
if(s==NULL){
cout<
<
对不起没有找到相关文件!
;
if((WST[s->
=0)
||(WST[s->
=0)){
while(r!
if((r->
start_location+r->
free_number)==s->
begin_location)
break;
r=r->
r->
free_number+s->
s->
WST[s->
256)){
if((s->
office_number)==r->
start_location)
start_location-s->
if(WST[s->
256){
start_location){
t=r;
office_number+t->
free_number;
free(t);
=0
&
256)
||(s->
office_number==256)){
t=(free_link*)malloc(sizeof(free_link));
t->
start_location=s->
begin_location;
free_number=s->
if(r==NULL)
p=t;
if(r!
=NULL&
r->
next==NULL){