下面我们讨论虚拟文件系统
虚拟文件系统的提出
是为了面对 我们有多种
不同的文件系统
而在操作系统当中
它又希望对上提供一个统一的接口
这种问题所提出的
这就涉及到我们这里说到的
文件系统的实现
它在这里采用一种分层的结构
这中间为了把上边抹平 弄成一致的
在这加了一个虚拟文件系统
它使得文件系统对上层应用
提供统一的文件访问
和文件系统控制的系统调用接口
然后中间呢 维护各种文件系统所共同的
一些数据结构和常用的操作算法
然后下边呢 来对各种不同的
实际的文件系统
提供相应的访问接口
这就是我们这里说到的
虚拟文件系统
那么在虚拟文件系统里头
它的目标是 要针对所有的
不同的文件系统给出一个抽象
在这里头 具体要提供的
功能有这样几个
一个是 对上提供相同的文件
和文件系统的访问接口
然后在它内部 维护所有文件
和文件系统相关的数据结构
这是各种文件系统统一的
然后 在这里有一组高效的
查询例程来完成对文件系统的遍历
再往下呢 是对特定的文件系统模块
提供相应的交互接口
这是对下的
有了这些之后 我们就希望能够
把各种各样的文件系统统一到一起
然后对上层用户提供统一的接口
具体说起来 在文件系统里
都有哪样一些基本的树状结构呢
在这里我们说有三个
一个是文件卷控制块
就是我们通常所说的超级块
它里头是每个文件系统
对应着有一个文件卷控制块
里头描述了这个文件系统的详细信息
比如说它的数据块有多大
有多少数据块已经分配出去了
还有多少是空闲的
相应的共享等等这些引用的计数
第二个是文件控制块
通常也是我们所说的索引节点
或者叫inode 说的都是它
每一个文件有一个文件控制块
在里头描述了这个文件的详细信息
比如说这个文件的访问权限 拥有者
大小 和数据块所在的位置
等等这样一些信息
再有一个是目录项
目录里头是由目录项组成的
每个目录项对应着一个子目录
或者说一个文件
然后所有这些目录项的数据结构
和树状的分层结构
形成了文件系统的数据结构
然后在这里主要维护的是
每一个目录项所对应的文件控制块在哪
它的父目录 子目录分别在哪
这样的话就形成了我们这里的
树状的数据结构了
有了这些基本的数据结构之后呢
我们就可以看到这样一张
文件系统的组织结构
文件卷控制块 到每一个目录项
这些目录项呢
组织成一个树状结构
树状结构里的再往下一层呢
是每一个文件
它的文件控制块
文件控制块知道它实际的
文件里头的数据块
这是构成了
我们这个文件系统里的组织视图
在这种视图的情况下
我们就要去来讨论它的存储
先说 我们这里有的东西是
卷控制块 是每个文件系统一个
然后文件控制块 是每个文件一个
目录项或者叫目录节点
是每个文件或者目录对应着有一个
这些东西 都是要存到你的
磁盘上的数据块当中
有了这一条之后
当你需要加载的时候
我们把相应的内容加载在内存里头
它分别在什么时候加载的呢
卷控制块 它的内容是在
文件系统挂载的时候
把它加载到内存
而文件控制块
是在访问相应文件的时候
加载到内存
因为你需要访问文件 就必须知道
它都在哪些位置
那这时候就把这些内容加载到内存
而目录项呢
它没有一个统一的时间
你在遍历要找某一个文件的时候
它会遍历 从根目录到相应文件的路径
那这个遍历的时候
遇着的 就把这些目录项
都加载到内存当中
有了这样一个过程之后
我们就可以看到文件系统的存储结构
首先我们看到 这是我们的磁盘
上边都是 一个一个的基本的数据块单位
这是我们上边刚才画的组织视图
卷控制块 在这里头
卷控制块的位置是固定的
卷控制块指向下边
是每一个目录的目录项
这构成中间这一段
目录项里头对应的可能是下一级目录
或者说是文件
对应到文件的话
那么这就是文件控制块
那就是这一段
文件控制块里说明了
每一个文件所在的位置
那这就是 再往下的一层
这是我整个磁盘的存储视图
有了这个视图之后呢
我们就能知道 我们在虚拟文件系统里头
需要保存的各个文件系统
公共的一些信息都是些什么
从而也就通过虚拟文件系统
把各种实际的文件系统
和应用之间的间距给弥补上了
从而我们可以通过一个统一的接口
访问各种各样的实际的文件系统