简单模拟操作系统中的文件操作(1)

本文介绍了模拟操作系统中文件操作的实习内容和目的,包括文件系统的理解、需求分析、数据结构设计(如MFD、UFD、UOF)以及算法设计。通过模拟实现“建立文件”、“打开文件”、“读文件”、“写文件”、“关闭文件”和“撤消文件”等操作,加深对文件系统管理的理解。
摘要由CSDN通过智能技术生成

1 实习内容

文件操作及其实现。

2 实习目的

文件系统是操作系统中管理和存取信息的机构,它具有“按名存取”的功能,不仅方便用户,而且能提高系统效率且安全可靠。

在用户程序中可使用文件系统提供的一整套文件操作(文件类系统调用),这类操作一般包括“打开文件”、“关闭文件”、“读文件”、“写文件”和“撤消文件”等。本实习模拟文件操作的实现,通过实习了解各文件操作的作用。

3 实习步骤

3.1 需求分析

模拟实现采用二级目录结构的磁盘文件系统中的文件操作。

(1) 文件系统使用文件目录来实现“按名存取”,在本实习中采用三级文件目录结构,第一级为主文件目录MFD,第二级为用户文件目录UFD,第三级为用户已打开文件目录UOF。假定系统可同时管理N个用户的文件,每个用户最多在磁盘上保存L个文件,在模拟实习中约定采用定长记录格式组织文件,那么,三级目录结构可用如下形式,如表1、表2所示:

 

 

表1 主文件目录MFD

 

用户名

用户文件目录地址

用户已打开文件目录地址

N栏

用户的UFD文件名

用户的UOF文件名

 

 

表2 用户文件目录UFD

 

文件名

文件属性

记录长度

文件地址

L栏

默认(0为只读/1为读写)

 

 

 

系统中只有一张主文件目录表,表中的每一栏与一个用户对应,从中可找到用户文件目录表和用户已打开文件目录表的存放地址。共有N张用户文件目录表,在用户文件目录表中,每一栏与一个文件对应。其中“文件属性”规定了文件的使用权限:只可读、可读可写;“记录长度”指组成该文件的逻辑记录长度;“文件地址”指文件存放在磁盘上的首块地址。为简单起见,在模拟实习中约定按MS-DOS的链接结构组织文件。

(2) 用户对文件进行存取之前,必须先提出“建立文件”或“打开文件”,系统为每个用户设置一张用户已打开文件表UOF,用以说明当前正在使用的文件的情况,如果用户最多同时打开或建立s个文件,那么,已打开文件表应该有s个登记栏。结构如表3所示:

 

表3 用户已打开文件表UOF

 

文件名

文件属性

记录长度

状态(打开/建立)

读指针

写指针

S栏

默认(0为只读/1为读写)

 

默认(0为打开/1为建立)

 <

共两个不同设计例子,都含详细的文档资料。 任务2.设计一个简单二级文件系统 设计要求: 在任一OS下,建立一个大文件,把它假象成硬盘,在其实现一个简单模拟文件系统。 编写一管理程序对此空间进行管理,要求: 1. 实现盘块管理 2. 实现文件的读写操作 3. 每组最多2人,小组内要有明确分工,课程设计报告设计部分可以相同,个人实现部分不同 参考建议: 将模拟硬盘的文件空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示链接(FAT表)的方式。 设计技术参数(数据结构)参考: #define MaxSize 100 #define Disk 512 //每个盘块大小为512bit #define NumDisk 2048 //有2048个盘块,既可分配空间为 1M /*************目录文件结构定义***********************/ struct DirectoryNode { char name[9]; /*目录文件的名字*/ int type; /*0代表目录,1代表普通文件*/ struct DirectoryNode *next; /*指向下一个兄弟结点的指针*/ struct DirectoryNode *preDirFile; /*指向父结点的指针*/ struct DirectoryNode *subFile; /*指向第一个子结点的指针*/ int size; /*如果是文件则表示文件的大小*/ int first; /*起始盘块号*/ int last; /*末尾盘块号*/ int order; /*备用*/ }; //连续分配 struct FileSys { int VacTable[NumDisk]; //空闲表,0为空闲,1为被用 struct DirectoryNode root; //根目录 struct DirectoryNode Directory[NumDisk]; } *filesys; typedef struct { struct DirectoryNode *DirFile; char name[9]; }DataType; //包含一个指向目录的指针和名字 typedef struct { //队列结构的实现 DataType data[MaxSize]; int front,rear; //分别表示队列的头结点和尾结点 }Tp; void InitQueue(Tp *sq) //队列初始化 int EnAddQueue(Tp *sq,DataType data) //在队列增加元素 DataType EnDelQueue(Tp *sq) //从队列删除一个元素 int Empty(Tp *sq) //判断队列是否为空,返回0表示队列为空 ①.Dir:显示目录内容命令,显示当前目录下的文件和子目录。 ②.Md:创建目录操作。 ③.Create:创建文件,在当前目录下创建一个文件。 ④. all:显示从根目录开始的所有目录文件及其层次结点。 ⑤.Cd:改变目录。 ⑥.Del:删除文件操作。 ⑦. Rd:删除目录操作,删除当前目录下的子目录。 ⑧. Ren:重命名函数 ⑨. Exit:退出命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值