天天看点

操作系统实验-----文件系统操作系统实验-----文件系统

操作系统实验-----文件系统

Y.xj

一,实验目的

​ 本实验要求在假设的I/O系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create, open,read等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为L至L-1。I/O系统利用内存中的数组模拟磁盘。

二,实验内容

  • I/O系统:

    ​ 实际物理磁盘的结构是多维的:有柱面、磁头、扇区等概念。I/O系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0至L**−1,其中L表示磁盘的存储块总数。实验中,我们可以利用数组ldisk[C][H][B]构建磁盘模型,其中CHB 分别表示柱面号,磁头号和扇区号。每个扇区大小为512字节。I/O系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。文件系统和I/O系统之间的接口由如下两个函数定义:

    • read_block(int i, char *p);

    该函数把逻辑块i的内容读入到指针p指向的内存位置,拷贝的字符个数为存储块的长度B。

    • write block(int i, char *p);

    该函数把指针p指向的内容写入逻辑块i,拷贝的字符个数为存储块的长度B。此外,为了方便测试,我们还需要实现另外两个函数:一个用来把数组ldisk 存储到文件;另一个用来把文件内容恢复到数组。
  • 文件系统:

    ​ 文件系统位于I/O系统之上

    文件系统需提供如下函数;create, destroy, open, read, write。

    • create(filename): 根据指定的文件名创建新文件。

    • destroy(filename): 删除指定文件。

    • open(filename): 打开文件。该函数返回的索引号可用于后续的read, write, lseek,或close操作。

    • close(index): 关闭制定文件。

    • read(index, mem_area, count): 从指定文件顺序读入count个字节memarea指定的内存位置。读操作从文件的读写指针指示的位置开始。

    • write(index, mem_area, count): 把memarea指定的内存位置开始的count个字节顺序写入指定文件。写操作从文件的读写指针指示的位置开始。

    • lseek(index, pos): 把文件的读写指针移动到pos指定的位置。pos是一个整数,表示从文件开始位置的偏移量。文件打开时,读写指针自动设置为0。每次读写操作之后,它指向最后被访问的字节的下一个位置。lseek能够在不进行读写操作的情况下改变读写指针能位置。

    • directory: 列表显示所有文件及其长度。

  • 模拟系统需要的结构体和宏定义
#define B		10			//存储块长度
#define L		500			//存储块总数
#define K		100			//保留区大小
#define BUSY	1
#define FREE	0
#define OK		1
#define ERROR	0
#define FILE_BLOCK_LENGTH		(B-3)				//文件分配磁盘块号数组长度
#define FILE_NAME_LENGTH		(B-1)				//最长文件名长度
#define FILE_SIGN_AREA			((L-1-K)/B+1)		//保留区中文件标识符起始块号(位图之后)
#define FILE_NUM				FILE_BLOCK_LENGTH	//目录内最多文件数目
#define BUFFER_LENGTH			25					//打开文件表目中的缓冲区长度
#define INPUT_LENGTH			100					//写文件时最大输入长度
#define OUTPUT_LENGTH			100					//读文件时最大读出长度



struct filesign {							//文件描述符
	int file_length;						//文件长度
	int filesign_flag;						//占用标识位
	int file_block;							//文件分配磁盘块号数组实际长度
	int file_block_ary[FILE_BLOCK_LENGTH];	//文件分配磁盘块号数组
};

struct contents {							//目录项
	char filename[FILE_NAME_LENGTH];		//文件名
	int	 filesignnum;						//文件描述符序号
};

struct openfilelist {						//打开文件表表目
	char buffer[BUFFER_LENGTH];				//读写缓冲区
	int pointer[2];							//读写指针(文件内容的位置)
	int filesignnum;						//文件描述符
	int flag;								//占用符
};

char ldisk[L][B];						//用字符数组模拟磁盘

openfilelist open_list[FILE_NUM];		//打开文件表
           
  • 核心函数的编写
void read_block(int, char*);
/**************************读磁盘块
该函数把逻辑块的内容读入到指针指向的内存位置
拷贝的字符个数为存储块的长度。
***************************/

void write_block(int, char*);
/**************************写磁盘块
该函数把指针p指向的内容写入逻辑块i
拷贝的字符个数为a存储块的长度。
***************************/

void Init();
/**************************初始化磁盘
将磁盘全部置空
然后创建0号文件描述符为根目录的文件描述符
初始化位图区
***************************/

int create(char*);
/**************************根据文件名创建文件。
.找空闲文件描述符
.在文件目录里为新创建的文件分配一个目录项,(可能需要为目录文件分配新的磁盘块)
.在分配到的目录项里记录文件名以及描述符编号
.返回状态信息
***************************/

int destroy(char*);
/**************************删除指定文件
.在目录里搜索该文件的描述符编号
.删除该文件对应的目录项并更新位图
.释放文件描述符
.返回状态信息
***************************/

int open(char*);
/***************************打开文件t
该函数返|回的索引号可用于后续的read, write, lseek, 或close 操作
.搜索目录找到文件对应的描述符序号
.在打开文件表中分配一个表目
.在分配到的表目中把读写指针置为并记录描述符编号
.读入文件t的第一块到ì读写缓冲区中
.返回分配到的表à目在打开文件表中的索引号
***************************/

int close(int);
/***************************关闭文件t
.把缓冲区的内容写入磁盘
.释放该文件再打开文件表中对应的表目
.返回状态信息
***************************/

void Init_block(char, int);
/**************************初始化一个字符数组块
处理的字符数组块长度为a
内容为'\0'
***************************/

int read(int, int, int);
int write(int, int, int);
int write_buffer(int, int);
int lseek(int, int);
           

三,实验结果

  • 首先进入程序运行界面,弹出系统使用说明书
操作系统实验-----文件系统操作系统实验-----文件系统
  • 显示文件目录的内容
操作系统实验-----文件系统操作系统实验-----文件系统
  • 创建一个新的文件
操作系统实验-----文件系统操作系统实验-----文件系统
  • 删除一个文件
操作系统实验-----文件系统操作系统实验-----文件系统
  • 查看文件索引号
操作系统实验-----文件系统操作系统实验-----文件系统
  • 读操作
操作系统实验-----文件系统操作系统实验-----文件系统
  • 写操作
操作系统实验-----文件系统操作系统实验-----文件系统
  • 关闭操作
操作系统实验-----文件系统操作系统实验-----文件系统
  • 实时查看磁盘存储状况
操作系统实验-----文件系统操作系统实验-----文件系统
操作系统实验-----文件系统操作系统实验-----文件系统

GITHUB地址:

这里

继续阅读