搜档网
当前位置:搜档网 › 文件系统存储空间管理模拟

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

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

实验报告

课程名称操作系统实验名称文件系统存储空间管理模拟专业班级计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指向当前要被切割的结点

{

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;

}

}

}

void reclaimmemory()

{

char jobname;

cout<<"请输入要回收的作业名:\n";

cin>>jobname;

struct FreeSpace *p=new struct FreeSpace;//指向当前被创建的空闲结点struct FreeSpace *s=free_header;//指p的前一个结点

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

struct AllocatedSpace *q=allocated_header;//指向被回收的结点

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

delete q;

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;

}

}

void showmemory()

{

struct FreeSpace *s=free_header;//指向FreeSpace的头结点,开始往后遍历

s=s->next;

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

}

}

int main()

{

int n;

allocated_header=new struct AllocatedSpace;

free_header=new struct FreeSpace;

freenext=new struct FreeSpace;

freenext->length=100000;

freenext->start_address=0;

freenext->next=NULL;

free_header->next=freenext;

allocated_header->next=NULL;

while(1)

{

cout<<"

**********************************************************************\n";

cout<<" 请输入您要进行的操作:0退出1分配内存2 回收内存3 显示内存状态\n";

cout<<"

**********************************************************************\n";

cin>>n;

switch(n)

{

case 0:exit(0);

case 1:allocatememory();break;

case 2:reclaimmemory();break;

case 3:showmemory();break;

}

}

}

五、实验结果(截图)

文件管理习题集与答案解析

第七章 一.选择题 1.FAT能描述文件的_B__特征。 A.文件逻辑 B.文件物理结构 C.文件共享 D.文件保护 2.文件的符号名与物理地址的转换是通过_C__来实现的。 A.索引 B.索引节点 C.文件目录 D.二级索引 3.在UNIX文件系统中,为了对磁盘空间的空闲块进行有效的管理,采用的方法是_B__。 A.空闲表 B.成组链接法 C.FAT D.位示图法 4.为了实现对文件的共享访问,在读写文件时需对文件加锁。现在已有一个用户对某文件进行了读加锁,则另一个用户对该文件的_B__加锁操作可以成功。 A.加读锁和写锁均不能成功 B.加读锁能成功 C. 加读锁和写锁均能成功 D. 加写锁能成功 5.操作系统实现文件管理后,允许用户对流式文件进行存取的最小单位是___D__。 A.数据项 B.记录 C.文件 D.字符 6. 操作系统采用多级目录结构可以__A__。 A.解决命令冲突 B.节省存储空间 C.缩短文件传送时间 D.减少系统开销 7.下述有关文件管理的叙述中,_C__是正确的。 A.一个文件不能同时多次建立 B.在一级目录结构中,不同用户可以用相同的文件名

C.文件系统主要是实现按名存取 D.逻辑记录的大小与存储介质块的大小必须一一对应 8.文件系统是指___D__。 A.文件的集合 B.实现文件管理的一组软件 C.文件的目录 D.文件及其属性、管理文件的软件和文件系统接口 9.文件系统的主要目的是__A__。 A.实现对文件的按名存取 B.实现虚拟存储 C.提高外存的读写速度 D.用于存储系统文件 10.操作系统实现文件管理后,用户对记录式文件进行存取的最小单位是_C__。 A.扇区 B.字节 C.目录 D.记录 11.为了解决不同用户文件的“命名冲突”问题,通常在文件系统中采用以下_B__方法。 A.约定的方法 B.多级目录 C.路径 D.索引 12.文件的绝对路径是指_C__。 A.文件名和文件扩展名 B.一系列的目录文件名和该文件的文件名 C.从根上到该文件所经历的路径中各符号名的集合 D.目录文件名和文件名的集合 13.文件的相对路径名从__A__开始,逐步沿着各级子目录追溯,最后到指定文件的整个路径上所有子目录名组成的一个字符串。 A.当前目录 B.根目录 C.多级目录 D.二级目录 14.对一个文件的访问,常由以下__A__共同控制。

操作系统模拟文件管理

