文件管理
概述
- 单个文件
- 文件名、标识符、类型、位置、大小、保护信息
- 有结构文件、无结构稳健
- 文件间组织:目录
- 操作系统应提供的基础功能
- create
- delete
- read
- write
- open
- close
- 文件的存储方式
- 块为单位、物理单元、物理地址
- 连续存储、离散存储
- 空闲块清理
- 磁盘在单位时间只能读入一个磁盘块里的数据
文件逻辑结构
- 无结构文件:流式文件(txt)
- 有结构文件:记录是文件(数据库、表格)
- 定长、不定长
- 顺序文件
- 链式存储:无法随机存取,只能依次读取
- 顺序存储
- 可变长:无法随机存取
- 索引文件:索引号、长度、指针,但体积可能过大
- 索引顺序文件:为一组记录对应一个索引表项
- 定长:可随机存取
- 串结构,无法快速找到对应记录、增删容易
- 顺序结构,可以快速找到对应记录、增删困难
- 可变长:无法随机存取
文件目录
- 文件目录:一种特殊的有结构文件
- 控制块FCB:文件名、类型、存取权限、物理块号等
- 系统提供的功能:搜索、创建、删除、显示、修改
- 分类
- 单级目录(早期)
- 不允许重名
- 两级目录(早起多用户):主文件、用户文件
- 不能分类
- 多级目录(现代树形)
- 设置当前目录(相对目录查找)
- 方便分类文件、减少磁盘IO
- 不便于文件共享
- 无环图目录结构
- 给共享节点设置共享计数器,当共享计数器归零时,才删除
- 单级目录(早期)
- 索引节点(FCB改进)
- 只有文件名、索引节点指针
- 可以一次读入更多目录项进行查找,减少磁盘IO
- 在外存时为磁盘索引节点、在内存时为内存索引节点
文件物理结构
- 基础原件概念
- 磁盘块、文件块,类似内存页框、页面
- 用户通过(逻辑块号、块内地址)来访问文件,操作系统实现从逻辑地址到物理地址的映射
- 连续分配
- 每个文件在磁盘上占有一组连续块
- FCB:文件名、起始块、长度
- 支持顺序访问和随机访问
- 由于文件块、顺序读写时,访问速度最快
- 不方便文件扩展、存储空间利用率低产生磁盘碎片
- 链接分配(默认隐式链接)
- 隐式(链接在文件末)
- 文件通过连接到下个块的指针来访问
- FCB:文件名、起始块、结束块
- 需要i+1次IO访问第i块,只能顺序访问
- 方便文件扩展、存储空间利用率高、不产生磁盘碎片
- 显式(连接在单独的表中)
- FAT是记录文件连接方式的表:物理块、下一块,-1为结束
- FCB:文件名、起始块
- FAT常驻内存,转换逻辑块号为物理块号的过程不需要磁盘IO
- 支持顺序、随机访问、访问效率高
- 文件分配表需要占用存储空间
- 隐式(链接在文件末)
- 索引分配
- 为文件建立单独索引表:逻辑块号(隐含)、物理块号
- FCB:文件名、索引块
- 支持随机访问、易于扩展
- 索引表占用空间
- 当索引表太大时
- 连接方案:在索引表中增加指向下一个索引块的指针
- 需要依次查询索引表
- 多层索引:建立多层索引
- 最大长度:一级项数x二级项数x…xn级项数x块大小
- 对于k级页表,需要k+1次访问
- 对于小文件可能会多次读取页表
- 混合索引
- 顶级索引表中包含顶级、一级、二级索引
- 连接方案:在索引表中增加指向下一个索引块的指针
- 要点
- 根据多层索引、混合索引结构计算文件最大长度
- 分析访问数据块岁需要的读磁盘次数
文件存储空间管理
- 划分与初始化
- 物理磁盘包含多个文件卷
- 文件卷:目录区、文件区
- 一个文件卷可以跨越多个物理磁盘(部分超大型文件系统)
- 物理磁盘包含多个文件卷
- 管理方式
- 空闲表法
- 空闲表:起始空闲盘块号、空闲盘块数
- 应用适应算法:首次适应、最佳适应、最坏适应
- 回收区间合并参照内存管理
- 空闲链表法:系统保持连头指针、链尾指针
- 空闲盘块链:每个盘块内记录下一个空闲盘块指针
- 分配:从链头摘下k个盘块,修改链头指针
- 回收:依次将回收盘块挂到链尾,修改链尾指针
- 空闲盘区链:每个盘区首个盘块内记录下一个空闲盘区指针、及本盘区长度
- 分配:应用适应算法,从一个或多个盘区中摘取
- 回收:若块与某个空闲盘区相邻,则合并;否则生成若干个新的节点、挂到链尾
- 空闲盘块链:每个盘块内记录下一个空闲盘块指针
- 位示图
- 二进制位对应盘块0空闲、1已分配
- 以字(n bit)为单位,用字号i、位号j(行号、列号)记录第b=ni+j对应空闲情况
- 分配、回收即转换过程
- 成组链接法(大型文件系统,如UNIX)
- 超级块(目录区,内存与磁盘保持一致):
- 下一组空闲盘块数量
- 这些空闲盘块的块号
- 其中首个块内记录下一组的空闲盘块数和空闲盘块号
- 最后一组的首个盘块内使用特殊标记分组结束
- 分配
- 检查第一分组内数量是否足够
- 足够则分配相应数量,分配前使用首个盘块中的表替代超级块中的表
- 不足够则在取完该分组后取下一个分组
- 始终保持超级块中数据指向下一个有空的分组
- 回收
- 先向当前有空的分组中插入空闲块
- 当前分组写满之后,建立新的分组,复制超级块中的数据到分组的第一个块中,并重建超级快
- 超级块(目录区,内存与磁盘保持一致):
- 空闲表法
文件操作(系统调用)
- 创建create
- 参数:空间、路径、文件名
- 动作:
- 找到空间
- 插入目录项
- 删除delete
- 参数:路径、文件名
- 动作:
- 找到目录项
- 根据目录项回收磁盘块
- 删除目录表中的项
- 打开open
- 参数:路径、文件名、操作类型
- 动作:
- 找到目录项、鉴权
- 复制到内存“打开文件表”,
- 系统打开文件表:编号、文件名、外存地址、打开计数器
- 进程打开文件表:编号、文件名、读写指针、访问权限、系统表索引
- 关闭close
- 参数:文件索引(指针)
- 动作
- 删除进程中的表项
- 系统表计数器-1,若归零则删除表项
- 读read
- 参数:文件索引号、读入数据大小、存储的内存指针
- 动作
- 查询打开文件表
- 根据读写指针读入指定大小到内存区域
- 写write
- 参数:文件索引号、写出数据大小、写出的数据在内存的指针
- 动作
- 查询打开文件表
- 根据读写指针写出指定大小内存区域中的数据到外存
文件共享
- 硬链接:索引节点(配合瘦身的文件目录,只有文件名、索引节点指针)
- 不同目录项指向同一个索引节点,节点中含有计数器,该节点直接存储文件物理地址
- 删除时必须检查计数器是否归零,归零则连同物理文件一起删除
- 单次IO
- 符号链接
- 创建一个新的文件来记录文件实际存储的位置
- 删除物理文件则导致符号连接失效,但链接文件还在
- 多次IO
文件保护
- 口令保护:
- 保存口令在FCB中
- 可以越权访问,不够安全
- 加密保护
- 对文件内容进行加密,只有正确秘钥可以解密(如异或、移位)
- 加解密需要时间
- 访问控制
- FCB/索引节点中加入访问控制表
- 控制表可以以用户/组为单位记录权限;权限可分为读写执行删除
- 实现灵活,实现复杂保护功能
文件系统层次结构
- 用户接口:Read/Write/Open/Close等系统调用
- 文件目录系统:FCB操作、目录管理
- 存取控制模块:鉴权与保护
- 逻辑文件系统与文件信息缓冲区:文件记录转换逻辑地址
- 物理文件系统:逻辑地址转换物理地址
- 辅助分配模块:空间分配与回收
- 设备管理模块 ⇔ \Leftrightarrow ⇔物理设备
磁盘
- 磁盘
- 盘面
- 扇区(最内侧数据密度最大)
- 柱面
- 磁头(固定头、移动头)
- 由(盘面、柱面、磁头)可以定位唯一物理块
- 盘面
磁盘调度算法
- 磁盘上处理时间
T
a
=
T
S
+
T
R
+
T
t
T_a=T_S+T_R+T_t
Ta=TS+TR+Tt
- 寻道时间
T
S
=
s
+
m
n
T_S=s+mn
TS=s+mn
- 启动磁头臂耗时s
- 移动磁头:跨越n个磁道,每个磁道耗时m
- 延迟时间
T
R
=
1
2
r
T_R=\frac{1}{2r}
TR=2r1
- 定位到目标扇区:转速为r(平均转半圈)
- 传输时间
T
t
=
b
r
N
T_t=\frac{b}{rN}
Tt=rNb
- 转速为r,读写b个字节,每个磁道块上N个字节
- 寻道时间
T
S
=
s
+
m
n
T_S=s+mn
TS=s+mn
- 优化寻道时间
- FCFS先来先服务:根据进程访问顺序
- 多进程、访问分散下性能差
- SSTF最短时间优先:优先处理最近的磁道
- 产生饥饿
- SCAN扫描(电梯算法):只有移动到最外侧后,才往里移动
- 响应频率不平均、不能及时回头
- LOOK:继承SCAN的思想,但当发现当前方向上没有请求时立刻回头
- 解决SCAN的不及时回头缺点
- C-SCAN循环扫描算:只有从一侧向另一侧移动时,才访问磁道
- 解决访问频率不平均的问题
- C-LOOK:结合C-SCAN与C-LOOK
- 解决SCAN的所有问题
- 若没有说明,SACN就是LOOK;C-SCAN就是C-LOOK
- FCFS先来先服务:根据进程访问顺序
- 优化延迟时间
- 磁头访问完扇区之后需要时间准备下一次读取,物理上相邻逻辑上也相邻会导致磁盘空转
- 交替编(扇区)号:减小延迟时间
- 按(柱面号,盘面,扇区)编址:读取连续地址不必移动磁头更加节省时间
- 错位命名:不同盘面上扇区交错,可以给磁头缓冲时间,就像旋转楼梯
- 磁盘管理
- 磁盘初始化
- 低级格式化(物理格式化):划分扇区,扇区分为头、数据、尾,头或尾存储管理数据结构以及校验码
- 磁盘分区:划分柱面
- 逻辑格式化:创建文件系统
- 引导块
- ROM中存储很小的自举装入程序
- 开集系统运行该自举装入程序,找到引导块,完成初始化
- 坏块处理
- FAT表上标记坏块:对操作系统不透明
- 磁盘控制器:维护坏块表,并给予预留的备用好块,对操作系统透明
- 磁盘初始化