模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx

上传人:b****5 文档编号:8348080 上传时间:2023-05-11 格式:DOCX 页数:20 大小:147.05KB
下载 相关 举报
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第1页
第1页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第2页
第2页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第3页
第3页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第4页
第4页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第5页
第5页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第6页
第6页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第7页
第7页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第8页
第8页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第9页
第9页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第10页
第10页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第11页
第11页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第12页
第12页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第13页
第13页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第14页
第14页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第15页
第15页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第16页
第16页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第17页
第17页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第18页
第18页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第19页
第19页 / 共20页
模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx

《模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx》由会员分享,可在线阅读,更多相关《模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx(20页珍藏版)》请在冰点文库上搜索。

模拟实现用位示图法管理文件存储空间的分配与回收Word下载.docx

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2