操作系统课程设计报告 模拟文件管理 目) 院系:计算机科学技术学院计算机科学与技术系班级:计07--2 班 姓名:刘德庆 学号:12 指导教师:鲁静轩 2009 年6 月15 日

操作系统课程设计任务书 一、设计题目:模拟文件管理 二、设计目的 《操作系统原理》课程设计是软件工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。 三、设计要求 (1)选择课程设计题目中的一个课题,合作完成。 (2)良好的沟通和合作能力 (3)充分运用前序课所学的软件工程、程序设计等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实 四、设计内容及步骤 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。 2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。

6.编写课程设计报告; 设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容 五、课程设计工作计划 设计在学期的第15、16周进行,时间安排如下: 序号内容时间(天) 1 预习、讲课 1 2 设计 3 3 编码、测试 5 4 验收 1 合计10 。 六、成绩评定办法 成绩分为优(A)、良(B)、中(C)、及格(D)、不及格(E)五个等级。其中设计表现占30%,验收40%,设计报告占30%。 1.设计表现:教师可依据学生使用实验环境的能力、观察和分析实验现象的能力、实验结果和数据的正确性以及学生的课堂纪律、实验态度、保持实验室卫生等方面的表现进行综合考核。 2.验收:要求学生演示设计的程序,讲解设计思路、方法、解决的主要问题,教师根据具体情况向每个学生提问2至3个问题。 3.设计报告:学生设计后应按时完成设计报告。要求:内容充实、写作规范、项目填写正确完整、书面整洁等。

操作系统文件管理实验报告

操作系统实验报告实验名称:文件管理 专业班级:网络工程1301 学号: 姓名: 2015 年6 月16 日

实验一文件管理 一、实验目的 文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、预备知识 1.VS2010的使用 2.C#的学习 3.文件主目录与子目录的理解 三、实验容与步骤 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 程序流程图:

逻辑设计: 使用线性数组表表示MFD,泛型数组表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。 物理设计: //主目录 private FileUser[] mfd; //当前用户 private FileUser currentuser; ///

/// 文件 /// public class FileObject { public string filename; public int size=20; public int read=0; public int write = 0; public string author; } /// /// 文件系统用户 /// public class FileUser { public string username;

实验 文件管理(二)

实验六:文件系统 一、目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、例题: ①设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 ②程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 ③为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 ④算法与框图: a、因系统小,文件目录的检索使用了简单的线性搜索。 b、文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。 c、程序中使用的主要设计结构如下: Ⅰ、主文件目录和用户文件目录(MFD、UFD) Ⅱ、打开文件目录(AFD)(即运行文件目录)

三、调度算法的流程图 四、文件管理源程序 #include<> #include<> #include<> #include<> typedef struct ufd { char filename[10];/*文件名*/ char procode[8];/*属性*/

int length;/*文件长度*/ struct ufd *nextfile;/*指向下一个文件*/ }UFD; typedef struct mfd { char username[10];/*用户名*/ struct ufd *link;/*指向该用户的第一个文件*/ }MFD; typedef struct protected_flag { char code[4]; }PRO; typedef struct afd/*运行文件目录*/ { char filename[10];/*打开文件名*/ char procode[4]; int rwpointer;/*读写指针*/ }AFD; PRO flag[3]={"100",/*只读*/ "110",/*读写*/ "001"/*可执行*/ }; UFD *rw_pointer;/*读写指针*/ AFD *afd=NULL; MFD filesystem[10]; int num;/*当前用户个数*/ void displayallfile() { int i; UFD *p; for(i=0;ifilename); printf("文件属性: %s\t||",p->procode); printf("文件长度: %d\n\n",p->length); p=p->nextfile; } }

模拟文件系统的设计与实现

中北大学 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:xxx 学号:xxx 设计题目:模拟文件系统的设计与实现 起迄日期: 2015年12月28日- 2016年1月8 日 指导教师:xxx

2016 年1月8日 1需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 2总体设计 结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。 文件的创建:create 文件关闭:close 文件的打开:open 文件的读:read 文件的写:write 文件关闭:close 删除文件:delete 创建子目录:mkdir 删除子目录:rmdir 列出文件目录:dir 退出:exit 系统执行流程图

