模拟文件资料存储空间管理系统.docx

上传人:b****3 文档编号:5593967 上传时间:2023-05-08 格式:DOCX 页数:12 大小:171.14KB
下载 相关 举报
模拟文件资料存储空间管理系统.docx_第1页
第1页 / 共12页
模拟文件资料存储空间管理系统.docx_第2页
第2页 / 共12页
模拟文件资料存储空间管理系统.docx_第3页
第3页 / 共12页
模拟文件资料存储空间管理系统.docx_第4页
第4页 / 共12页
模拟文件资料存储空间管理系统.docx_第5页
第5页 / 共12页
模拟文件资料存储空间管理系统.docx_第6页
第6页 / 共12页
模拟文件资料存储空间管理系统.docx_第7页
第7页 / 共12页
模拟文件资料存储空间管理系统.docx_第8页
第8页 / 共12页
模拟文件资料存储空间管理系统.docx_第9页
第9页 / 共12页
模拟文件资料存储空间管理系统.docx_第10页
第10页 / 共12页
模拟文件资料存储空间管理系统.docx_第11页
第11页 / 共12页
模拟文件资料存储空间管理系统.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模拟文件资料存储空间管理系统.docx

《模拟文件资料存储空间管理系统.docx》由会员分享,可在线阅读,更多相关《模拟文件资料存储空间管理系统.docx(12页珍藏版)》请在冰点文库上搜索。

模拟文件资料存储空间管理系统.docx

模拟文件资料存储空间管理系统

实验三模拟文件存储空间管理

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;

}

}

}

 

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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