0 00:00:00,000 --> 00:00:07,320 1 00:00:07,360 --> 00:00:11,000 下面我们讨论虚拟文件系统 2 00:00:11,040 --> 00:00:12,840 虚拟文件系统的提出 3 00:00:12,880 --> 00:00:15,840 是为了面对 我们有多种 4 00:00:15,880 --> 00:00:18,800 不同的文件系统 5 00:00:18,840 --> 00:00:20,320 而在操作系统当中 6 00:00:20,360 --> 00:00:23,640 它又希望对上提供一个统一的接口 7 00:00:23,680 --> 00:00:26,360 这种问题所提出的 8 00:00:26,400 --> 00:00:27,840 这就涉及到我们这里说到的 9 00:00:27,880 --> 00:00:29,440 文件系统的实现 10 00:00:29,480 --> 00:00:31,720 它在这里采用一种分层的结构 11 00:00:31,760 --> 00:00:35,720 这中间为了把上边抹平 弄成一致的 12 00:00:35,760 --> 00:00:38,600 在这加了一个虚拟文件系统 13 00:00:38,640 --> 00:00:41,480 它使得文件系统对上层应用 14 00:00:41,520 --> 00:00:44,080 提供统一的文件访问 15 00:00:44,120 --> 00:00:47,520 和文件系统控制的系统调用接口 16 00:00:47,560 --> 00:00:51,520 然后中间呢 维护各种文件系统所共同的 17 00:00:51,560 --> 00:00:55,920 一些数据结构和常用的操作算法 18 00:00:55,960 --> 00:01:00,480 然后下边呢 来对各种不同的 19 00:01:00,520 --> 00:01:02,240 实际的文件系统 20 00:01:02,280 --> 00:01:04,240 提供相应的访问接口 21 00:01:04,280 --> 00:01:06,600 这就是我们这里说到的 22 00:01:06,640 --> 00:01:08,320 虚拟文件系统 23 00:01:08,360 --> 00:01:10,400 那么在虚拟文件系统里头 24 00:01:10,440 --> 00:01:14,120 它的目标是 要针对所有的 25 00:01:14,160 --> 00:01:16,160 不同的文件系统给出一个抽象 26 00:01:16,200 --> 00:01:17,280 在这里头 具体要提供的 27 00:01:17,320 --> 00:01:19,080 功能有这样几个 28 00:01:19,120 --> 00:01:23,280 一个是 对上提供相同的文件 29 00:01:23,320 --> 00:01:26,160 和文件系统的访问接口 30 00:01:26,200 --> 00:01:29,080 然后在它内部 维护所有文件 31 00:01:29,120 --> 00:01:31,280 和文件系统相关的数据结构 32 00:01:31,320 --> 00:01:34,520 这是各种文件系统统一的 33 00:01:34,560 --> 00:01:39,920 然后 在这里有一组高效的 34 00:01:39,960 --> 00:01:43,720 查询例程来完成对文件系统的遍历 35 00:01:43,760 --> 00:01:46,920 再往下呢 是对特定的文件系统模块 36 00:01:46,960 --> 00:01:48,760 提供相应的交互接口 37 00:01:48,800 --> 00:01:49,960 这是对下的 38 00:01:50,000 --> 00:01:52,200 有了这些之后 我们就希望能够 39 00:01:52,240 --> 00:01:54,520 把各种各样的文件系统统一到一起 40 00:01:54,560 --> 00:01:58,640 然后对上层用户提供统一的接口 41 00:01:58,680 --> 00:02:01,320 具体说起来 在文件系统里 42 00:02:01,360 --> 00:02:04,240 都有哪样一些基本的树状结构呢 43 00:02:04,280 --> 00:02:06,720 在这里我们说有三个 44 00:02:06,760 --> 00:02:09,720 一个是文件卷控制块 45 00:02:09,760 --> 00:02:12,160 就是我们通常所说的超级块 46 00:02:12,200 --> 00:02:14,440 它里头是每个文件系统 47 00:02:14,480 --> 00:02:17,320 对应着有一个文件卷控制块 48 00:02:17,360 --> 00:02:20,920 里头描述了这个文件系统的详细信息 49 00:02:20,960 --> 00:02:24,000 比如说它的数据块有多大 50 00:02:24,040 --> 00:02:26,520 有多少数据块已经分配出去了 51 00:02:26,560 --> 00:02:28,400 还有多少是空闲的 52 00:02:28,440 --> 00:02:32,480 相应的共享等等这些引用的计数 53 00:02:32,520 --> 00:02:34,720 第二个是文件控制块 54 00:02:34,760 --> 00:02:36,680 通常也是我们所说的索引节点 55 00:02:36,720 --> 00:02:39,040 或者叫inode 说的都是它 56 00:02:39,080 --> 00:02:41,560 每一个文件有一个文件控制块 57 00:02:41,600 --> 00:02:44,840 在里头描述了这个文件的详细信息 58 00:02:44,880 --> 00:02:48,360 比如说这个文件的访问权限 拥有者 59 00:02:48,400 --> 00:02:50,920 大小 和数据块所在的位置 60 00:02:50,960 --> 00:02:53,840 等等这样一些信息 61 00:02:53,880 --> 00:02:55,840 再有一个是目录项 62 00:02:55,880 --> 00:02:58,280 目录里头是由目录项组成的 63 00:02:58,320 --> 00:03:01,200 每个目录项对应着一个子目录 64 00:03:01,240 --> 00:03:02,880 或者说一个文件 65 00:03:02,920 --> 00:03:05,840 然后所有这些目录项的数据结构 66 00:03:05,880 --> 00:03:09,480 和树状的分层结构 67 00:03:09,520 --> 00:03:12,680 形成了文件系统的数据结构 68 00:03:12,720 --> 00:03:14,960 然后在这里主要维护的是 69 00:03:15,000 --> 00:03:18,400 每一个目录项所对应的文件控制块在哪 70 00:03:18,440 --> 00:03:21,840 它的父目录 子目录分别在哪 71 00:03:21,880 --> 00:03:23,680 这样的话就形成了我们这里的 72 00:03:23,720 --> 00:03:25,960 树状的数据结构了 73 00:03:26,000 --> 00:03:28,080 有了这些基本的数据结构之后呢 74 00:03:28,120 --> 00:03:30,120 我们就可以看到这样一张 75 00:03:30,160 --> 00:03:32,400 文件系统的组织结构 76 00:03:32,440 --> 00:03:36,920 文件卷控制块 到每一个目录项 77 00:03:36,960 --> 00:03:38,560 这些目录项呢 78 00:03:38,600 --> 00:03:40,520 组织成一个树状结构 79 00:03:40,560 --> 00:03:42,800 树状结构里的再往下一层呢 80 00:03:42,840 --> 00:03:44,360 是每一个文件 81 00:03:44,400 --> 00:03:46,640 它的文件控制块 82 00:03:46,680 --> 00:03:50,160 文件控制块知道它实际的 83 00:03:50,200 --> 00:03:52,520 文件里头的数据块 84 00:03:52,560 --> 00:03:53,120 这是构成了 85 00:03:53,160 --> 00:03:56,480 我们这个文件系统里的组织视图 86 00:03:56,520 --> 00:03:57,960 在这种视图的情况下 87 00:03:58,000 --> 00:04:00,200 我们就要去来讨论它的存储 88 00:04:00,240 --> 00:04:02,560 先说 我们这里有的东西是 89 00:04:02,600 --> 00:04:05,160 卷控制块 是每个文件系统一个 90 00:04:05,200 --> 00:04:07,760 然后文件控制块 是每个文件一个 91 00:04:07,800 --> 00:04:09,640 目录项或者叫目录节点 92 00:04:09,680 --> 00:04:13,120 是每个文件或者目录对应着有一个 93 00:04:13,160 --> 00:04:16,520 这些东西 都是要存到你的 94 00:04:16,560 --> 00:04:18,440 磁盘上的数据块当中 95 00:04:18,480 --> 00:04:20,000 有了这一条之后 96 00:04:20,040 --> 00:04:22,360 当你需要加载的时候 97 00:04:22,400 --> 00:04:25,560 我们把相应的内容加载在内存里头 98 00:04:25,600 --> 00:04:28,400 它分别在什么时候加载的呢 99 00:04:28,440 --> 00:04:30,880 卷控制块 它的内容是在 100 00:04:30,920 --> 00:04:32,240 文件系统挂载的时候 101 00:04:32,280 --> 00:04:34,240 把它加载到内存 102 00:04:34,280 --> 00:04:36,440 而文件控制块 103 00:04:36,480 --> 00:04:38,560 是在访问相应文件的时候 104 00:04:38,600 --> 00:04:40,200 加载到内存 105 00:04:40,240 --> 00:04:43,720 因为你需要访问文件 就必须知道 106 00:04:43,760 --> 00:04:45,080 它都在哪些位置 107 00:04:45,120 --> 00:04:47,440 那这时候就把这些内容加载到内存 108 00:04:47,480 --> 00:04:49,000 而目录项呢 109 00:04:49,040 --> 00:04:51,040 它没有一个统一的时间 110 00:04:51,080 --> 00:04:53,080 你在遍历要找某一个文件的时候 111 00:04:53,120 --> 00:04:57,280 它会遍历 从根目录到相应文件的路径 112 00:04:57,320 --> 00:04:58,640 那这个遍历的时候 113 00:04:58,680 --> 00:05:00,480 遇着的 就把这些目录项 114 00:05:00,520 --> 00:05:02,360 都加载到内存当中 115 00:05:02,400 --> 00:05:03,720 有了这样一个过程之后 116 00:05:03,760 --> 00:05:08,080 我们就可以看到文件系统的存储结构 117 00:05:08,120 --> 00:05:10,360 首先我们看到 这是我们的磁盘 118 00:05:10,400 --> 00:05:14,800 上边都是 一个一个的基本的数据块单位 119 00:05:14,840 --> 00:05:19,080 这是我们上边刚才画的组织视图 120 00:05:19,120 --> 00:05:21,640 卷控制块 在这里头 121 00:05:21,680 --> 00:05:23,560 卷控制块的位置是固定的 122 00:05:23,600 --> 00:05:24,960 卷控制块指向下边 123 00:05:25,000 --> 00:05:28,960 是每一个目录的目录项 124 00:05:29,000 --> 00:05:30,960 这构成中间这一段 125 00:05:31,000 --> 00:05:34,000 目录项里头对应的可能是下一级目录 126 00:05:34,040 --> 00:05:35,440 或者说是文件 127 00:05:35,480 --> 00:05:36,520 对应到文件的话 128 00:05:36,560 --> 00:05:38,920 那么这就是文件控制块 129 00:05:38,960 --> 00:05:40,640 那就是这一段 130 00:05:40,680 --> 00:05:42,040 文件控制块里说明了 131 00:05:42,080 --> 00:05:43,800 每一个文件所在的位置 132 00:05:43,840 --> 00:05:46,040 那这就是 再往下的一层 133 00:05:46,080 --> 00:05:49,080 这是我整个磁盘的存储视图 134 00:05:49,120 --> 00:05:50,320 有了这个视图之后呢 135 00:05:50,360 --> 00:05:53,120 我们就能知道 我们在虚拟文件系统里头 136 00:05:53,160 --> 00:05:55,480 需要保存的各个文件系统 137 00:05:55,520 --> 00:05:58,040 公共的一些信息都是些什么 138 00:05:58,080 --> 00:06:00,520 从而也就通过虚拟文件系统 139 00:06:00,560 --> 00:06:02,920 把各种实际的文件系统 140 00:06:02,960 --> 00:06:07,560 和应用之间的间距给弥补上了 141 00:06:07,600 --> 00:06:09,800 从而我们可以通过一个统一的接口 142 00:06:09,840 --> 00:06:12,840 访问各种各样的实际的文件系统 143 00:06:12,960 --> 00:06:14,000 144 00:06:14,040 --> 00:06:14,360 145 00:06:14,400 --> 00:06:14,440