3.详细设计 主要数据结构: #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M

#define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号#define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小 #define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5 //最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名8位*/

操作系统原理与应用第2章文件管理

第2章文件管理习题解答 1.什么是文件和文件系统?文件系统有哪些功能? 【解答】文件是具有符号名而且在逻辑上具有完整意义的信息项的有序序列。 文件系统是指操作系统系统中实现对文件的组织、管理和存取的一组系统程序,它实现对文件的共享和保护,方便用户“按名存取”。 文件系统的功能“ (1)文件及目录的管理。如打开、关闭、读、写等。 (2)提供有关文件自身的服务。如文件共享机制、文件的安全性等。 (3)文件存储空间的管理。如分配和释放。主要针对可改写的外存如磁盘。(4)提供用户接口。为方便用户使用文件系统所提供的服务,称为接口。文件系统通常向用户提供两种类型的接口:命令接口和程序接口。不同的操作系统提供不同类型的接口,不同的应用程序往往使用不同的接口。 2.Linux文件可以根据什么分类?可以分为哪几类?各有什么特点? 【解答】在Linux操作系统中,文件可以根据内部结构和处理方式进行分类。 在Linux操作系统中,可以将文件分为普通文件、目录文件、特别文件三类。 各类文件的特点是: 普通文件:由表示程序、数据或正文的字符串构成的文件,内部没有固定的结构。这种文件既可以是系统文件,也可以是库文件或用户文件。 目录文件:由文件目录构成的一类文件。对它的处理(读、写、执行)在形式上与普通文件相同。 特别文件:特指各种外部设备,为了便于管理,把所有的输入/输出设备都按文件格式供用户使用。这类文件对于查找目录、存取权限验证等的处理与普通文件相似,而其他部分的处理要针对设备特性要求做相应的特殊处理。 应该指出,按不同的分类方式就有不同的文件系统。 3.什么是文件的逻辑结构?什么是文件的物理结构?Linux文件系统分别采用什么样的结构?有什么优点和缺点? 【解答】文件的逻辑结构:用户对文件的观察的使用是从自身处理文件中数据时采用的组织方式来看待文件组织形式。这种从用户观点出发所见到的文件组织方式称为文件的逻辑组织。 文件的物理结构:从系统的角度考察文件在实际存储设备上的存放形式,又称为文件的存储结构。 在Linux系统中,所有文件的逻辑结构都被看作是流式文件,系统不对文件进行格式处理。 在Linux系统中,文件的物理结构采用的是混合多重索引结构,即将文件所占用盘块的盘块号,直接或间接地存放在该文件索引结点的地址项中。 在Linux系统中,采用混合索引结构的优点是,对于小文件,访问速度快;对于大中

操作系统文件管理系统模拟实验

文件管理系统模拟 1.实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 3.实验提示 (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 4.源代码 #include #include #include #define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024 //磁盘块数目1K #define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT 表大小

#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct) //根目录大小#define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5 //最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KB struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位0 空闲*/ }; struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名8位*/ char property; /*属性1位目录0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录0不是根目录*/ }directitem[MSD+2]; }; struct opentable { struct openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ }openitem[MOFN]; int cur_size; /*当前打文件的数目*/ }; struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/ struct direct *cur_dir; /*当前目录*/ struct opentable u_opentable; /*文件打开表*/ int fd=-1; /*文件打开表的

模拟简单二级文件管理系统

操作系统课程设计 模拟简单二级文件管理系统 姓名:王馨萍 学号: 系别:计算机学院 专业:网络工程 年级:16级 指导教师: 2019年05 月11 日

一、课程设计项目介绍(含项目介绍及设计目的) 1、设计目的: 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 2、项目介绍: 为LINUX 设计一个简单的二级文件系统。本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的内存空间,然后对该内存空间进行分配。将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入内存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。)本项目通过VC编写简单的二级文件系统的代码,实现文件管理方式,使用者只需要给出相应的文件操作命令就可以分别得到各类文件操作的相应,并且可以选择登陆或注销不同用户。

二、总体设计(含系统的总体结构、原理框图或各模块介绍等) 1、系统总体结构图:

