文章目录
一、索引文件结构 简介
1、索引文件结构 原理
索引文件结构 是一种 高效的 文件存储管理方式 , 通过引入 索引表 实现对 文件数据块 的 快速定位 和 随机访问 ;
索引文件结构 解决了 文件数据 顺序存储 和 链式存储 的 随机访问效率低、扩展性差 等 局限性 , 现代的 文件系统 都是 基于 索引文件结构 进行设计的 ;
索引文件结构 设计思想 : 为 每个文件 分配 一个 独立的 索引块 , 索引块中 直接 或 间接 存储 该文件 所有数据块的 物理地址 ;
- 数据访问 方式 : 文件访问时 , 先 通过索引块找到 目标数据块 的 物理位置 , 再直接 访问数据 ;
- 支持 随机访问 ( 文件访问 ) : 通过 索引表 快速定位 数据块 ;
- 支持 动态扩展 ( 文件写出 ) : 灵活分配 数据块 ;
2、索引文件结构 关键部件
索引文件结构 关键部件 :
- 文件控制块 : 包含 文件元数据 , 如 : 大小、权限等 , 并指向 索引块 ;
- 索引块 : 存储文件 所有 数据块 的 物理地址 / 指针 / 物理块号 ;
- 数据块 : 实际 存储 文件数据内容 的 物理块 ;
3、索引结构的操作流程
文件读取 操作流程 : 该过程 就是 随机访问 操作 ;
- 路径访问 : 用户通过 逻辑路径 访问文件 ;
- 查找控制块 : 操作系统 查找 inode 文件控制块 ;
- 计算块号 : 根据 逻辑偏移量 计算 目标数据块号 , 逻辑偏移量 / 块大小 = 数据块号。
- 查询索引 : 查询 索引块 , 找到对应的 物理地址 ;
- 访问数据 : 直接访问 目标数据块。
文件写出 操作流程 : 该过程 就是 动态扩展 操作 ;
- 查找空闲数据块 : 查找 空闲数据块 并 分配 给文件 ;
- 更新直接索引 / 间接索引 : 更新索引块 ,
- 直接索引 : 如果 直接索引块 块没用完 , 直接添加新数据块的 物理地址 作为直接索引 ;
- 间接索引 : 如果 直接索引块 已满 , 分配新的 间接索引块 并 更新上级索引 ;
二、索引方式 简介
1、索引结点
在 LINUX / UNIX 系统中 , 每个 文件 默认有 13 个索引结点 , 结点编号是 0 ~ 12 , 每个编号中放置的就是 索引地址 , 索引地址 存储的是 物理块号 , 指向 具体的 物理盘块 ;
2、直接索引 和 间接索引
直接索引 : 又称为 单级索引 , 索引块 直接存储 所有 数据块 的 物理地址 ( 物理块号 ) ;
- 适用场景 : 小文件 存储 , 如 : 文本文件、配置文件 ;
- 优点 : 访问速度快 , 只需一次索引查询 , 实现简单 ;
- 缺点 : 索引块大小固定,无法支持大文件 , 若文件需要的数据块数超过索引块容量,则需其他机制扩展 ;
间接索引 : 又称为 多级索引 , 通过 多级索引块 间接定位数据块 , 支持大文件存储 ;
- 优点 : 支持超大文件 , 扩展性强 , 平衡存储效率和访问速度 ;
- 缺点 : 多级索引需要多次磁盘访问 , 如二级索引需访问索引块两次 ;
3、直接索引方式
直接索引方式 : 13 个 索引结点 中 , 前 10 个索引结点 , 对应的 节点编号是 0 ~ 9 , 这 10 个索引结点都是 " 直接索引 " , 直接索引 就是 索引地址 直接指向 物理块 , 这些物理块中存放的就是 文件数据 ;
每个 直接索引 指向一个 物理块 ( 存放文件数据 ) ;
直接索引方式 不经过地址跳转 , 直接就可以找到 文件数据 ;
0 ~ 9 号索引结点 ( 直接索引表 ) -> 文件数据
参考下图红色矩形框部分 :
4、一级间接索引方式
一级间接索引方式 : 第 10 号 索引结点 的 索引方式 是 " 一级间接索引方式 " , 该索引结点 指向 的 物理块中 存放的是 一级地址索引表 , 包含 n 个 直接索引 ;
每个 10 号索引结点 指向一个 物理块 ( 存放 一级间接索引表 ) , 存放 直接索引地址;
一级间接索引方式 经过 1 次 地址跳转 可以找到 文件数据 ;
10 号索引结点 -> 一级间接索引表 -> 文件数据
参考下图红色矩形框部分 :
5、二级间接索引方式
二级间接索引方式 : 第 11 号 索引结点 的索引方式是 " 二级间接索引方式 " , 该索引结点 指向 的 物理块中 存放的是 n 个 一级间接索引 ;
每个 11 号索引结点存储的 索引 指向一个 物理块 , 存放 二级间接索引表 ,
每个 二级简介索引表 存放的是 n 个 一级间接索引表 的 索引地址 ;
每个 一级间接索引表 有 n 个 直接地址 , 直接地址 指向一个 物理块 ( 存放文件数据 ) ;
二级间接索引方式 经过 2 次地址跳转 可以找到 文件数据 ;
11 号索引结点 -> 二级间接索引表 -> 一级间接索引表 -> 文件数据
参考下图红色矩形框部分 :
6、三级间接索引方式
三级间接索引方式 :
第 12 号 索引结点 的索引方式是 " 三级间接索引方式 " , 该索引结点 指向 的 物理块中 存放的是 三级间接索引表 , 对应 n 个 二级间接索引表 ;
每个 二级间接索引表 指向一个 物理块 ( 存放 一级间接索引表 ) , 存放的是 n 个 一级间接索引 ,
每个 一级间接索引 指向一个 物理块 ( 存放直接索引 ) , 存放 n 个 直接索引 ,
每个 直接索引 指向一个 物理块 ( 存放文件数据 ) ;
三级间接索引方式方式 经过 3 次地址跳转 可以找到 文件数据 ;
12 号索引结点 -> 三级间接索引表 -> 二级间接索引表 -> 一级间接索引表 -> 文件数据
三、软考考点
1、不同索引方式指向对象
不同的索引方式 , 指向 的对象 是不同的 , 索引指向对象分为以下两类 :
- 数据块 : 0 ~ 9 号 直接索引 指向 数据块 ;
- 索引表 :
- 10 号索引结点 指向 一级间接索引表 ;
- 11 号索引结点 指向 二级间接索引表 ;
- 12 号索引结点 指向 三级间接索引表 ;
在 索引结点表 / 一级间接索引表 ( 直接索引表 ) / 二级间接索引表 / 三级间接索引表 都可以理解成一个 数组元素 ,
上述 数组元素 存储的内容是 物理块号 , 可以理解成 地址 或 指针 , 根据这个 物理块号 / 地址 / 指针 可以找到一个 物理块 , 这个物理块中存放 数据块 或 索引表 ;
如下图所示 : 在 索引结点 或者 间接索引表 中 存储的都是 物理块号 ;
- 在 第 0 号 索引结点 存储的是 108 , 指向 物理块号为 108 的 物理块 ;
2、不同索引方式访问磁盘次数分析
不同索引方式访问磁盘次数分析 :
- 直接索引 : 只需要 访问 一次 数据盘 , 直接查看磁盘中的数据即可 ;
- 一级间接索引 : 访问 1 次索引盘 , 1 次数据盘 , 总共访问 2 次磁盘 ;
- ① 第一次访问磁盘 : 访问 索引盘 ( 一级间接索引表 ) , 从 一级间接索引表 中 找到 直接索引 ;
- ② 第二次访问磁盘 : 访问 直接索引 指向的 物理块 ;
- 二级简介索引 : 访问 2 次索引盘 , 1 次数据盘 , 总共访问 3 次磁盘 ;
- ① 第一次访问磁盘 : 访问 索引盘 ( 二级间接索引表 ) , 从 二级间接索引表 中 找到 一级间接索引表 所在的 物理块 ;
- ② 第二次访问磁盘 : 访问 索引盘 ( 一级间接索引表 ) , 从 一级间接索引表 中 找到 直接索引 ;
- ③ 第三次访问磁盘 : 访问 直接索引 指向的 物理块 ;
- 三级简介索引 : 访问 3 次索引盘 , 1 次数据盘 , 总共访问 4 次磁盘 ;
- ① 第一次访问磁盘 : 访问 索引盘 ( 三级间接索引表 ) , 从 三级间接索引表 中 找到 二级间接索引表 所在的 物理块 ;
- ② 第二次访问磁盘 : 访问 索引盘 ( 二级间接索引表 ) , 从 二级间接索引表 中 找到 一级间接索引表 所在的 物理块 ;
- ③ 第三次访问磁盘 : 访问 索引盘 ( 一级间接索引表 ) , 从 一级间接索引表 中 找到 直接索引 ;
- ④ 第四次访问磁盘 : 访问 直接索引 指向的 物理块 ;
3、文件逻辑位置计算
文件数据 在 逻辑位置 上是连续的 , 在 物理位置 上可以是分散的 ;
下图 红色矩形框 中 , 就是 文件的逻辑位置 ;
① 连续 逻辑位置
连续 逻辑位置 的理解 :
0 ~ 9 号 索引结点 分别指向 文件的前 10 个物理块 , 对应文件的 逻辑上的 序号为 0 ~ 9 的 10 个物理块 ;
第 10 号 索引结点 指向 一级间接索引表 , 其中有 n 个 直接索引 , 每个直接索引指向一个物理块存储文件数据 , 对应 文件的 逻辑上的 序号为 10 ~ n + 9 的 n 个物理块 ;
第 11 号 索引结点 指向 二级简介索引表 , 其中对应 n 个 一级间接索引表 , 每个 一级间接索引表 有 n 个 直接索引 , 每个直接索引指向 一个物理块存储文件数据 , 对应 文件的逻辑上的 序号为 n + 10 ~ n + 9 + n x n 的 n x n 个物理块 ;
② 一级间接索引 计算
10 号索引结点 指向一个物理块 , 该物理块中存储 一级间接索引表 , 该表中存放的物理块号 是固定的 ;
假设 每个 物理块 的大小固定为 1KB = 1024B , 每个 物理块号 占 4B ( 4 字节 ) 大小 ,
物理块号 就是 物理块地址 / 索引值 ,
那么 一个物理块中可以存储 1024 / 4 = 256 个 索引值 ;
在下图计算中 , 第 10 节点 指向 的 物理块 中存储的是 一级间接索引表 , 该物理块存储了 256 个 直接索引 , 对应文件中的 第 10 ~ 265 序号的 逻辑物理块 , 对应 256 个文件块 ;
③ 二级间接索引 计算
11 号索引结点 指向一个物理块 , 该物理块中存储 二级间接索引表 , 该表中存放的 物理块号 / 索引 个数是固定的 ;
在上个章节已经计算出 , 每个物理块 可存储 256 个索引值 ;
二级间接索引表 对应着 256 个 一级间接索引表 , 每个 一级间接索引表 指向一个物理块 , 又对应一个 一级间接索引表 , 其中又存放着 256 个直接索引 , 进而对应 256 个存放文件数据的 物理块 ;
第 11 节点 指向 二级间接索引表 , 其中索引指向 256 个 一级间接索引表 , 每个 一级间接索引表 包含的索引 指向 256 个 直接索引 ,
则 该 索引结点 间接 指向的 物理块 有 256 x 256 = 65536 个 , 对应文件中的 第 266 ~ 65801 序号的 逻辑物理块 , 对应 65536 个文件块 ;
④ 三级间接索引 计算
第 12 节点 指向的 三级间接索引表 , 包含 的 索引 指向 256 个 二级间接索引表 , 每个 二级间接索引表 包含的 索引分别 指向 256 个 一级间接索引表 , 每个 一级间接索引表 包含 256 个 直接索引 ,
则 该 索引结点 间接 指向的 物理块 有 256 x 256 x 256 = 256^3 = 16,777,216 个 ,
对应文件中的 第 65802 ~ ( 65801 + 256^3 = 16,843,017 ) 序号的 逻辑物理块 ,
对应 256^3 个文件块 ;
4、文件长度计算
假设 每个 物理块 的大小固定为 1KB = 1024B , 每个 物理块号 占 4B ( 4 字节 ) 大小 , 一个物理块中可以存储 1024 / 4 = 256 个 索引值 ;
0 ~ 9 号 直接索引方式 , 可以表示 10 KB 大小的文件 ;
10 号 一级间接索引方式 , 指向 256 个文件块 , 可以 表示 256 KB 大小的文件 ;
11 号 二级简介索引方式 , 指向 256 x 256 个文件块 , 可以 表示 65536 KB 大小的文件 ;
12 号 三级间接索引方式 , 指向 256^3 个文件块 , 可以 表示 256^3 KB 大小的文件 , 等于 16384 MB = 16 GB 大小的文件 ;
四、软考案例
下图是一个 索引文件 示意图 , 文件有 8 个索引结点 , 分别是 i-addr[0] ~ i-addr[7] ;
- 直接索引 : i-addr[0] ~ i-addr[4]
- 一级间接索引 : i-addr[5] ~ i-addr[6]
- 二级简介索引 : i-addr[7]
索引盘 和 数据块 的 物理块大小为 1 KB , 每个 索引地址值 为 4 字节 ;
文件的 逻辑块号 从 0 开始计数 , 在最右侧的文件块 依次向下累加 , 将 文件的 逻辑号 标记在 下图的 最右侧 文件块 中 ;
- 直接索引 : i-addr[0] ~ i-addr[4] 是 直接索引 , 直接指向 存放文件数据 的 物理块 , 对应 0 ~ 4 序号的 逻辑文件块 ;
- 一级间接索引 :
- i-addr[5] 是 一级间接索引方式 , 指向 一级间接索引表 , 包含 256 个 直接索引 , 分别指向 256 个文件块 , 对应的文件块的 逻辑序号为 5 ~ 260 这 256 个逻辑块 ;
- i-addr[6] 是 一级间接索引方式 , 指向 一级间接索引表 , 包含 256 个 直接索引 , 对应的文件块的 逻辑序号为 261 ~ 516 这 256 个逻辑块 ;
- 二级简介索引 : i-addr[7] 是 二级间接索引方式 , 指向 二级间接索引表表 , 包含的 256 个 索引 分别指向 一级间接索引表 ; 一级间接索引表 , 包含 256 个 直接索引 , 分别指向 256 个文件块 ;
- 对应的 文件逻辑序号为 517 ~ 66052 的 65536 个逻辑块 ;
该文件最多可以存储 65536 + 256 + 256 + 5 = 66053 个文件块 , 每个 1 KB , 则文件最多 66053 KB 大小 ;
物理块 索引表 名称 :
- 90 号 / 91 号 / 156 号 / 168 号 物理块 中 , 存储的是 一级地址索引表 ;
- 101 号 物理块 中 , 存储的是 二级地址索引表 ;