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

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

实验报告

课程名称操作系统实验名称文件系统存储空间管理模拟专业班级计1001 姓名郭军涛学号201007010108 实验日期2013.06.20 成绩指导教师王潇潇

一、实验内容

1. 模拟文件空间分配、释放过程,可选择连续分配、链式分配、索引分配方法;

2. 文件空闲空间管理,可采用空白块链、空白目录、位示图方法;

二、实验要求及原理

根据提出的文件分配和释放请求,动态显示磁盘空闲空间的状态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。

地址过程;

用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。

当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,

再找到位示图数组中的相应位,将其状态由1变为0。

三、实验步骤

1. 输入磁盘基本信息参数,计算位示图大小,并随机初始化位示图;

(1)磁盘基本信息:磁盘柱面数m, 每柱面磁道数p, 每磁道物理块数q;

(2)假设采用整数数组存放位示图,则数组大小为:

Size= ceil((柱面数*每柱面磁道数*每磁道物理块数)/ (sizeof(int)*8))

(3)申请大小为size的整数数组map,并对其进行随机初始化。

例如:假设m=2, p=4, q=8, 共有64个磁盘块,若sizeof(int)=2, 则位示图大小为4,map[4]如下:

位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。

如上表所示, 29号磁盘的状态存在map[1]中,对应于第13位;

2. 输出初始位示图信息;

3. 输入文件分配或释放请求,

(1)格式:“+ 文件名申请块数”或“ - 文件名”

“+”表示申请文件分配,“-”表示删除文件

如: + F1 5

4. 根据请求完成相应操作。

(1)若为分配申请x个盘块,则在位示图中找到x个为0的位,将其修改为“1”,计算相应具体物理设备的柱面号C、磁道号H和物理块号R,并将CHR地址或相对磁盘块号记录在文件目录中。输出位示图修改位置、分配的磁盘块CHR地址、修改后的目录和位示图信息。否则,空间不够,退出执行下一条请求;

计算公式如下:

a. 已知位示图中的下标i , j, 计算相对块号

Block= i*sizeof( int )*8+j

b. 已知相对块号计算柱面、磁道、物理块号如下:

柱面号 C= 相对块号/(每柱面磁道数*每磁道物理块数)

磁道号 H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数

物理块号 R= 相对块号%每磁道物理块数

文件目录如下(以索引表分配为例):

(2)若为删除申请,则从目录中找到要删除的文件所在的目录项,读取索引表,依次读取文件相应的盘块CHR地址, 计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置( i,j),将位示图中的相应位有“1”改为“0”,并从目录中删除该目录项。输出删除的磁盘块CHR地址、相应位示图修改位置、修改过的位示图和目录。

计算过程如下:

相对磁盘块号 = 柱面号*每柱面磁道数*每磁道物理块数+

磁道号*每磁道物理块数+ 物理块号

i = 相对磁盘块号/ (sizeof(int)*8)

j = 相对磁盘块号% (sizeof(int)*8)

四、源程序代码

#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指向当前要被切割的结点

{

相关文档
最新文档