1 基本概念
1.1 文件系统和文件
- 文件系统: 一种用于持久性存储的系统抽象
- 在存储器上:组织、控制、导航、访问和检索数据
- 大多数计算机系统包含文件系统
- 个人电脑、服务器、笔记本电脑
- iPod、 Tivo /机顶盒、手机/掌上电脑
- Google 可能是由一个文件系统构成的
- 文件:文件系统中一个单元的相关数据在操作系统中的抽象
1.1.1 文件系统的功能
- 分配文件磁盘空间
- 管理文件块(哪一块属于哪一个文件)
- 管理空闲空间(哪一块是空闲的)
- 分配算法(策略)
- 管理文件集合
- 定位文件及其内容
- 命名:通过名字找到文件的接口
- 最常见:分层文件系统
- 文件系统类型(组织文件的不同方式)
- 提供的便利及特征
- 保护:分层来保护数据安全
- 可靠性/持久性:保持文件的持久即使发生崩溃、媒体错误、攻击等
1.1.2 文件和文件块
- 文件属性
- 名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间
- 文件头/文件块
- 在存储元数据中保存了每个文件的信息
- 保存文件的属性
- 跟踪哪一块存储块属于逻辑上文件结构的哪个偏移
1.2 文件描述符
1.2.1 文件使用
1.2.2 管理文件需要的东西
需要元数据数据来管理打开文件:
- 文件指针: 指向最近的一次读写位置,每个打开了这个文件的进程都这个指针
- 文件打开计数:记录文件打开的次数 当最后一个进程关闭了文件时,允许将其从打开文件表中移除
- 文件磁盘位置:缓存数据访问信息
- 访问权限:每个程序访问模式信息
1.2.3 系统的视图来看
- 用户视图: .
- 是一个持久的数据结构
- 系统访问接口
- 字节的集合(UNIX)
- 系统不会关心你想存储在磁盘上的任何的数据结构!
- 操作系统内部视角
- 块的集合(块是逻辑转换单元,而扇区是物理转换单元)
- 块大小<>扇区大小;在UNIX中,块的大小是4KB
例如
1.2.4 怎末访问文件
- 用户怎么访问文件
- 在系统层面需要知道用户的访问模式
- 顺序访问:按字节依次读取
- 几乎所有的访问都是这种方式
- 随机访问:从中间读写
- 不常用,但是仍然重要.例如,虚拟内存支持文件:内存页存储在文件中
- 更加快速-不希望获取文件中间的内容的时候也必须先获取块内所有字节。
- 基于内容访问:通过特征
- 许多系统不提供此种访问方式,相反,数据库是建立在索引内容的磁盘访问上更需要高效的随机访问)
1.2.5 基于内容访问的例子
1.2.6 文件内存的结构
- 无结构.
- 单词、比特的队列
- 简单记录结构
- 列
- 固定长度
- 可变长度
- 复杂结构
- 格式化的文档(如,MS Word, PDF)
- 可执行文件
1.3 目录
1.3.1 为什么要有目录
1.3.2 典型操作
- 典型操作
- 搜索文件
- 创建文件
- 删除文件
- 枚举目录
- 重命名文件
- 在文件系统中遍历一个路径
- 操作系统应该只允许内核模式修改目录
- 确保映射的完整性
- 应用程序能够读目录(如1s)
1.3.3 数据结构
- 文件名的线性列表,包涵了指向数据块的指针
- 编程简单
- 执行耗时
- Hash表- hash数据结构的线性表
- 减少目录搜索时间
- 碰撞-两个文件名的hash值相同
- 固定大小
1.3.4 路径的遍历
1.3.5 挂载
1.4 文件别名
1.4.1 删除有别名的文件
1.4.2 别名可能出现环
1.5 文件系统种类
1.5.1 分布式文件系统的补充说明
- 文件可以通过网络被共享
- 文件位于远程服务器
- 客户端远程挂载服务器文件系统
- 标准系统文件访问被转换成远程访问
- 标准文件共享协议: NFS for Unix, CIFS for Windows
- 分布式文件系统的问题
- 客户端和客户端.上的用户辨别起来很复杂
- 例如,NFS是不安全的
- 一致性问题
- 错误处理模式
2 虚拟文件系统
2.1 为什么要有虚拟文件系统
- 目的
- 对所有不同文件系统的抽象
- 功能
- 提供相同的文件和文件系统接口
- 管理所有文件和文件系统关联的数据结构
- 高效查询例程,遍历文件系统
- 与特定文件系统模块的交互
2.2 属性
2.3 结构图
2.4 怎么保存
- 文件系统数据结构
- 卷控制块(每个文件系统一个)
- 文件控制块(每个文件一个)
- 目录节点(每个目录项一个)
- 持续存储在二级存储中
- 在分配在存储设备中的数据块中
- 当需要时加载进内存
- 卷控制模块:当文件系统挂载时进入内存
- 文件控制块:当文件被访问时进入每次
- 目录节点:在遍历-一个文件路径时进入内存
2.5 结构图二
3 数据块的数据缓存
3.1 缓存各种方式
- 数据块按需读入内存
- 提供read() 操作
- 预读:预选读取后面的数据块
- 数据块使用后被缓存
- 假设数据将会再次被使用
- 写操作可能被缓存和延迟写入
- 两种数据块缓存方式
- 普通缓冲区缓存
- 页缓存:统一缓存数据块和内存页
3.2 基于分页的缓存
3.3 怎末提高缓存效率,尽量减小对硬盘的访问次数
4 打开文件的数据结构
4.1 打开文件的实现流程
- 打开文件描述
- 每个被打开的文件一个
- 文件状态信息
- 目录项、当前文件指针、文件操作设置等
- 打开文件表
- 一个进程一个
- 一个系统级的
- 每个卷控制块也会保存一个列表
- 所以如果有文件被打开将不能被卸载
4.2 图示
4.3 注意
- 一些操作系统和文件系统提供该功能
- 调节对文件的访问
- 强制和劝告:
- ➢强制:根据锁保持情况和需求拒绝访问
- ➢劝告:进程可以查找锁的状态来决定怎么做
5 文件分配
5.1 对文件空间的管理
- 大多数文件都很小
- ➢需要对小文件提供强力的支持
- ➢块空间不能太大
- 一些文件非常大
- ➢必须支持大文件(64-bit 文件偏移).
- ➢大文件访问需要相当高效
5.2 怎末分配数据块
- 如何为一个文件分配数据块
- 分配方式
- 连续分配
- 链式分配
- 索引分配
- 指标
- 高效:如存储利用(外部碎片)
- 表现:如访问速度
5.3 连续分配
5.4 链式分配
5.5 索引分配
5.5.1大文件的索引分配(索引分级)
5.5.2 unix就采取了多级索引
5.6 问题
6 空闲空间列表
问题:
- 跟踪在存储中的所有未分配的数据块
- 空闲空间列表存储在哪里?
- 空闲空间列表的最佳数据结构是什么样的?
6.1 简单方法,位图来表示
6.2 为了保证一致性
6.3 其它管理空闲空间数据块的数据结构
7 多磁盘管理 - RAID
7.1 raid的原理--冗余磁盘阵列
7.2 提高了带宽
7.3 可靠性的提高
7.4 即提高了性能,又提高了可靠性
7.5 奇偶校验块,分布到每一个disk中
7.6 进一步改进
简单的实现
8 磁盘调度
8.1 硬件结构
8.2 磁盘性能的表示
8.3 访问时间组成
8.4 寻道时间开销最大
8.4 按照进程的顺序处理
示例
8.5 最短寻道
8.6 scan方法(电梯)
8.7 改进(一直由低到高循环)
8.8 改进(只到达最后一个请求,并非磁盘末尾)
8.9 分区