实验三 虚拟文件管理.docx
- 文档编号:15208577
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:14
- 大小:56.32KB
实验三 虚拟文件管理.docx
《实验三 虚拟文件管理.docx》由会员分享,可在线阅读,更多相关《实验三 虚拟文件管理.docx(14页珍藏版)》请在冰点文库上搜索。
实验三虚拟文件管理
实验三文件管理
模拟文件存储空间管理
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
……
……
4.书写实验报告:
数据结构:
使用了链表作为数据结构,创建一条有一百个节点的链表,链表中定义了文件的名称,标识符等等信息,在添加文件或者删除文件时只需要对其中的标识进行操作就可以达到模拟文件增删的目的。
源代码:
#include
#include
#include
#include
#defineLENsizeof(black)
typedefstruct_black
{
charname[10];
intflag;
charflag1[10];
struct_black*next;
}black;
black*create()
{
black*head=NULL;
black*p1,*p2;
inti;
p1=p2=(black*)malloc(LEN);
for(i=0;i<100;i++)
{
if(head==NULL)
{
p1->flag=0;
strcpy(p1->name,"");
head=p1;
head->next=NULL;
}
else
{
p1->flag=0;
strcpy(p1->name,"");
p2->next=p1;
p2=p1;
}
p1=(black*)malloc(LEN);
}
p2->next=NULL;
free(p1);
p1=NULL;
returnhead;
}
voidshowList(black*head)
{
black*p=head;
inti=0,j=0;
intcount=1;
printf("序号\t首空白块号\t空白块个数\t物理块号\t标志\n");
while(p!
=NULL)
{
j++;
if(p->flag==0)
{
i++;
}
if(p->flag==0&&p->next==NULL)
{
printf("%d\t%d\t%d\t%d到%d\t未分配\n",count,j-i,i,j-i,j-1);
count++;
i=0;
}
elseif(p->flag==0&&p->next->flag==1)
{
printf("%d\t%d\t%d\t%d到%d\t未分配\n",count,j-i,i,j-i,j-1);
count++;
i=0;
}
p=p->next;
}
printf("\n");
p=head;
i=j=0;
printf("文件\t首块号\t文件块个数\t物理块号\t备注\n");
while(p!
=NULL)
{
j++;
if(p->flag==1)
{
i++;
}
if(p->flag==1&&p->next==NULL)
{
printf("%s\t%d\t%d\t%d到%d\t%s\n",p->name,j-i,i,j-i,j-1,p->flag1);
i=0;
}
elseif(p->flag==1&&strcmp(p->name,p->next->name)!
=0)
{
printf("%s\t%d\t%d\t%d到%d\t%s\n",p->name,j-i,i,j-i,j-1,p->flag1);
i=0;
}
p=p->next;
}
printf("\n");
}
black*add(black*head,intstrat,intend,charname[10])
{
black*p=head;
inti=0,j=0;
intm=0,n=0;
if(strat>end)
{
printf("文件添加失败!
\n");
returnhead;
}
for(m=0;m { p=p->next; } for(m=strat;m<=end;m++) { if(p->flag==1) { printf("文件添加失败! 空间已经被占用! \n"); returnhead; } p=p->next; } p=head; m=n=0; while(p! =NULL) { if(i>=strat) { strcpy(p->name,name); p->flag=1; strcpy(p->flag1,"占用"); } if(j==end) { break; } i++; j++; p=p->next; } printf("添加成功! \n"); returnhead; } black*dele(black*head,intstrat,intend) { black*p=head; inti=0,j=0; if(strat>end) { printf("文件删除失败! \n"); returnhead; } for(i=0;i { p=p->next; } for(i=strat;i { if(p->flag==0) { j++; } p=p->next; } if(j==end-strat) { printf("文件删除失败! 空间未被占用,无文件! \n"); returnhead; } p=head; i=j=0; while(p! =NULL) { if(i>=strat) { p->flag=0; strcpy(p->name,""); strcpy(p->flag1,"未占用"); } if(j==end) { break; } i++; j++; p=p->next; } printf("删除成功! \n"); returnhead; } voidoutput() { printf("请选择操作: "); printf("添加文件 (1): "); printf("删除文件 (2): "); } black*junge(black*head,intchose) { switch(chose) { case1: { intstrat,end; charname[10]=""; fflush(stdin); printf("请输入文件名: "); gets(name); fflush(stdin); printf("请输入文件首尾块号: "); scanf("%d%d",&strat,&end); head=add(head,strat,end,name); } break; case2: { intstrat,end; fflush(stdin); printf("请输入文件首尾块号: "); scanf("%d%d",&strat,&end); head=dele(head,strat,end); } break; default: break; } returnhead; } intmain() { black*head=NULL; intchose; head=create(); while (1) { showList(head); output(); fflush(stdin); scanf("%d",&chose); head=junge(head,chose); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 虚拟文件管理 实验 虚拟 文件 管理