zl程序教程

您现在的位置是:首页 >  系统

当前栏目

操作系统目录与文件系统---21

操作系统 目录 --- 21 文件系统
2023-09-14 09:13:34 时间


文件,抽象成一个磁盘块集合

在这里插入图片描述
单个文件映射到磁盘上,靠的是对应的映射表,通过映射表就可以知道该文件被映射到了那几个磁盘块进行存储。


文件系统,抽象成整个磁盘(第四层抽象)

在这里插入图片描述
要将整个文件系统都映射到磁盘上去,那么就需要在磁盘上维护相关数据结果来记录文件系统的结构,并且需要确保这些数据结构也能被其他机器识别,这样就可以让同一块磁盘可以被不同的机器解析并被使用。

下面的关键就是如何让一堆文件映射到磁盘了


故事先从多个文件开始…

在这里插入图片描述
如果将所有文件都放在一起,那么无论怎么划分,文件数量还是会很大,不方便管理。


引入目录树

在这里插入图片描述


实现目录成为了关键问题…

首先需要回答:目录怎么用?

  • 用“/my/data/a”定位文件a

问题:更准确的说,是要干什么?

  • 根据/my/data/a,得到文件a的FCB

在这里插入图片描述

现在的关键就是如何完成目录名到对应文件FCB的映射

问题:那么目录中应该存什么?

存放目录下的所有文件的FCB吗? 如果是,解析my要干什么?
在这里插入图片描述
我们的目的只是查找my目录下的某个文件,并且在进行查找过程中,也只是根据文件名进行挨个匹配,如果每个文件名都需要保存其对应文件的FCB(FCB平均每个也有几百个字节),那么显然这样太浪费磁盘空间,毕竟大部分的文件的FCB都是不被需要的。

在这里插入图片描述

问题:有什么办法(目录存什么)让系统效率更高?

最直接的想法,就是能不能不直接存储对应文件的FCB,而是只存储对应FCB在磁盘中的位置,或者某一个编号,而通过磁盘中维护的某个数组,可以快速查找到该编号对应的FCB。


树状目录的完整实现

在这里插入图片描述
在磁盘中某个固定位置,我们需要维护一个FCB数组,当我们需要查询某个目录名时,首先需要从根目录开始查询起(根目录位置应该是固定的),通过根目录数据块维护的文件名和对应FCB索引映射关系,查询到对应一级目录的FCB。

然后再通过一级目录的FCB定位到对应的数据块,再通过数据块查询到下一级目录对应的FCB索引,然后依次往复,直到查询到最终的文件…

关键是起始的根目录位置,如果让操作系统知晓呢?


要使整个系统能自举,还需存一些信息

在这里插入图片描述

超级块可以记录两个位图有多大,包括自身有多大,通过这些信息就可以计算出存放节点的区域起始位置在哪里,然后就可以定位到根节点的位置,因为根节点是节点区域中的第一个节点,并且每个节点的大小也应该是固定的。


一个磁盘想要使用,需要mount到一个系统中,所谓mount就是读取超级块,超级块可以通过换算找到根目录,而如果要将磁盘挂载到当前系统的/usr/local目录下面,则当操作系统需要遍历/usr/local目录时,对应定位到的就是当前磁盘的根目录


“完成全部映射下”的磁盘使用

在这里插入图片描述

在这里插入图片描述