目录
- 第4章:文件系统
- 概述
- 4.1 文件
- 4.1.1 文件命名
- 4.1.2 文件结构
- 4.1.3 文件类型
- 4.1.4 文件访问
- 4.2 目录
- 4.2.1 一级目录系统
- 4.2.2 二级目录系统
- 4.2.3 层次目录系统
- 4.2.4 路径名
- 4.3文件系统的实现
- 4.3.1 文件系统布局
- 4.3.2 文件与磁盘
- 4.3.3 ⭐文件的实现
- 4.3.4 ⭐目录的实现
- 4.3.5 ⭐共享文件
- 4.4文件系统管理和优化
- 4.4.1 ⭐磁盘空间管理
- 4.4.2 ⭐文件系统备份(backup)
- 4.4.3 ⭐文件系统的一致性
- 4.4.4 文件系统性能
- 4.5文件系统实例
第4章:文件系统
概述
长期存储信息的三要素
存储大量信息
进程终止时信息不丢失
允许多个进程并发访问
文件
进程创建的信息逻辑单元,是信息存储单元,存储在辅存上的命名相关信息集合
文件系统
OS中管理文件的部分,用于存储与组织文件及其所含数据的方法,便于查找和访问
基本功能
展示文件和目录的逻辑(抽象)视图
存储设备的高效使用与访问
支持分享和保护
4.1 文件
4.1.1 文件命名
最多255个字符,字母、数字和特殊字符,区分大小写
4.1.2 文件结构
字节序列
记录序列
树
4.1.3 文件类型
普通文件:包含用户信息的文件
ASCII文件:用于显示、打印、编辑
二进制文件:可执行文件和存档文件
目录:管理文件系统结构的系统文件
UNIX
字符特殊文件:和I/O有关,用于串行I/O设备,如打印机
块特殊文件:用于磁盘类设备
4.1.4 文件访问
顺序访问
从头开始读取所有字节/记录
不能跳转,可以倒回或后退
用磁带时很方便
随机访问
任意顺序下读取字节
对数据库系统很重要
指定从何处开始读取的两种方法
先读取数据,再移动文件标记
先移动文件标记(通过 seek 操作),再读取数据(Unix和Windows)
4.2 目录
4.2.1 一级目录系统
一个目录包含所有文件
优点
实现简单,容易理解
缺点
命名问题
- 所有文件名唯一
- 名称冲突问题(同一分组的两个用户不能创建同名文件)
分组问题
- 大文件系统中难以记住文件名
4.2.2 二级目录系统
每个用户有独立目录
优点
解决命名冲突
搜索效率高
支持文件共享和保护
缺点
- 未解决分组问题
4.2.3 层次目录系统
叶节点是文件,内部节点是目录。每个用户有一个当前工作目录
优点
解决命名冲突
搜索效率高
实现文件共享和保护
实现分组
一个点表示当前目录,两个点表示父目录
4.2.4 路径名
Windows用
\,UNIX用/,MULTICS用>例子:当前目录的绝对路径是
/home/user,寻找一个绝对路径为/home/user/bin/test.txt的文件- 相对路径:
bin/test.txt<=>./bin/test.txt<=>../user/bin/test.txt
- 相对路径:
4.3文件系统的实现
4.3.1 文件系统布局
MBR+分区表+磁盘分区
每个磁盘分区 = 引导块 + 超级块 + 空闲空间管理 + i节点 + 根目录 + 文件和目录
OS启动流程
BIOS读取MBR
MBR中程序找到活动分区
读取活动分区引导块
引导程序执行核心文件
4.3.2 文件与磁盘
文件
文件是连续的字节
- 输入输出以字节为单位
文件系统定义块大小
块大小=2^n*扇区大小
连续的扇区组成块
文件系统将磁盘看作块的数组
文件以块为单位分配空间
文件系统管理空闲块
磁盘
磁盘是扇区数组
输入输出以扇区为单位
数据必须存储在扇区
4.3.3 ⭐文件的实现
⭐连续分配
优点
实现简单(仅需起始扇区号和文件长度)
读写性能优异(适合顺序访问和直接访问)
缺点
产生外部碎片(换进换出时文件大小可能不一致)
文件创建时必须知道文件最大大小,否则文件无法增大
适合CD-ROM,DVD和其他一次性写入的光学介质
文件大小预先确定
文件不会删除
⭐链表分配
每个块的第一个字指向下一个块的位置
优点
没有外部碎片
目录项简单(只需起始地址)
只要有空闲块文件就可以继续增大
适合顺序访问
缺点
随机访问很慢(访问块号为n的块要从头遍历链表)
块数据大小不是2的幂(指针占用)
File Allocation Table
将块的指针字节放入索引表FAT
每个分区开头预留空间放FAT
FAT保存在内存中,查找很快,但是可能占用巨大的内存空间
FAT
一个块有一个FAT项,按照块编号顺序排列
每个块项包含下一个块的地址
OS/2和MS-DOS系统使用
优点
块利用率高,整个块可分配数据
适合随机访问(只需遍历FAT)
目录项简单(只需起始块号)
缺点
FAT必须全部加载到内存
若disk size=200GB,block size=1KB,FAT entry size=4bytes
块数=200GB/1KB=200M,而一个块要一个FAT项,则FAT总大小=200M*4B=800MB
⭐i节点
每个块都有i节点,i节点存放文件属性和文件所有块的地址(指针)
只在对应文件文件打开时才将其i节点加载到内存,节省内存
多级索引分配(多级i节点)
i节点的一个地址指向一个间接块,间接块的一个地址可以指向数据块地址或者继续指向下一个间接块地址
优点
查找和随机访问快
没有外部碎片
仅在文件打开时才把i节点加载到内存,节省内存
缺点
- 索引结构的开销
4.3.4 ⭐目录的实现
数据块存储目录项列表,目录项提供查找磁盘块所需的信息
文件属性的位置
⭐存放在目录项
目录项大小固定
目录项包含磁盘地址和文件属性
MS-DOS和Windows使用
⭐存放在独立数据结构(如i节点)
目录项包含文件名和i节点号
i节点包含文件属性
Unix使用
长目录名问题
法1:固定长度文件名
优点:最简单
缺点:浪费空间
法2:可变长度目录项(定长+可变)
优点:节省空间
缺点
文件删除产生外部碎片,需要压缩
长目录项可能跨页,读取时引发page fault
法3:堆分配文件名(目录项定长,包含指向堆中文件名的指针)
优点
删除简单,无外部碎片,不用压缩
不用填充字符
缺点
需要堆管理
仍存在跨页问题
目录中搜索文件
线性搜索
哈希搜索
缓存搜索
碎片
外部碎片:还没分配出去的(如段、文件分配)
内部碎片:已经分配出去,指明属于哪个进程(如块、页分配)
4.3.5 ⭐共享文件
共享文件之间的连接叫link,使文件系统成为有向无环图(DAG)
问题
冗余:目录若包含磁盘块地址,则目录A和B都要保存,存储浪费
不一致:B追加新块,可能C不更新
解决
法1:硬链接
所有目录指向同一i节点,共享同一i节点
删除
i节点有一个引用计数器,统计指向该节点的文件目录的数量
当计数器值为0时,回收块
删除文件不影响硬链接(删除文件只是断开该文件与i节点的联系)
限制
跨文件系统限制(i节点号在同一文件系统唯一,跨文件可能冲突)
硬链接目标文件移动到另一系统,系统会进行复制,并调整链接计数
只有超级用户可以创建硬链接
法2:符号链接
创建LINK文件,内容是目标文件的路径名(相当于快捷方式)
符号链接占用1个i节点和至少1个磁盘块
删除
当删除真实文件时,和普通文件删除一样,而符号链接仍存在但是会失效(broken)
普通文件删除
移除目录项
块回收进空闲链表
删除符号链接不会影响文件
问题
额外的磁盘空间和额外i节点来存放link文件
路径解析的开销
Dangling Link:当目标文件移动或删除,符号链接失效
转储到磁带时,可能会出现同一文件的多份拷贝
4.4文件系统管理和优化
4.4.1 ⭐磁盘空间管理
文件的两种分配策略
连续分配 - 分段式存储
问题:文件增大时,需要把将文件在磁盘换进换出,开销大
分块分配 - 分页式存储
块大小
块大小=(2^n)*sector大小,块内扇区必须连续大块
优点:数据传输性能好
缺点
会产生内部碎片(平均浪费半个块)
更低的磁盘利用率
小文件会产生大量浪费
小块
优点:更高的磁盘利用率
缺点
寻道次数更多,文件访问慢
数据传输性能差
记录空闲块
法1:磁盘块链表
把保存空闲块号的磁盘块用链表串起来
改进:计数法。不保存一系列空闲磁盘块地址,而是保存第一个空闲块地址和空闲块总数。想知道每段连续块只要保存连续块的起始地址和连续空闲块数即可
法2:位图
一个空闲块对应位图的一位
例:磁盘大小
16GB,块大小1KB总共需要
16GB/1KB=2^24个块磁盘链表(假设一个磁盘块号长度是
32bits):一个块能存1KB/32bits=256个块号,其中有一个是指针,所以一个块能存255个块号。2^24/255=65793个保存空闲块号的磁盘块位图:需要
2^24bits。而一个块大小是1KB,即2^13bits。总共需要2^24/2^13=2^11个位图块
4.4.2 ⭐文件系统备份(backup)
备份的目的
从意外的灾难中恢复
从错误的操作中恢复
备份的位置:三级存储(Tertiary Storage),如磁带
优点
空间大
成本低
适合顺序访问
缺点
- 随机访问性能差
备份的问题
备份的内容
二进制程序,特殊I/O文件通常不备份。备份用户数据和配置文件
增量转储(dumpling)
不备份上次备份后未修改的文件
每月进行所有文件备份,每日进行修改的文件备份
写入磁带前压缩数据
备份在线活跃文件
- 不可系统离线进行备份
转储的策略
物理转储
从块0开始,按顺序把所有块写入磁带
优点
简单
速度快
缺点
不能跳过特定目录
不支持增量转储
难以恢复单个文件
逻辑转储
从一个或几个指定目录开始,递归地转储基准日期后有所更改的全部文件或目录
优点:可以恢复特定文件或目录
4.4.3 ⭐文件系统的一致性
检查文件系统一致性的程序
Windows:scandisk
UNIX:fsck
一致性检查的类型
⭐块的一致性检查
建立引用计数表和空闲计数表
表1:记录每个块被文件引用的次数
表2:记录每个块是否在空闲链表
不一致状态
missing block:加入空闲链表
duplicate block in free list:修正空闲链表
duplicate data block:比如块1被文件A和B同时引用:分配新空闲块,将块1复制过去,把块1留给A,把块2给B。再通知用户错误
块归属冲突:从空闲链表移除
文件(目录)的一致性检查
流程
使用文件计数器而非块计数器
从根目录开始递归向下遍历树结构,为每个文件(包括硬链接)增加计数
对比计数和i节点链接数量
问题:引用计数器过大或过小
解决:校正引用计数,让i节点的链接计数更改为实际目录数量
4.4.4 文件系统性能
Caching
减少磁盘 I/O 延迟
块提前读
提高buffer cache命中率
减少磁盘臂移动
避免寻道时间开销
4.5文件系统实例
FAT-32较FAT-16的优点
支持更大的磁盘
FAT-32分区更少
相同分区大小下,FAT-32使用更小的块
⭐UNIX V7文件系统
使用多级索引分配
读取文件操作
- 先读取文件的i节点,再读取目录/块