2、模块介绍 (1)、主函数部分:在主函数系统接受输入信息,包括登陆用户和注册用户,登陆完成后选择相应的文件操作,可以选择创建目录、浏览目录、修改目录、创建文件等操作,如果选择错误就会出现相应的提示信息。 (2)、命令解释层函数:在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。 (3)、文件系统格式化函数:该函数首先建立文件,申请空间,在设置成功时将其空间写入filesystem.dat,使filesystem.dat为1M。接着设置磁盘i节点缓冲区,DIEMPTY表示空闲,设计成第1盘块存储用户名表,第2盘块用于存储根目录,第3盘块用于根目录下的子目录。 (4)、空闲盘块分配、回收函数:首先排除磁盘已满,无空闲盘块,或者已经是栈底的情况,接着设置栈指针下移一位,则空闲盘块少1。如果是空闲盘块堆栈已满状态,则把空闲盘块数据写入缓冲区,栈指针指向栈底,缓冲区内容写入新回收的盘块。最后是回收盘块,回收完毕后空闲盘块多1。 (5)、节点分配和释放函数:若没有空闲磁盘i节点,则显示相应提示信息;若空闲磁盘i节点栈空,则分为空闲磁盘i节点数可装满空闲i节点栈和剩下的空闲磁盘i节点不能装满栈区两种情况来考虑。接着初始化磁盘i节点、分配内存i节点,并从磁盘i节点读取数据到内存i节点。

文件系统存储空间管理模拟实验报告

课程名称计算机操作系统实验名称文件系统存储空间管理模拟姓名学号 专业班级实验日期 成绩指导老师 一、实验目的 根据提出的文件分配和释放请求,动态显示磁盘空闲空间的 态以及文件目录的变化,以位示图和索引分配为例:每次执行请求后要求显示或打印位示图的修改位置、分配和回收磁盘的物理块地址、更新的位示图、目录。 二、实验原理 用数组表示位示图,其中的每一位对应磁盘一个物理块的状态,0表示、空闲,1表示分配;当请求分配一个磁盘块时,寻找到数组中为0的位,计算相对磁盘块号,并计算其在磁盘中的物理地址(柱面号、磁道号、物理块号),并将其状态由0变到1。当释放某一物理块时,已知其在磁盘中的物理地址,计算其相对磁盘块号,再找到位示图数组中的相应位,将其状态由1变为0。 三、主要仪器设备 PC机(含有VC) 四、实验容与步骤 实验容:1. 模拟文件空间分配、释放过程,可选择连续分配、链式分配、索引分配法;2. 文件空闲空间管理,可采用空白块链、空白目录、位示图法; 步骤如下: 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号磁盘块的状

模拟一个简单二级文件管理系统

模拟一个简单二级文件管理系统 设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 设计内容:模拟一个简单二级文件管理系统 一、实验内容描述 1 实验目标 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现. 2 实验要求 为DOS系统设计一个简单的二级文件系统.要求做到以下几点: ①可以实现下列命令: login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 ②列目录时要列出文件名、物理地址、保护码和文件长度. ③源文件可以进行读写保护. 二、程序主要内容 1设计思路 程序中要求每个用户在登陆后才可对其拥有的文件进行操作,用户对于其他用户的文件无操作权.文件操作包括浏览、创建、删除、打开、关闭、阅读、写入、修改模式.其他操作包括新建用户、帮助、用户登入、用户登出、退出系统. 在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“mfd”的文件,记录所有注册过的帐号及密码;用户文件,以用户名作为文件名,内容为其拥有的文件名及属性;一个名为“keiji”的文件夹.“keiji”文件夹中包括:“”指针文件,记录所有已用的物理地址;一些以物理地址为名的文件,内容为文件内容. 2 数据结构 file结构体系统文件数据结构: fpaddrint,文件的物理地址、flengthint,文件长度、fmodeint,文件模式 0.只读;1.可写;2.可读写;3.保护、 fname[]char,文件名; filemode结构体文件状态数据结构: isopenint,文件当前状态,0.关闭;1.打开、modeint,文件模式 0.只读;1.可写;2.可

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

