第十章 文件系统接口
文件结构
目的
- 便于程序理解文件内容
结构分类
- 无结构:文字流、字节流
- 简单记录结构:线性、固定长度、可变长度
- 复杂结构:格式化文档、多媒体文件
为什么要有文件打开操作?
优点
- 方便文件共享
- 提高文件存取效率
实现打开操作需要的数据结构
- 打开文件表:跟踪打开文件
- 文件指针:指向最后一次读写的位置,每个进程1个
- 打开文件计数器:打开文件的次数
- 文件存储位置:文件在存储设备上的位置信息
- 访问权限:每个进程的访问权限
逻辑文件及其访问方式
✨逻辑文件
- 文件内容组织方式
- 面向用户
✨文件的目录
- 文件组织方式
- 文件属性
✨物理文件
- 文件存储方式
- 面向系统
逻辑文件
- 文件呈现在用户面前的组织结构
- 又称为文件逻辑结构
逻辑文件决定了文件访问方法
顺序访问
- 最简单的访问方式
- 文件信息按照顺序存放,一个记录一个记录依次访问
- 顺序文件
- 典型设备:磁带
直接访问(随机访问)
- 可以直接定位到文件的某条记录进行访问
- 直接文件
- 典型设备:磁盘
顺序文件
- 访问方式:顺序访问
- 依次访问数据,不能直接跳转到文件的指定位置
- 记录不等长
优点
- 节省存储空间
缺点
- 访问效率差
例子
- 记录平均长度:40B,1M条记录长度:40MB
- 访问第1万条记录:必须把0-9999个记录读入后才知道第1万条记录的首址
- 需要读入的数据有40*10001 = 400040B
直接(随机)文件
- 访问方式:直接(随机)访问
- 直接通过计算得到需要读写记录的位置,直接跳转进行文件读写
- 记录等长
优点
- 访问效率好
缺点
- 浪费存储空间
例子
- 记录长度:100B,1M条记录:100MB
- 访问第1万条记录:计算得到第1万条记录的首地址为10000*100 = 100 0000
- 从100 0000处开始读入100B
- 需要读入的数据:100B
索引文件
- 结合顺序文件和直接文件
基本方法
- 为顺序文件建立索引表
- 记录不等长
例子
- 记录平均长度:40B,索引表项大小:4B,1M条记录长度:44MB
访问第1万条记录
- 计算得到第1万条记录的索引项在索引表中的首地址:10000*4 = 40000
- 从索引表地址40000处读入4个字节,内容为第1万条记录在顺序文件中的首地址P
- 从顺序文件地址P处读入40个字节
- 需要读入的数据:4+40= 44B
文件访问方式,即逻辑文件,是影响文件访问效率的因素之一
思考题
如何组织一个输入法文件的存储结构?
文件目录
文件控制块 FCB
- File Control Block
存放操控文件所需的各类文件属性信息
- 文件名,长度,创建时间,存放位置,访问控制权限…
- 类似一个索引项
目录项
存放一个文件的各类属性
- 包括文件在存储设备的存放地址
- 有的系统等同于文件控制块
目录
- 包含着所有文件信息的节点集合
- 根据文件名检索文件的桥梁
- 目录项的有序集合
目录文件
- 目录组织形式
- 目录作为一个文件存在于文件系统
目录相关操作
搜索文件
创建文件
删除文件
打开目录
创建目录
删除目录
……
这些操作和文件本身无关
文件检索过程
文件检索是一个遍历目录项的过程
- 打开目录文件
- 从磁盘读入该目录文件的1个块,该块包含若干个目录项
- 根据文件名遍历内存中的该块,如找到则结束
- 判断该目录文件是否还有物理块没有读入,如有,转2;如果没有,说明该目录中没有该文件名的文件,结束遍历
- 目录项由于经常变化,所以一般不排序
平均遍历目录项数:(1+n)/2
- 不包括文件查不到的情况
目录性能
块 Block:内存和存储设备数据交换的基本单位
- 一个物理块一般为4KB、8KB和16KB等
目录性能:读入尽可能少的物理块
假设
- 目录项大小 = ds bytes
- 目录中最多文件数 = n
- 物理块大小 = b
可计算得
- 目录文件大小 = ds*n bytes
- 目录文件需要的物理块数目 = ds*n/b
- 检索一个文件需要平均读入的块数 = (ds*n/b+1)/2
降低读块数的方法
- 降低ds
- 降低n
降低ds的方法
- 采取i Node,目录文件将变小,类似一张索引表
- 采取i Node,目录文件将变小,类似一张索引表
例子
- 物理块大小为4KB
目录中有1万个文件,每个文件的目录项(FCB)大小为2KB
- 目录文件大小 = 20000KB
- 目录文件需要的物理块数 = 5000块
- 检索文件平均需要访问的物理块数 = 2500.5块
使用的i node = 64B
- 目录文件大小 = 640000B = 625KB
- 目录文件需要的物理块数 = 157块
- 检索文件平均需要访问的物理块数 = 79块
文件保护
文件存取类型
读,写,执行,添加,删除,列表清单
文件的所有者有权控制
- 能做什么
- 由谁来做
访问模式
- 读/写/执行
建立一个组,加入一些用户
对特定的文件或目录,定义适当的访问权限
目录结构
目录结构的设计目标
效率
- 快速定位文件位置
- 提高文件访问效率
命名
- 方便用户使用
- 同名的不同文件
- 不同名的相同文件
分组
- 文件分组(子目录)
- 兼顾效率和方便性
单层目录
- 所有文件都在同一个目录中,只有一级目录:根目录(
/
) 优点
- 结构简单
缺点
检索效率差
- 目录下文件太多
- 不能有同名文件,而且一个文件只能有一个名称
- 不能分组
双层目录
- 每个用户都有自己的目录结构
优点
- 不同用户可有相同文件名的文件
- 比单层目录提高检索效率高
缺点
- 无法分组
- 同一个用户不能拥有相同文件名的文件
从根目录开始到文件的路径,称为路径名
/user4/a
/user1/a
树形目录
- 是双层目录的扩展:2层=>N层
特点
检索高效
- 子目录多导致每个每个目录下文件减少
- 可以分组
- 允许重名
绝对路径
- 从根目录开始的路径名
相对路径
- 从当前目录开始的路径名
- 可以提高检索效率
- 目录项占1个物理块 | 目录文件 | 目录项 | 平均读入块数 | | —- | —- | —- | | / | spell | 0 | | spell | mail | (1+7)/2 = 4 | | mail | prt | (1+4)/2 = 2.5 | | prt | first | (1+2)/2 = 1.5 |
如果使用绝对路径
- 根目录一般在内存
- 所以需要读入4+2.5+1.5 = 8个物理块
如果使用相对路径
- 当前目录在内存
- 读入1.5个内存块
无环图目录
文件共享
- 不同目录中的文件指向同一个物理文件,也就是他们的内容相同
树形目录不能实现文件共享,图型目录可以实现
- 无环图目录
- 通用图目录(有环)
两种共享文件的方式
- 硬链接 Linux
- 符号链接 Windows 即快捷方式
通用图目录
- 有环图
如何保证无环?
- 仅允许指向文件的链接,不允许指向子目录的链接
- 垃圾回收
- 每当加入新链接时,使用环路检测算法判断是否正确
- 优化遍历目录算法,避免对环的重复搜索
第十一章 文件系统实现
文件系统
系统角度
- 对存储设备的空间进行组织和分配
- 负责文件检索、读写等操作
- 目标:存取速度和存储空间效率
用户角度
- 提供按名存取的文件访问机制
- 文件的组织管理
- 目标:方便的文件存储机制
文件系统的层次架构
I/O控制
- 设备驱动程序
- 中断
设备驱动程序
- 控制I/O设备运行
- 向硬件控制器发送专门控制命令
- 操作系统通过设备驱动程序控制设备
基本文件系统
- 物理块读写
- 向设备驱动程序发送控制命令
文件组织模块
- 管理文件、逻辑块和物理块
- 把文件的逻辑地址转换成物理地址
- 管理空闲空间
- 为文件分配物理块
逻辑文件系统
管理文件系统中的元数据
- 除了文件数据外的所有结构数据
- 文件按名存取
- 文件目录组织管理
- 把文件名转换成文件ID,文件句柄
- 管理FCB
- 存储保护
基本概念
- 物理块:一个或2个扇区组成,基本文件读写单位
分区 Partition :磁盘分割成若干个独立的空间,每个空间称为分区
- 主分区:能够安装操作系统的启动分区
- 扩展分区:不能直接使用,必须分成若干逻辑分区
卷(逻辑磁盘)Volume: 磁盘上的逻辑分区
- 一般每个卷都可以建立一个文件系统
文件系统的实现
两种文件系统
- 磁盘文件系统
- 内存文件系统
磁盘文件系统
引导控制块:包含了引导操作系统的各种信息,在主分区才有
- UFS:引导块
- NTFS:分区引导扇区
分区控制块:包含分区信息
- 总的块数、空闲块数、块的大小
- UFS:超级块
- NTFS:主控文件表
- 目录和FCB
- 用户目录
内存文件系统
- 分区表:所有安装分区的信息
- 目录缓冲结构:保存最近访问的目录信息
- 系统打开文件表
- 进程打开文件表
- 文件操作需要用到内存文件系统,该系统目的是通过缓冲技术提高文件系统性能
虚拟文件系统
目的
- 支持多个系统
- 把多个文件系统整合成一个目录结构
- 为用户屏蔽各个文件系统的差异
虚拟文件系统 VFS
- 提供了一种面向对象的方法来实现文件系统
- 为不同类型的文件系统提供了接入VFS的接口
- 为用户提供了统一的系统调用API
文件系统接口
- 统一的应用程序访问问价的接口
- 例如:open, close, read, write
VFS接口
- 为各类不同的文件系统定义VFS接口
- 符合该接口的文件系统都可以接入VFS
网络文件系统
- Network File System
- 用于通过局域网或广域网访问远程文件的软件系统的实现
优点
- 节省存储空间
- 实现共享
连续分配
物理块
读写存储设备的基本单位
- 文件读写操作时,以块为单位进行
- 例如程序需要读取1个字节,则OS把包含该字节的一块都读入
- 优点:减少读写次数,提高效率
存储设备的基本分配单位
- 以物理块为单位,为文件分配存储空间
- 例如即使文件的大小为1字节,也给它分配4096字节(物理块的大小)的存储空间。
和内存的页面大小相对应
- 页面大小:4KB
- 物理块大小:4KB的整数倍
逻辑块
在文件空间中的块
- 大小和物理块一致
- 一个逻辑块存储在一个物理块中
存储空间的分配方式
连续存储空间
- 连续分配
离散存储空间
- 链接分配
- 索引分配
连续分配
- 每个文件在磁盘上占用一组连续的物理块
FCB包含
- 起始块号
- 长度
地址映射
- 逻辑地址 LA:文件内的相对地址
- 物理地址 (B, D):存放在物理块中的地址
- 物理块大小:S
物理地址
- LA ÷ S 的商 = 逻辑块号Q
- LA ÷ S 的余数 = 块内偏移 D
- 物理块号 B = Q + 起始块号
例
- 读取文件中偏移量为12321位置的数据(块大小为4KB),起始块号 = 6
- Q = 12321/4KB = 3
- D = 33
- B = 3 + 6 = 9
优点
支持随机访问
- 可以直接访问指定快块号的物理块
存取速度快
- 上一个块到下一个块的移动距离短
- 适用一次性写入操作
缺点
浪费空间
- 小空间无法分配
文件不能动态增长
- 当文件A的前面有文件存储,后面也有文件存储的时候,文件A的存储空间就被固定了
不利于文件的插入和删除
- 需要移动数据
连续分配的改进
- Veritas File System
基于扩展的文件系统(局部连续)
- 扩展是一组连续的磁盘块集合
- 扩展在文件分配时被分配
- 一个文件可能包含一个或多个扩展
- 需要指向下一个扩展的指针
链接分配
- 文件信息存放在若干个不连续的物理块中
- 文件的所有物理块通过指针连接成链表结构
分类
- 显式链接
- 隐式链接
隐式链接
- 链表的指针隐藏在物理块中,每个物理块中的指针指向下一个物理块
- FCB给出文件的首块地址
- 文件结束于空指针
每个物理块用于存放文件信息的空间变小
- 因为指针本身需要占用空间
- 4KB的物理块,指针有4B,因此物理块只能存放4092B的数据
地址映射
- 逻辑地址:LA
- 物理地址:(B, D)
- 物理块大小:S,指针大小:P
确认物理地址
- 逻辑块号 Q = LA ÷ (S-P) 的商
- 块内偏移 D = LA ÷ (S-P) 的余数
- 块号 B = 链表中第 Q 项对应的物理块块号
优点
- 可以离散存放,提高磁盘的利用率
- 可以动态扩充文件大小
- 便于文件的插入和删除操作
缺点
无法实现随机访问,访问文件慢
- 访问第 i 块,需要把 0-(i-1) 块都读入
- 可靠性差
优化方法:多块集合成组
显式链接
隐式链接的问题
- 指针分散存放
- 为了读入一个指针需要读入整个物理块
显式链接
- 指针集中存放,所有指针存放在一张链接表中
- 先访问链接表,在访问物理块,提高了检索速度
- 链接表一般在文件系统装载时装入内存
链接表大小
- 表项16位(FAT16):最大2*2Bytes = 128KB
- 表项32位(FAT32):最大2*4Bytes = 16GB
不适合大容量的磁盘
- 比如4TB的磁盘,物理块4KB
- 链接表大小 = (4TB/4KB)*4Bytes = 4GB
- 显示链接的例子:FAT32
FAT 32
两个FAT表
每个物理块固定为4KB — 32KB
FAT表的表项占据32位
最大表项数位2项
单个文件不能大于4G
FAT32 管理的单个最大磁盘空间:4KB*2 = 16TB
索引分配
隐式链接分配问题
- 指向下一个块的指针分散在各个块中
改进:文件分配表 FAT
- 系统:存放指针的文件分配表
- 大文件系统会导致文件分配表过大
解决方法:分散的 FAT
- 每个文件一张文件分配表,即索引表
索引分配
索引块
- 存放指向文件每个物理块块号的物理块
- 索引块的第 i 个项:存放第 i 个逻辑块对应的物理块块号
- FCB指向索引块
优点
支持随机访问
- 先访问索引块,在访问具体块
- 离散存放,没有碎片
缺点
- 需要额外的空间存放索引表
- 磁盘访问时间增加,物理块分布在各个磁盘
地址映射
逻辑地址:LA
物理地址:(B, D)
物理块大小:S,指针大小:P
确认物理地址
- 逻辑块号 Q = LA ÷ S 的商
- 块内偏移 D = LA ÷ S 的余数
- 块号 B = 索引表中第 Q 项存放的块号
对于大文件
- 物理块大小 S = 4KB
- 表项大小:4个字节
- 每个物理块存放的块号数目 = 4K / 4 = 1K个
- 单级目录的最大文件 = 1K * 4KB = 4MB
- 解决方法:多级索引
多级索引
把索引块通过链表组织(无长度限制)
- 访问的块号 B = 索引表中第Q1块索引块中第Q2项存放的块号
- 块内偏移 D = R2
- Q1 = LA / (S * (S-P)) 的商
- R1 = LA / (S * (S-P)) 的余数
- Q2 = R1 / S 的商
- R2 = R1 / S 的余数
把索引通过索引组织(有长度限制)
二级索引
- 外层索引表 (一个物理块)
- 内层索引表 (物理块数目 = 外层索引表的项数)
索引和文件大小
假设
- 物理块大小 S = 4KB
- 索引项大小 = 4B
N级索引文件大小 = (1K)*4KB
- 单级索引:4MB
- 二级索引:4GB
- 三级索引:4TB
联合策略
混合多种索引
- 每块4KB
0级索引
- 即FCB中的12个指针指向12个块
1级索引
- 1K块
2级索引
- 1M块
三级索引
- 1G块
空闲空间管理
空闲空间管理方法
- 空闲表
- 空闲链表
- 位示图
- 成组链接
空闲表
空闲区
- 连续的未分配物理块集合
空闲表
- 每个表项对应一个空闲区
内容
- 空闲区的第一块号
- 空闲块的快数
- 适用于连续分配
- 需要占额外的空间
- 分配和回收方式:类似内存的连续分配
空闲链表
- 把磁盘上所有的空闲块连接在一个链表中
分配
- 从链表头依次摘下适当数目的空闲块
回收
- 空闲块加入链表尾部
优点
- 不需要专用块存放管理信息
缺点
- 增加I/O操作,得到连续空间难
位示图
利用二进制位(1bit)来表示一个块的使用情况
- 1表示空闲
- 0表示已分配
所有块都有一个二进制位与之对应
- 分配 1=>0,回收 0=>1
- 所有块对应的位形成位示图
存储位示图本身需要额外的空间,存放在物理块中
- 磁盘空间 = 2Bytes = 1GB
- 块大小 = 2Bytes
- 位数 = 2bits = 32KB
- 必要容易的到连续的物理块
块号计算
假设已知位示图中位置
- 第 i 个字节, 第 j 位
- **块号 k = i 8 + (7 - i)
假设已知块号k
- i = [ k / 8 ]
- j = 7 - k % 8
成组链接
- 结合空闲表和空闲链表
例子:UNIX
- 把空间块分成若干组,每100个块分一组
每组第一个空闲块记录
- 空闲块总数
下一组空闲块首块的块号
- 0表示该组是最后一组
- 本组其他空闲块的块号列表
如果要分配50块空闲块
从前往后分配,从第一组开始分配,分完再分下组
上例中,就是先分配第一组的全部(10块)
再分配第二组的前40块
空闲块回收
- 先把释放的空闲块放到第一组
- 满100块后,在第一组之前再开辟一组
- 原来的第一组变成第二组,新组为第一组
一致性检查
将目录结构数据和磁盘空闲块结构相比较,纠正发现的不一样
空闲块在某个文件的物理块中
非空闲块不属于任意一个文件
一个物理块属于多个文件
空闲空间整理
- 把不连续的空间快集合在一起
- 有利于给文件分配连续的物理块
第十二章 大容量存储器结构
✨ 传输时间,磁盘调度
磁盘结构和管理
磁盘结构
盘片
- 存储数据的介质
- 正反两面可以存储数据
磁头
- 读写数据,沿磁盘半径移动
- 有多少盘面就有多少磁头
主轴
- 马达驱动,使盘片旋转
- 固定速度旋转
- 接口
- 磁盘控制器
- 缓冲区
盘片结构
磁道
- 磁头在盘片表面划出的圆形
- 盘面划分为数目相等的磁道
- 从盘面外缘“0”开始编号
扇区
- 磁道被等分为若干个弧段,称为扇区
- 扇区大小:512字节
柱面
- 具有相同编号的磁道形成一个援助,称为柱面
- 有几个磁道就有几个柱面
地址映射关系
- 块号:LBA
磁盘地址:(C, H, S)
- 柱面 Cylinder
- 磁头 Head
- 扇区 Sector
- SPT:每个磁道最大扇区数
- HPC:最大磁头数
✨ 磁盘访问时间
磁盘旋转速度:60 — 250 转/秒
- RPM:每分钟旋转次数
定位时间/随机访问时间
寻道时间:移动磁臂到所需磁道时间
- 平均寻道时间:1/3 磁道移动 (1-4ms)
旋转延迟:等待扇区移动到磁头下时间
- 平均旋转1/2圈时间:1/(2*RPM/60)
传输时间
- 传输率:传输总字节数除以传输时间
磁盘访问时间
随机访问时间
- 寻道时间
- 旋转延迟时间
- 传输时间
- 系统开销时间
例题
- 4KB 块,7200RPM 磁盘,5ms 平均寻道时间,1Gb/sec 传输率,0.1ms 控制开销
5ms + 1000/(2*7200/60)ms + 4KB / 1Gb/sec + 0.1ms
= 5.1ms + 4.17ms + 0.03ms
= 9.30ms
- 4KB 块,7200RPM 磁盘,5ms 平均寻道时间,1Gb/sec 传输率,0.1ms 控制开销
磁盘管理
低级格式化
- 将磁盘分成扇区,以便磁盘控制器读写
分区
- 将磁盘分成分区
- 主分区和扩展分区
高级格式化
- 逻辑格式化,创建文件系统
引导快
- 自举系统保存在 ROM 中
- 自举程序装载引导快程序
磁盘调度和RAID
磁盘调度
- 目标:减少磁盘访问时间
访问时间
- 寻道时间:磁头移动到访问扇区所在磁道的时间
- 旋转延迟时间:将访问扇区转到磁头下的时间
- 传输时间:将数据从磁盘送到内存的时间
- 寻道时间最小化,寻道时间 ≈ 寻道距离
假定有一个序列(0 — 199 道)
- 98, 183, 37, 122, 14, 124, 65, 67
- 磁头当前位置在 53
先来先服务算法 FCFS
- 按照请求提交时间访问
优点
- 简单、公平
- 易实现
缺点
- 寻道时间长
最短寻道时间优先算法 SSTF
- Shorted Seek Time First
- 每次移动到离现在位置最近的磁道
优点
- 寻道时间短
缺点
- 存在饥饿
- 磁头频繁变换移动方向
- 增加寻道时间
扫描算法 SCAN
- 磁头从磁盘一端向另一端移动,沿途响应服务请求
优点
- 同一方向扫描,寻道时间短
缺点
- 有的请求等待时间长
循环扫描算法 C-SCAN
单项处理请求
- 磁头从磁盘外道(0道)移到内道过程中处理请求
- 内道移动到外道的过程中不处理请求
优点
- 更均匀的等待时间,从磁道199移动道0的时间很短
- 总的磁头移动为382柱面
循环 Look 算法 C-LOOK
- C-SCAN 的变形
- 磁头之移动到一个方向上最远请求为止,而不是继续到磁盘尽头
- 总的磁头移动为322柱面
磁盘调度算法的选择
性能主要依赖于请求的数量和类型
- 磁盘服务请求很大程度上受文件分配方法影响
- SSTF 较为普遍且很有吸引力
- SCAN 和 C-SCAN 适合磁盘大符合系统
- SSTF 或 LOOK 是比较合理的缺省算法
第十三章 I/O 系统
举例说明 spooling 技术