__模拟文件存储空间管理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

1.内容:模拟文件存储空间的管理,采用空白文件目录法和空白块链法实施空间分配。2.思想:

文件存储空间管理是文件系统的重要内容。常用的管理思想有空白文件目录法、空白块链法和位示图法。本实验采用前两种方法进行空间分配。

(1)空白文件目录法进行空间分配时,需要建立相关的数据结构,记录目前空白区域和已使用区域,假设开始时全部区域空闲。当有文件需要存储时,先检查空白文件目录,找到适合区域立即分配,并修改空白文件目录表和已使用区域分配表。为此需建立两张表格,分别记录相关数据。

空白文件目录表(初始)

空白文件目录(中间)

已使用区域表(中间)

上述两张表的数据在系统运行中是发生变化的。

文件空闲区分配和释放算法如下图所示:

图一文件空闲区分配算法

图二文件空闲区回收算法

(2)空白块链法进行空间分配时,需要建立链表数据结构,将空闲块按顺序加以组织,分配和回收时在链首完成,同时建立文件目录,记录文件占用空间情况。

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

using namespace std;

struct AllocatedSpace //已分配内存空间结构体

{

int start_address;

int length;

char job;

struct AllocatedSpace *next;

};

struct FreeSpace //未分配内存空间结构体

{

int start_address;

int length;

struct FreeSpace *next;

};

struct AllocatedSpace *allocated_header;

struct FreeSpace *free_header;

struct FreeSpace *freenext;

void allocatememory() //分配内存函数

{

char jobname;

int joblength;

int min,l=0;

cout<<"请输入作业名(一个字母):\n";

cin>>jobname;

cout<<"请输入作业长度(整数):\n";

cin>>joblength;

struct FreeSpace *w=free_header;

struct FreeSpace *p=free_header; //指向第一个可以分配的空闲结点p=p->next;

struct FreeSpace *s=free_header; //指向p的前一个结点

struct AllocatedSpace *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;

}

struct AllocatedSpace *q=new AllocatedSpace;

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;

delete w;

}

else

{

w->start_address=w->start_address+q->length;

w->length=w->length-q->length;

}

相关文档
最新文档