实验报告 课程名称操作系统实验名称文件系统存储空间管理模拟专业班级计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]如下:

计算机操作系统实验-文件管理

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 班级:实验学院一班 学号:6040310110 姓名:张元竞 设计成绩报告成绩指导老师

一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

模拟实现unix文件管理系统

摘要 计算机发展到今天,从个人计算机到巨型计算机系统,毫无例外都配置一种或是多种操作系统。操作系统管理和控制计算机系统中的所有硬、软件资源,合理地组织计算机工作流程,并且为用户提供一个良好的工作环境和友好的接口。 在计算机操作系统的功能中,对文件存储设备的管理是一项非常重要的任务,文件在存储器上按一定的顺序有组织地存放,使得用户访问高效,操作方便。 UNIX文件系统采用SFD和BFD方式管理文件:SFD称为符号文文件目录,存放文件名以及致使该文件说明信息表标识符ID;把存放文件说明信息和相应标识符的BFD称为i节点。UNIX文件系统将存储设备分为引导块、超级快、i节点区、目录和数据区四个存储区。引导块主要是为了存储引导系统启动的数据;超级块描述文件系统的状态,包括磁盘空闲块栈,空闲i结点栈;i节点区存放文件说明信息,每项32字节;目录和数据每个目录项16字节,文件名区分大小写。 在界面上我们使用MFC可视化设计,将实现的代码加载到MFC界面中,在响应鼠标消息的函数中调用实现模拟系统设计的代码,这样最后的操作是在Windows界面的操作,响应鼠标的命令。界面美好,操作方便。 关键词:操作系统,文件系统,UNIX文件系统模拟

摘要 目录 1. 概述 (6) 2. 课程设计任务及要求 (6) 2.1 设计任务 (6) 2.2 设计要求 (7) 3. 算法及数据结构 (7) 3.1算法的总体思想(流程) (8) 3.2 i节点模块 (8) 3.2.1功能 3.2.2 数据结构 3.2.3算法 3.3 装入和退出系统模块 (11) 3.3.1功能 3.3.2算法 3.4用户登录注销模块 (14) 3.4.1 功能 3.4.2 数据结构及流程图 3.4.3 算法 3.5 目录管理模块 (16) 3.5.1功能 3.5.2 数据结构及流程图

文件管理习题及答案

一.选择题 1.FAT 能描述文件的_B__特征。 A.文件逻辑 B.文件物理结构 C.文件共享 D.文件保护 2.文件的符号名与物理地址的转换是通过_C__来实现的。 A.索引 B.索引节点 C.文件目录 D.二级索引 3.在UNIX 文件系统中,为了对磁盘空间的空闲块进行有效的管理,采用的方法是_B__。 A.空闲表 B.成组链接法 C.FAT D.位示图法 4.为了实现对文件的共享访问,在读写文件时需对文件加锁。现在已有一个用户 对某文件进行了读加锁,则另一个用户对该文件的_B__加锁操作可以成功。 A.加读锁和写锁均不能成功 B.加读锁能成功 C. 加读锁和写锁均能成功 D. 加写锁能成功 5.操作系统实现文件管理后,允许用户对流式文件进行存取的最小单位是___D__。 A.数据项 B.记录 C.文件 D.字符 6.操作系统采用多级目录结构可以__A__ 。 A.解决命令冲突 B.节省存储空间 C.缩短文件传送时间 D.减少系统开销 7.下述有关文件管理的叙述中,_C__是正确的。 A.—个文件不能同时多次建立 B.在一级目录结构中,不同用户可以用相同的文件名 C.文件系统主要是实现按名存取 D.逻辑记录的大小与存储介质块的大小必须一一对应

