一、文件和和文件系统
1.1 文件、记录、数据项
数据项:
- 基本数据项:属性的集合
- 组合数据项:由若干个基本数据项组合而成
记录:
一组相关数据项的集合,用于描述一个对象在某方面的属性。
文件: 具有文件名的一组相关数据的集合
- 有结构文件:若干条记录
- 无结构文件:字节流
文件的属性:
- 类型
- 长度
- 物理位置
- 建立时间
1.2 文件类型与文件系统模型
文件类型非常简单,这里不做赘述。
文件系统模型:
对象:
- 文件
- 目录
- 磁盘存储空间
操作和管理:
- 对文件存储空间管理
- 目录管理
- 文件的地址转换
- 文件读写
- 文件共享与保护
接口:
- 命令行
- 图形界面
1.3 文件操作
为什么要打开关闭文件?
Answer:
打开文件是指将文件的属性拷贝到内存当中,当用户对该文件进行操作时,就无需再从外存访问,节省了文件检索时间,同时提高了对文件的操作速度。
二、文件的逻辑结构
无结构物件: 字节流文件
顺序文件: 按照一定顺序排在一起,可定长与变长。
索引文件: 提供一张索引表。
索引顺序文件: 一组一组地形成索引,每个索引按照顺序排列
哈希文件: 通过映射计算
三、外存分配方式
3.1 连续分配
优点: 读取连续,方便
缺点: 造成碎片,还要知道文件的长度
3.2 连接分配
3.2.1 隐式链接
优点: 可以避免小碎片、有利于文件的插入删除、文件动态扩充
缺点: 查找困难,而且指针容易出错,访问第n
个数据块,得照前面n-1
个数据块
3.2.2 显式链接
为所有文件创建一个FAT
表:
缺点:
- 不能高效地直接存取,对一个较大的文件进行存取时,必须先找到许多空闲地块号
FAT
需要占据较大的内存空间
3.2.3 索引链接
单极索引分配:
只适合于文件比较大的时候,文件比较小时,本来就只需要一个盘块,但是索引表就又占了一个
多级索引分配:
当文件过大时,索引表的大小大于一个盘块,那么就要多级索引。
混合索引方式:
四、目录管理
目录管理要求:
- 实现按名存取
- 提高对目录的检索速度
- 文件共享
- 允许文件重名
4.1 文件控制块与索引节点
文件控制块:
- 基本信息:文件名、物理位置、逻辑结构、物理结构
- 存取控制信息类
- 使用信息类
索引节点的引入:
因为查找目录只和文件名有关系,与FCB
中的数据是没有关系的,因此创建一个如下的索引表:
有两类索引节点:磁盘索引节点、内存索引节点
4.2 目录结构
单极目录:
- 查找速度慢
- 不允许重名
- 不允许共享
两级目录:
- 提高了检索速度
- 不同用户目录下,可以采用相同的用户名
- 可以实现文件的共享
多级目录:
在上一级的扩充
增加与删除目录:
- 得先把目录中的文件删除干净
- 可以将目录与文件一起删除
4.3 目录查询方法
- 线性,一级一级查询
- 哈希映射
五、文件存储空间的管理
与文件的物理结构不同,前者是考虑文件是什么存的,后者其实是考虑如何分配的。
其实这个对于进程/文件的物理结构与分配方式是一一对应的,连续分配对应整个存,离散分配对应将文件切分成块。
6.3是管文件如何给分配外存的,本节是讲如何利用剩下的外存的。
5.1 空闲表与空闲链表
空闲表:
空闲链表:
将空闲盘块链接起来
5.2 位示图法
横行代表一块盘区中的盘块号。
5.3 成组链接法
- 对于空闲盘块号栈来说:
S.free
代表有多少个空闲盘块S.free
下面代表下一个盘块,其都是整数- 然后是下一个盘块所记录的对应的那
100
空闲盘块号
- 对于整百的空闲盘块来说,与上述一致
- 对于非正百的空闲盘块来说,就是简单的空闲盘块
分配:
先从栈顶拿出空闲盘块,然后修改栈顶指针,修改S.free
。
如果读取完了这100
块,那么将本块所指的一下组读到空闲盘块号栈中
是不是每一组的盘块号是不是一定要连续?
Answer:
可以不需要连续,因为是通过索引分组的,而且在回收的时候,可能先回收了301、402
,那么把它俩个盘块就放到一组了。
六、文件共享与保护
6.1 索引节点共享
要记录共享的个数与文件的拥有者
6.2 符号链实现文件共享
类似于快捷方式。仅用有文件的路径名,不拥有索引节点指针。
6.3 磁盘容错
6.3.1 SFT-I
- 双份目录、双份文件分配表,做个备份。
- 热修复重定向/写后读校验:把坏的那一部分读写重定向;写后读一下,看看写的是否成功
6.3.2 SFT-II
- 磁盘镜像:把磁盘备份
- 磁盘双工:通道、磁盘控制器都备份
七、数据一致性控制
7.1 事务
就是对数据的一系列操作,就拿commit
为例。如果涉及到对表的增删改,那么如果不commit
,就说明本次事务没有结束,如果在非正常情况下退出的话,是无效操作。同时可以回滚。
7.2 重复数据的数据一致性问题
7.2.1 重复文件的一致性
当有重复文件的时候,修改了这个文件的索引,那么其他索引都要修改。
7.2.2链接数一致性检查
在共享文件过程中,对count
的检查。就是先从根目录开始查找,遇到该共享索引节点就+1,最后判断两个数是否相等。