- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四 文件系统
刘唯墨安全 0801
实验介绍
本实验要求在假设的 I/O 系统之上开发一个简单的文件系统, 这样做既能让实验者对文 件系统有整体了解,又避免了涉及过多细节。用户通过 create, open, read 等命令与文件系统
交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为 0至L-1。I/O系统利
用内存中的数组模拟磁盘。
实际物理磁盘的结构是多维的: 有柱面、 磁道、扇区等概念。 I/O 系统的任务是隐藏磁 盘的结构细节, 把磁盘以逻辑块的面目呈现给文件系统。 逻辑块顺序编号, 编号取值范围为 0至L -1,其中L表示磁盘的存储块总数。实验中,我们可以利用字符数组 ldisk[L][B] 构
建磁盘模型, 其中 B 表示每个存储块的长度。 I/O 系统从文件系统接收命令, 根据命令指定 的逻辑块号把磁盘块的内容读入命令指定的内存区域, 或者把命令指定的内存区域内容写入 磁盘块。内存区域内容写入磁盘块。
整体组织
注:我定义的文件系统中,磁盘分为两大部分:数据区和保留区。其中保留区中又包含位图区和文件 描述符区,数据区的首部是文件的目录项,也就是说,文件的目录项在文件创建时会创建相应的目录 项在数据区的文件首部;而位图区用于表征数据的占用情况,例如数据区的第 N 块被分配了,那么位 图区中也要做相应的改变。
文件描述符
注:文件描述符位于保留区后半部, 用于分为两类型, 即表示目录的 0 号描述符和 1 号以后的描述符, 用于表示文件的长度和分配块情况,具体看上图。
目录项
注:目录项位于数据区的首部,目录项的 0 位用于保存文件描述符的序号, 1 号以后用于存放文件名 总结:
一个文件的所有存放于由位视图,文件描述符,目录项和数据区表征。
① 对磁盘的操作:
字符数组(L*B)模拟磁盘,考虑到文件系统和 I/O系统(磁盘)不是同一层,故将所有对磁盘的操
作只能规约为这二者之间的接口来操作:
void read_block(int,char *);
void read_block(int,char *);
// 文件系统与 IO 设备的接口函数,读取块
void write_block(int,char *);// 文件系统与 IO
void write_block(int,char *);
也就是说,之后的文件的创建,删除,打开,关闭,指针定位等操作,里面牵扯到磁盘内容读写的步 骤,全部需要用这两个接口完成,然后这两个接口对磁盘的操作是以块为单位的,所以例如某些操作,只 要更改磁盘中的某一块中的某一位,则需要先读取某一块存于零时数组中,然后修改这个数组的某一位, 然后再将这个数组写回磁盘。
② 对文件的操作:
文件的创建 int create(char *)
. 找一空闲文件描述符
. 在文件目录里为新创建的文件分配一个目录项, (可能需要为目录文件分配新的磁盘块)
. 在分配到的目录项里记录文件名以及描述符编号
. 返回状态信息
文件的删除 int destroy(char *)
. 在目录里搜索该文件的描述符编号
. 删除该文件对应的目录项,并更新位图
. 释放文件描述符
. 返回状态信息
文件的打开 int open(char *)
. 搜索目录找到文件对应的描述符序号
. 在打开文件表中分配一个表目
. 在分配到的表目中把读写指针置为 0 ,并记录描述符编号
. 读入文件的第一块到读写缓冲区中
. 返回分配到的表目在打开文件表中的索引号
文件的关闭 int close(int)
. 把缓冲区的内容写入磁盘
. 释放该文件再打开文件表中对应的表目
. 返回状态信息
文件的写 int write(int,int,int)
. 写的内容若小于缓冲区内容,则直接写入缓冲区,完成写操作(关闭的时候会将缓冲区写入文件)
. 入写入的内容,缓冲区无法一次装完,则需要填满缓冲区,然后将缓冲区写入文件,腾出缓冲区, 然后再写入缓冲区, 碰到缓冲区满的情况便写入文件, 腾出缓冲区, 以 便文件的写入, 完成写操作。
. 返回状态信息
文件的读 int read(int,int,int)
. 将文件整个内容整个取出在一个临时字符数组中
. 根据要求的读取参数定位读写位置,输出读取内容,完成读操作
. 返回状态信息
文件指针定位 int lseek(int,int)
. 把文件的读写指针移动到 pos 指定的位置。 pos
. 是一个整数,表示从文件开始位置的偏移量。文件打开时,读写指针
. 自动设置为 0 。每次读写操作之后,它指向最后被访问的字节的下一
. 个位置。 lseek 能够在不进行读写操作的情况下改变读写指针能位置。
实验过程
该文件系统根据输入的指令来对文件系统的操作
命令
文档评论(0)