8.文件系统是指___D__。 A.文件的集合 B.实现文件管理的一组软件 C.文件的目录 D.文件及其属性、管理文件的软件和文件系统接口 9.文件系统的主要目的是__A__。 A.实现对文件的按名存取 B.实现虚拟存储 C.提高外存的读写速度 D.用于存储系统文件 10.操作系统实现文件管理后,用户对记录式文件进行存取的最小单位是_C__。 A.扇区 B.字节 C.目录 D.记录 11.为了解决不同用户文件的“命名冲突” 问题,通常在文件系统中采用以下_B 方法。 A.约定的方法 B.多级目录C路径D.索引 12.文件的绝对路径是指_C__。 A.文件名和文件扩展名 B.—系列的目录文件名和该文件的文件名 C.从根上到该文件所经历的路径中各符号名的集合 D.目录文件名和文件名的集合 13.文件的相对路径名从__A__开始,逐步沿着各级子目录追溯,最后到指定文件的整个路径上所有子目录名组成的一个字符串。 A.当前目录 B.根目录C多级目录 D. 二级目录 14.对一个文件的访问,常由以下__A__ 共同控制。 A.用户的访问权限和文件属性 B用户的访问权限和用户的优先级 C.优先级和文件属性

模拟磁盘文件管理系统.

模拟磁盘文件管理系统 一、任务描述 模拟实现一个文件管理系统 开发语言:C++、C语言、java 开发工具:自选 要求 1、可以实现一下命令(以下命令至少实现5条): ●login 用户登录 ●dir 列文件目录 ●create 创建文件 ●delete 删除文件 ●open 打开文件 ●close 关闭文件 ●cd 改变目录 ●mkdir 创建目录 ●rddir 删除目录 ●halt 退出系统 2、列目录要求列出文件名、物理地址、文件大小、读写标识 二、任务完成情况 ⑴自定义磁盘文件管理的数据结构;

⑵能够自由创建、修改、删除文件; ⑶文件具有一定自定义的属性; ⑷能够显示当前系统文件的状态; (5)能够完成任务后退出系统。 三、系统流程图与函数调用关系 1、类和主要函数 程序中定义了两个类: (1)class file //文件类 主要功能是对文件属性的定义,文件在虚拟磁盘地址块的定位。 (2)class fdatabase //文件操作类 主要功能是对创建、删除、修改等方法的具体实现。 程序中的主要函数及说明: char *getname( ) //获取文件名 int gettag( ) //获取删除标记 int getlength() //获取文件大小 int getblocknum() // 磁盘块数 int getblocksum1() //磁盘块号的始点 int getblocksum2() //磁盘块号的终点 void setname(char na[ ] )//设置文件名 void delwenjian() { tag=1; } //设置删除标记 1:已删 0:未删 void creatfile(char *na,int L,int num,int s1,int s2) //创建文件 void deltefile(char *na) {tag=1; strcpy(name,na);} //删除文件 void disp( ) //输出文件信息

操作系统文件管理系统模拟实验

