__模拟文件存储空间管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }