第十三章 文件系统
13.1 文件系统和文件
-
文件系统的概念
-
文件系统是操作系统中管理持久化数据的子系统,提供数据存储和访问功能。
- 组织,检索,读写访问数据
- 大多数计算机系统都有文件系统
- Google也是一个文件系统
-
文件是具有符号名,由字节序列构成的数据项集合
- 文件系统的基本数据单位
- 文件名是文件的标识符号
-
文件系统的功能
- 分配文件磁盘空间
- 管理文件块(位置和顺序)
- 管理空闲空间(位置)
- 分配算法(策略)
- 管理文件集合
- 定位:文件及其内容
- 命名:通过名字找到文件
- 文件系统结构:文件组织方式
- 数据可靠和安全
- 安全:多层次保护数据安全
- 可靠:
- 持久保存文件
- 避免系统崩溃,媒体错误,攻击等
- 分配文件磁盘空间
-
文件属性
13.2 文件描述符
-
文件描述符是打开文件的标识,即文件描述符是操作系统在打开文件表中维护的打开文件状态和信息,其中包括:
1.文件指针
a. 最近一次读写位置
b. 每个进程分别维护自己的打开文件指针
2.文件打开计数
a. 被打开文件当前被打开的次数
b. 最后一个进程关闭文件时,将其从打开文件表中移除
3.文件的磁盘位置
a. 缓存数据访问信息
4.访问权限
a. 每个进程的文件访问模式(只读、可写等) -
文件的用户视图和系统视图
- 文件的用户视图:
- 持久的数据结构
- 文件的用户视图:
-
系统提供的访问接口:
- 字节序列的集合
- 系统不关心存储在磁盘上的数据结构,应用程序应该关心
-
操作系统的文件视图:
a. 数据块的集合
b. 数据块是逻辑存储单元,而扇区是物理存储单元
c. 块大小与扇区大小可以不相等,通常是几个扇区构成一个数据块
用户视图到系统视图的转换
- 进程读文件:
a. 获取字节所在的数据块
b. 返回数据块内对应内容
- 进程写文件:
a. 获取数据块
b. 修改数据块中对应内容
c. 写回数据块
- 文件系统中的基本操作单位是数据块
访问模式
索引文件示例
文件内部结构
文件共享和访问控制
语义一致性
21.3 目录,文件别名和文件系统种类
- 分层文件系统
- 目录操作
- 目录实现
- 文件别名
- 硬链接:多个文件项指向一个文件,删除到最后一个指向他的文件名时删除实体
- 软链接: 快捷方式指向其他文件,删除快捷方式不影响实体,删除实体则快捷方式无效了
- 文件目录中的循环
- 实际操作系统中通常限制路径可遍历文件目录的数量,超过指定长度停止检索
- 名字解析(路径遍历)
- 文件系统挂载
- 文件系统的种类
- 1.磁盘文件系统
a. 文件存储在数据存储设备上,如磁盘
b. 例如:FAT、NTFS、ext2/3,ISO9660等 - 2.数据库文件系统
a. 文件特征是可被寻址(辨识)的
b. 例如WinFS - 3.日志文件系统
a. 记录文件系统的修改/事件 - 4.网络/分布式文件系统
a. 例如:NFS,SMB,AFS,GFS
b. 文件可以通过网络被共享,文件位于远程服务器,客户端远程挂载服务器文件系统,标准系统文件访问被转换成远程访问,要有标准文件共享协议。
c.标准文件共享协议有,NFS for Unix; CIFS for Windows
d. 面临更多挑战,例如客户端和客户端上的用户辨别起来很复杂、一致性问题、错误处理模式(出了错误之后处理也会被原来复杂)。 - 5特殊/虚拟文件系统
13.4 虚拟文件系统
虚拟文件系统的提出是为了面对多种不同的文件系统对上提供一种统一的接口。
-
文件系统的实现
-
分层结构
- 虚拟(逻辑)文件系统(VFS,Virtual)
- 虚拟(逻辑)文件系统(VFS,Virtual)
-
目的:
1.对所有不同文件系统的抽象 -
功能:
1.提供相同的文件和文件系统接口(对上)
2.管理所有文件和文件系统关联的数据结构
3.高效查询历程,遍历文件系统
4.与特定文件系统模块的交互(对下) -
文件系统基本数据结构
- 文件卷控制块(Unix:superblock)
a. 每个文件系统一个
b. 文件系统详细信息
c. 块、块大小、空余块、计数/指针等(这里的块指数据块) - 文件控制块(Unix:vnode || inode)
a. 每个文件一个
b. 文件详细信息
c. 访问权限、拥有者、大小、数据块位置等 - 目录项(Linux:dentry)
a. 每个目录项一个(目录和文件)
b. 将目录项数据结构及树形布局编码成树形数据结构
c. 指向文件控制块、父目录、子目录等
- 文件系统的组织视图
- vol,文件卷控制块
- dir,目录项
- file,文件控制块
注意,上面的Disk为磁盘,其中的颜色与上面的颜色一一对应
上述数据结构需要持久存储在外存中,当需要时加载进内存:
1.卷控制块:当文件系统挂载时进入内存;
2.文件控制块:当文件被访问时加载进内存
3.目录项:遍历一个文件路径时进入内存
13.5 文件缓存和打开文件
-
多个位置都存在磁盘缓存,操作系统主要讨论内存中的数据块缓存。
-
内存虚拟盘:用内存来虚拟一个磁盘
-
数据块缓存:
-
数据块按需存入内存
a.提供read()操作
b. 预读:预先读取后面的数据块 -
数据块使用后被缓存
a. 假设数据将会再次用到
b. 写操作可能被缓存和延迟写入(可能先写到内存中) -
两种数据块缓存方式
a. 数据块缓存
b. 页缓存:统一缓存数据块和内存页
-
文件系统中打开文件的数据结构
- 每个被打开的文件都有一个文件描述符,包含了文件状态信息:目录项、当前文件指针、文件操作设置等
- 每个进程有一个进程打开文件表,系统还有一个系统级的打开文件表,有文件打开时,有打开文件的文件卷就不能被卸载。
- 有了打开文件表,文件系统可以提供打开文件锁,用于协调多进程的文件访问:
- 强制:根据锁保持情况和访问需求确定是否拒绝访问
- 劝告:进程可以查找锁的状态来决定怎么做
13.6 文件分配
-
文件大小:
- 大多数文件都很小:
a. 需要对小文件提供很好的支持
b. 块空间不能太大 - 一些非常大的文件
a. 必须支持大文件(64位文件偏移)
b. 大文件访问必须高效
- 大多数文件都很小:
-
文件分配:
-
本质是如何表示分配给一个文件数据块的位置和顺序
-
分配方式:
- 连续分配:
- 文件头指定起始块和长度
- 分配策略:最佳匹配、最先匹配
- 优点是文件读取表现好,高效的顺序和随机访问,缺点是碎片,文件增长问题,文件增大时的策略比较棘手
- 链式分配:
- 文件以数据库链表方式存储
- 文件头包含了到第一块和最后一块的指针
- 优点是创建、增大、缩小都很容易,没有碎片,但是随机访问无法实现,效率低。可靠性较差,一个链被破坏,后面的数据块就丢失了。
- 索引分配:
- 为每个文件创建一个索引数据块,指向文件数据块的指针列表
- 文件头包含了索引数据块指针
- 优点是创建、增大、缩小容易,没有碎片,支持直接访问,缺点是文件很小时,存储索引开销大,大文件索引块可能大小不够。
- 连续分配:
-
指标:
a. 存储效率:外部碎片等
b. 读写性能:访问速度
-
-
大文件的索引分配
-
实际文件系统中通常几种方式组合应用,例如对大文件索引块使用链表组织,多级索引。
-
UFS(unix file system)
13.7 空闲空间管理和冗余磁盘阵列RAID
-
空闲空间管理:
- 空闲空间管理是指跟踪记录文件卷中未分配的数据块。
- 采用什么方式表示空闲空间的列表
-
空闲空间组织方式:
1. 位图法:使用简单,但大磁盘需要一个很大的向量表记录空闲空间。
2. 链表法
3. 链式索引
-
磁盘
- 磁盘(disk)是指利用磁记录技术存储数据的存储器。磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)
-磁盘中的磁道,扇区,柱面,
- 磁盘(disk)是指利用磁记录技术存储数据的存储器。磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)
-
冗余磁盘阵列RAID:提高文件系统可靠性和读写性能的一组技术
- 希望使用多磁盘改善吞吐量、可靠性和可用性,以提高性能。如RAID0,RAID1,RAID4。
- 多种磁盘管理技术
-
磁盘分区:
- 通常磁盘通过分区来最大限度减小寻道时间
- 通常磁盘通过分区来最大限度减小寻道时间
-
一个典型的磁盘文件系统组织
-
冗余磁盘阵列的实现:
- 软件:操作系统内核的文件卷管理
- 硬件:RAID硬件控制器(I/O)
-
RAID0(磁盘条带化):
- 把数据块分成多个子块,存储在独立的磁盘中,通过独立磁盘上并行访问数据块提供更大的磁盘带宽
-
RAID1(磁盘镜像):
- 同时向两个磁盘写入相同的数据,可靠性成倍增长,读取性能线性提升
- 同时向两个磁盘写入相同的数据,可靠性成倍增长,读取性能线性提升
-
RAID4(带校验的磁盘条带化):
- 数据块级的磁盘条带化加专用奇偶校验磁盘,一个磁盘专用于奇偶校验,允许只有一个磁盘发生故障时进行数据恢复
- 数据块级的磁盘条带化加专用奇偶校验磁盘,一个磁盘专用于奇偶校验,允许只有一个磁盘发生故障时进行数据恢复
-
RAID5(带分布式校验的磁盘条带化):
- 数据块的校验和不单独存放在固定的一个磁盘中,而是分布在多个磁盘中,减少对RAID4中奇偶校验磁盘的读写压力
- 数据块的校验和不单独存放在固定的一个磁盘中,而是分布在多个磁盘中,减少对RAID4中奇偶校验磁盘的读写压力
-
基于位和基于块的磁盘条带化
-
以数据块或者bit做奇偶校验
-
RAID6(每组条带有两个冗余块),允许两个磁盘出错。
-
RAID嵌套