操作系统文件管理系统模拟实验 文件管理系统模拟 1.实验目的 通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现 2.实验内容 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: (1)可以实现下列几条命令(至少4条) login 用户登录 dir 列文件目录 create 创建文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 (2)列目录时要列出文件名、物理地址、保护码和文件长度; (3)源文件可以进行读写保护。 3.实验提示 (1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 (2)用户创建的文件,可以编号存储于磁盘上。入file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 4.源代码

#include DISK_NUM*sizeof(struct fatitem) #include //FAT表大小 #include #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 #define MEM_D_SIZE 1024*1024 //根目录起始盘块号//总磁盘空间为1M #define ROOT_DISK_SIZE #define DISKSIZE 1024 sizeof(struct direct) //根 //磁盘块的大小1K 目录大小 #define DISK_NUM 1024 #define DIR_MAXSIZE 1024 //磁盘块数目1K //路径最大长度为1KB #define FATSIZE #define MSD 5 //最大子目录数5 }openitem[MOFN]; #define MOFN 5 int cur_size; /*当前打文件的 //最大文件深度为5 数目*/ #define MAX_WRITE 1024*128 }; //最大写入文字长度128KB struct fatitem *fat; /*FAT表*/ struct fatitem /* size 8*/ struct direct *root; /*根目录*/ { struct direct *cur_dir; /*当前int item; /*存放文件下一个磁目录*/ 盘的指针*/ struct opentable u_opentable; /* char em_disk; /*磁盘块是否空闲文件打开表*/ 标志位 0 空闲*/ int fd=-1; /*文件打开表的序}; 号*/ char *bufferdir; /*记录当前路struct direct 径的名称*/ { char *fdisk; /*虚拟磁盘起始地 /*-----文件控制快信息-----*/ 址*/ struct FCB

模拟文件管理系统

一.设计说明 设计实现一个简单的模拟文件管理系统,包括目录文件、普通文件、i结点和存储区,具体要求如下: (1)程序初始化时应构造如图1-1所示的目录结构。 图1-1 初始目录树 (2)在此模拟文件管理系统中可以实现的操作有: 改变目录:cd<目录名>,工作目录转移到指定的目录下。目录不存在时,给出错误信息。 创建文件:edit<文件名>,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。对于重名文件给出错误信息。 删除文件:del<文件名>,当没在用户使用指定文件时,将其删除。文件不存在时给出错误信息。 显示目录:dir<目录名>,显示指定目录下的全部文件和第一级子目录,如果没有指定目录名,则显示当前目录下的相应内容。 创建目录:md<目录名>,在指定路径下创建指定的目录,如没有指定路径,则在当前目录下创建指定的目录。对于重名目录给出错误信息。 删除目录:rd<目录名>,删除指定目录及其下的全部文件和子目录。如果指定目录为空,可直接删除,否则给出用户提示是否删除。 其他说明: <目录名>和<文件名>都支持全路径名和相对路径名。 文件名由目录结构中各级文件名分量排列构成,各分量间用“/”隔开。 输入exit命令可退出此模拟文件管理系统。

二.工作原理 2.1 编译工具 本程序使用的函数均为标准C库函数,可以由任何支持标准C的编译器编译运行。 已经通过测试的编译环境如下: Windows平台:Visual C++ 6.0 使用方法:用VC6打开fileSys.c文件,执行Build,根据对话框提示创建工程文件。Build完成即可用Execute运行程序。 Linux平台: Gcc 2.96 使用方法:到fileSys.c所在路径下,执行命令gcc-o fileSys fileSys.c生成可执行文件fileSys,执行./fileSys运行程序。 2.2 相关说明 支持相对路径和绝对路径: 相对路径如“cd user/file1↙”,“dir↙” 绝对路径如“cd /user/file1”(root指根目录)、“cd /user/file1↙”、“cd/↙”(表示对根目录操作) 如果命令或路径出错会有详尽的提示。 在新建文件或目录中,若文件名或目录名同名的文件或目录下已存在,则创建失败并给以提示。 CD命令中,如果遇到路径错误,将报错,并保持在当前路径下等待下一次命令。 如果有命令格式或者文件目录格式有错,系统将报错,并提示用户,允许重试。 不允许对文件操作的命令与对目录操作的命令混用,否则报错。 本系统采用了动态分布存储空间的链表结构,所以对文件数目没有明确限制,只受系统资源制约。 Exit为退出系统命令,该命令不能接目录名。在6个命令中,只有dir可接空路径名, 表示对当前目录的操作,其他的将会对命令格式的错误情况报错。 三.详细设计 3.1程序框架及函数调用关系 函数之间的关系如图3-1所示,每个函数的说明如下: Main(): 主函数 CdComd(): 改变目录功能处理 EditComd(): 创建文件功能处理 DelComd(): 删除文件功能处理 RdComd(): 删除目录功能处理

操作系统-文件系统存储空间管理

#include #include using namespace std; int B = 1; int U = 100; typedef struct Black { int Bnum; int Bfirst; int Bleng; int Blast; }Black; typedef struct Use { char Ufile[8]; int Ufirst; int Uleng; int Ulast; int Uflg; }Use; Black black[] = {{0,0,100,99}}; //初始化 Use use[100]= {0}; void bubbleSort(Black a[],int m) //为了实现再次新建文件时提高分配利用率(将空白快按空白个数从小到大排序) { for(int i = 0;ia[j+1].Bfirst) { Black temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } void PrintBlack() { int num =1; cout<<"***当前的空文件目录表"<

{ cout<>fname>>m; for(int i = 0;i=m) { temp = black[i].Bfirst; if(black[i].Bleng == m)//删除空白区

相关主题