§4 文件系统
文章目录
C1 文件
1)文件名:名称.扩展名。命名规则:字母/下划线/其他允许的字符
- Unix允许有任意长度扩展名/没有扩展名/多个扩展名,仅仅作为提示使用
- Windows则需要注册扩展名,并且规定指定程序打开拥有对应扩展名的文件
- Unix区分大小写,而老的文件系统不支持(如MS-DOS及FAT-16(Win-95),FAT-32(Win-98))
- 文件名长度一般不超过8个字符,但很多系统支持长文件名
2)文件逻辑结构:用户访问文件的方式,分流式结构与记录结构、树型结构
3)文件类型:
- 数据形式:源文件、目标文件、可执行文件
- 保护级别:只读、读写、执行、不保护
- 按逻辑结构:有结构、无结构
- 存储物理结构:顺序文件、链接文件、索引文件
- UNIX:
- 普通文件:文本文件、二进制文件
- 目录文件
- 特殊文件/设备文件:字符设备文件、块设备文件
4)文件访问:
-
顺序访问:按顺序读取全部字节或记录,不跳过任何内容。用在磁带上。
-
随机访问:通过读写位置访问
- Unix和Windows使用seek设置读取光标位置,其他系统在read时给出起始位置
5)文件属性:以下为常见属性
- 基本信息:
- 文件名、文件逻辑结构、物理结构(顺序、索引)、物理位置、文件大小、类型
- 访问控制
- 所有者、访问权限
- Unix系统使用9位二进制码保护一个文件,3个用于所有者,3个用于同组其他成员,3个用于其他人,由读-写-执行3位组成(称rwx位)
- 使用信息:
- 创建时间、修改时间
6)文件操作:增删,开关,读写续,设置光标,重命名,读写文件属性
- 成功打开文件返回一个整数(文件描述符),否则返回错误码
C2 目录
0)目录;文件说明索引组成的用于文件检索的特殊文件,主要内容为文件访问和控制
1)单级目录系统:在根目录下存放所有的文件
-
优点:结构简单
-
缺点:存在命名冲突(不同文件同一文件名,同一文件多个文件名);不利于共享
两级目录系统:根目录下再设用户目录,适合多用户简单系统
2)多级目录系统:使用目录树组织文件及其子目录
- 目录级别太多会增加路径检索时间
3)路径名:
-
绝对路径:从根目录到文件的路径
-
相对路径:常和工作目录/当前目录一同使用,
.
表示当前目录,..
表示父目录(根目录中
..
指向自身 -
分隔符:Unix:
/
Windows:\
MULTICS:>
-
在必要时可使用切换工作目录调用。对于库过程,需要在返回前切回原工作目录
4)目录操作:增删,开关,读,重命名,链接操作
C3 文件系统
1)文件控制块
:描述文件属性
文件描述符
:不同于控制块,用于标识一个打开的文件,是一个整数
2)文件物理结构
:文件在存储介质上的存放方式
- 连续结构:适合低频修改的文件
- 优点:实现简单(只需要记录第一块的地址和快数);读写性能好
- 缺点:容易产生磁盘碎片;不利于动态修改的文件;难以扩大空间,在创建文件时需要先指定文件最终大小。由于文件系统UDF格式中使用30位的数描述文件大小,限制单个文件最大为1GB,故需要多个文件块来描述一个文件,称为extents
- 串联结构:为每个文件构建文件块链表,每块第一个字存储下一块的指针
- 优点:空间利用率高;利于动态扩充和修改;顺序存取效率高
- 缺点:不便于随机访问;链表指针占用一定空间,若因此导致文件大小不是2的幂次,可能带来性能损失;可靠性存在问题,若一个块损坏该文件将半身不遂
- 索引结构:链表分配中的块指针存储到内存中的一个表上。目录中记录索引表块号
- 优点:即可顺序存取又可随机存取;满足动态修改和增长;空间利用率高
- 缺点:占用空间;索引开销大
- 索引文件分索引区(存放索引表)和数据区(存放文件数据)
- 多级索引:
- 允许使用二级索引指针指向一个存放一级索引指针的磁盘块
3)目录实现:
-
简单目录:使用一个固定大小的目录项列表,目录项记录文件名和文件控制块,或文件控制块的地址(inode,间接法)
- i节点目录的目录项为文件名和i节点地址,i节点中描述文件属性和磁盘块地址
-
变长文件名:使用长目录项浪费空间,使用变长目录项不适合删除,一般使用一个文件名指针指向一个包含全部文件名的堆,位于文件末尾
-
快速查找:创建散列表对文件名进行散列,通过散列表获取指向目录项的指针
- 若查询在小范围内进行,可以考虑将查询结果加入Cache
4)共享文件:
- (硬)链接:一个文件存在于多个目录下,使用一个计数器计数包含该文件的目录数
- 不能针对目录创建,避免造成环路。也不能针对不存在的文件创建
- 解除链接:解除目录项与指定路径的链接,若只有一个链接,则删除文件
- 在拷贝磁盘时,若一个文件被共享(则拥有多个路径),可能会被多次拷贝(符号链接也存在)
- 符号链接:使用一个文本文件保存指向目标文件的路径(即Windows下的快捷方式)
该链接方式甚至可以链接不同机器上的文件,只需要提供网络地址- 当原文件被删除,链接文件将无法再找到该文件
5)日志结构文件系统(LFS):提升写磁盘速度,解决零碎写操作(为避免中断影响文件一致性,i-node必须实时更新)带来的写磁盘速度降低
-
以日志形式组织磁盘
-
定期/特殊调用时将内存中未决的写磁盘操作保存到一个单独的段,填满后写入日志的一个邻接段。
- 段:大小为多个块,包含数据块和元数据的日志。段开头有段摘要,记录每个数据库的信息
-
写操作不会修改原来的数据块。故不需要更新inode,而写入新的inode。
-
在内存中缓存一个i节点图(表),表项i指向第i个i节点。定期将i节点写入磁盘的checkpoint区域以更新i节点表。
-
失效恢复时,从checkpoint找回i节点表,随后找回最后一个checkpoint之后的数据
不需要检查整个磁盘,恢复速度快
-
清理线程根据segment的访问频度和清理的利用率收益,定期进行磁盘压缩,清除不必要的节点和块
- 冷segment,利用率高于75%将回收
- 热segment,利用率高于15%间回收
-
适用场景:
- 适合大量小的写操作
- 不适合磁盘空间小、写操作随机的场景
7)虚拟文件系统(VFS):Unix系统使用虚拟文件系统来兼容多个不相容系统
-
用户进程使用POSIX标准文件接口执行系统调用,均指向VFS
-
v节点用于描述文件信息,保存在内存,对应文件描述符表中一项。顶层使用文件描述符进行操作
-
VFS调用具体的文件系统执行操作(v节点指出)
C4 管理和优化
1)磁盘空间管理
- 分块存储:将文件按块(1-4KB)分配
- 空闲区管理:
- 空闲块链表:一个块中保存多个空闲块号和指向下一块的指针
- 另一种方式是记录连续的空闲块区,记录起始地址址和块数
- 在内存中保留一个半满的空闲区指针块可以避免临时文件带来的磁盘IO
- 空闲区位图:占用空间小,只有在磁盘块满时空闲块链表才小
- 使用位图和分页系统结合可把位图放到虚存中。位图可以减少磁盘臂移动
- 空闲块链表:一个块中保存多个空闲块号和指向下一块的指针
- 磁盘配额:使用打开文件表记录打开的文件和所属用户,表项指向一个配额表,记录用户的磁盘配额。可以临时超出软限制,但是不能超出硬限制。
2)文件备份:对特定目录下的文件进行备份
-
使用回收站
-
增量转储:短期内备份只对文件的更改进行转储
-
压缩存储:压缩后转储存。备份中的坏点可能导致压缩文件损坏
-
快照:复制关键结构,此后文件的修改会复制到块中。用于备份活动文件
-
物理转储:全相当于复制所有磁盘块。需要考虑略去空闲块(记录块初始地址)和坏点的处理。无法指定目录,无法增量转储
-
逻辑转储:从指定目录开始,递归转储自给定基准日期后更改的文件和目录。
-
通向一个待转储文件路径上的目录都会被转储(便于恢复时整体迁移,以及恢复指定的单个文件)
-
维护一个以i节点号为索引的位图。
1° 从起始目录开始检测所有目录项,标记已修改文件的i节点和所有目录
2° 二次遍历,若目录下没有被标记文件,删除标记(可后序进行)
3° 转储目录,使用目录的属性作为前缀
4° 转储文件,使用文件属性作为前缀
-
对于链接文件只需要被恢复一次,然后重新链接
-
不需要转储文件中的“空洞”
-
不需要转储特殊文件、命名管道等
-
2)文件系统一致性:
- 块的一致性检查:建立两张表,第一张记录每个块在文件i节点中出现次数,第二张记录每个块在空闲区表中出现的次数。
- 一致时块在两表的记录中一个为1,一个为0。
- 若两表都为0:块丢失,加入空闲区即可
- 若空闲表中出现多次:去除多次出现
- 若节点表中出现多次:复制一份,分给多个文件,需要告知用户检查
- 目录系统检查:从根目录开始递归检查每个文件链接到的目录树,符号链接不计数,然后对比文件i节点中硬链接数检查。需要将链接数修改为正确值
- 通常还对怪异的访问权限进行报告
3)文件系统性能:
- 高速缓存:块高速缓存,缓冲区高速缓存
- 系统对高速缓存的引用不频繁,故可以使用LRU置换。
- 由于最近修改的块被放在在LRU链的尾端,待其被写回磁盘可能需要很长时间,可能导致文件一致性问题
- 使用LRU仍需考虑块的特殊性,有一些块不会被频繁引用,应在LRU链头
- 对于关系文件一致性的块,修改后应该立即写回磁盘
- UNIX使用sync系统调用强制写回,并且30s就执行一次。Windows使用写通(Write through)方式,在修改时写回
- 系统对高速缓存的引用不频繁,故可以使用LRU置换。
- 块预读取:预先读取下一磁盘块,对于顺序读取文件有效。需要一个位追踪文件的读取方式,在发生一次顺序读取时置位,以便下次打开时顺序读取
- 减少磁盘臂运动:顺序访问的块放在同一柱面
- 在磁盘中部存储i节点,或者将柱面分组,每组都有i节点。文件创建时可以选择一个i节点,然后在该节点所在的分区上寻找空闲块。如果没有再到相邻区上找
4)碎片整理:除去文件间空穴,使文件连续存储
- 当分区末端有连续大量空闲空间时运行地更好(可以为整理预留空间)
- 部分文件不需要被整理,因为移动的管理成本大于整理收益
5)文件存取访问控制:
- 存取控制矩阵:Unix 的9位rwx标识符
- 存取控制表
- 用户权限表
- 口令
C5 虚拟文件系统
1)虚拟文件系统(VFS)
:同一管理多个文件系统。定义了一些列抽象文件系统接口
2)VFS超块:描述接入的系统
-
文件系统类型和信息
-
设备:文件系统的块设备标识符
-
索引节点指针:mounted指向文件系统第一个节点,covered指向系统挂装目录
-
数据块大小:文件系统数据块大小
-
超块操作集:操作超块的程序的指针,用于VFS读取,写入索引节点和超快
3)VFS索引节点:对索引节点的抽象
- 设备标识符:索引节点所在的设备
- 索引编号:同一设备中编号唯一
- 模式:对象类型和访问权限
- 用户标识符、时间属性、块大小
- 锁定位、修饰位等功能控制
- 索引节点操作集:操作节点
4)文件系统需要注册到VFS上才可使用
- file_system_type保存了支持的文件系统
- 非内建的可支持系统,会尝试加载可装载模块来支持该系统
C6 文件系统实例
MS-DOS
1)读取:open系统调用,识别路径后读入
2)目录大小可变,目录项大小固定32字节。(文件名+属性+创建时间+起始块+大小)
属性:
- 只读
- 隐藏
- 存档:存档程序存档后清零,其他程序修改后置位,用于备份
- 系统:系统文件也被引产,不能被del命令删除
时间:±2s,只有2字节
日期:最高年份2107年
大小:32位数,理论上最大4G(但是实际2G)
目录项中有10字节的保留空间
3)文件系统FAT
-
通过内存中的文件分配表来跟踪文件块,目录表项指示第一个文件块的编号
-
FAT-12 FAT-16 FAT-32(其实只用了28位) exFAT(现代系统,可用于OS X和Windows)
-
磁盘块大小为512字节倍数,不同版本地址尾数不同,上限也不同。MS-DOS支持4个分区。例如FAT-32支持(理论上)16T的地址空间,对于2G的分区就可以使用4KB的块,而FAT-16要支持2G分区就只能使用32KB的块。
UNIX V7
1)树组织,加上链接是有向无环图
2)UNIX目录中为每个文静保存一项(文件名和i节点)
3)i节点容纳10个磁盘地址,大文件可以使用一个地址指向(一次间接块含附加地址的磁盘块)。再大的文件可以使用一个地址指向二次间接块,二次间接块含有指向一次间接块的地址,还可以有三次间接块
CD-ROM
一次性介质,不需要空闲区
ISO-9960
1)开头16块是保留块,制造商再其中放入引导程序
2)基本卷描述符:系统标识符(32B),卷标识符(32B),发布标识符(128B),数据预备标识符(128B),3个文件名(存储概述、版权、文献信息),块大小。指示根目录。
3)目录长度可变,目录项长度可变(10-12域)。二进制数字按大小端方式写2次。最后的目录项有一个标识表示末尾。
4)可以引用同一CD-ROM集中另一个CD-ROM上的地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XczXwK9m-1591029709669)(E:\Typora笔记\文件图片\CD-ROM.jpg)]
5)限制Ⅰ级:8+3字符文件名,文件连续,目录名8字符且无扩展名。
限制Ⅱ级:名称可31字符
限制Ⅲ级:文件可不连续,文件可分段,同一块可出现在多个文件
6)目录最多嵌套8层
Rock Ridge扩展
PX-POSIX属性 PN-主次设备号 SL-符号链接
NM-替代名 CL-子位置 RE-重定位(这三个消除了嵌套深度限制)
PL-父位置 TF-时间戳
Joliet扩展
长文件名 Unicode字符集 嵌套深度增加 目录可带扩展名