一:文件系统基本概念
1. 文件系统
(1)定义
一种用于持久性存储的系统抽象,方便存储器组织、控制、访问、检索数据。
(2)功能
在文件系统中的所有操作都是在块空间上进行的,文件系统可以提供文件与磁盘块空间的映射关系
- 磁盘——文件磁盘空间的分配(文件是字节的集合)
- 管理文件块
- 管理空闲磁盘空间
- 分配算法
- 用户——管理文件集合(文件是持久的数据结构)
- 定位文件及其内容
- 命名文件(通过名字定位)
- 分层文件(通过路径定位)
- 保护文件的数据安全
- 保持文件的持久性
(3) 种类
- 磁盘文件系统:文件存储在数据存储设备如磁盘、光盘
- windows: FAT、NTFS
- Linux:ext2、ext3
- 数据库文件系统:文件可寻址
- 日志文件系统:记录文件系统的修改或者事件
- 网络文件系统:在局域网范围内共享
- NFS、 SMB
- 分布式文件系统:大规模数据存储
- 文件可以通过网络共享
- 需要解决一致性问题
- 特殊 / 虚拟文件系统:是一个接口,进行交换或访问内核的数据
2. 文件
(1)定义
文件系统中一个单元的相关数据在操作系统的抽象,是具有符号名的,在逻辑上具有完整意义的一组相关信息项的集合
(2)基本单位——文件项
可以是一个字符,或者是一个记录
(3)组成
- 文件体(文件数据)
- 文件说明
- 文件的属性信息
- 元数据
- 文件指针:指向最近的读写位置
- 文件打开计数:记录文件打开的次数(最后一个进程关闭文件时可以删除)
- 文件磁盘位置:缓存数据访问信息
- 访问权限:程序访问模式的信息
(4)文件信息的存储结构——文件控制块FCB、文件目录项
- 基本信息
- 名称
- 类型
- 物理位置
- 文件块数
- 大小
- 使用信息
- 创建时间
- 修改时间
- 文件打开计数
- 文件指针
- 存取控制信息
- 文件权限
(5)文件的分类
按性质和用途
- 系统文件
- 库文件
- 用户文件
按信息保存期限
- 临时文件
- 档案文件
- 永久文件
按文件的保护方式
- 只读文件
- 读写文件
- 可执行文件
- 不保护文件
(6)文件的结构
逻辑结构
有结构的记录式文件:由记录构成
记录描述一个实体集,有相同的或不同的数据项
- 定长记录:所有记录的长度相同,记录的数据项都有着相同的顺序和长度。文件的长度用记录的数目表示
- 处理方便,开销小
- 变长记录:各个记录的长度不同但是可以确定,数据项长度不确定
无结构的流文件:由字符串构成(UNIX)
通常顺序访问文件,每次访问可以指定任意数据长度,利用读写指针获取字符
物理结构
1. 连续结构(只读)
用文件头指定起始块和长度,文件信息依次放入编号连续的物理块上
分配策略(类比于内存的连续分配):
- 最先分配
- 最佳分配
优点:
- 文件读取快
- 适用于固定大小的文件
缺点:
- 产生碎片
- 不利于扩展文件
- 配置运行记录文件或事务文件,定期合并原文件和事务文件,产生新文件
- 不利于随机获取文件
2. 链式结构(读写)
用文件头指出第一块数据块和最后一块数据块的指针,文件通过数据块链表方式存储
优点:
- 没有碎片
- 容易修改文件
缺点:
- 无法随机访问文件
- 不安全
3. 索引结构(小文件)
用文件头指向索引数据块,为文件创建一个名为索引数据块的非数据数据块,指向各个数据块
优点:
- 没有碎片
- 容易修改文件
- 可以随机访问文件
缺点:
- 存储索引的开销大
4. 分层索引结构(大文件)
- 多级索引块:将索引块分为多个级别,同时将数据块分为多个层次,每一个层次对应一个最后一级索引块。上一个级别的索引块指向下一个级别(存储的开销更大)
- 链式索引块:索引块不仅指向数据块,同时指向下一个索引块(不安全)
优点:
- 动态分配数据块,利于扩展文件
缺点
- 需要大量查询,间接访问(可以缓存)
UNIX:多级索引
一个文件头包含13个指针:
- 10个指针:直接索引(10项)——直接访问数据块
- 第11个指针:一级索引(N项)——通过一级索引块找到数据块位置,再访问数据块
- 第12个指针:二级索引(N2项)——通过二级索引块找到一级索引块的位置,再通过一级索引块找到数据块的位置,再访问数据块
- 第13个指针:三级索引(N3项)——通过三级索引块找到二级索引块的位置,再通过二级索引块找到一级索引块的位置,再通过一级索引块找到数据块的位置,再访问数据块
(7) 文件的存取方式
- 顺序存取(常用):按字节依次读取文件
- 随机存取(不常用):从中间开始读写,更加快速
- 基于内容存取(数据库):通过特征访问
3. 目录
(1)目的
- 对文件进行分类,便于查找
- 一个文件系统需要先挂载在目录上,才能访问。此时该目录称为挂载点。
(2)定义
目录是一类特殊的文件,是文件控制块的集合
(3)结构
一级目录结构:线性结构
系统只建立一张目录表,每个文件分配一个目录项
特点:
- 编程简单
- 检索开销大
- 不允许重名
- 不利于共享文件
二级目录结构:由主文件目录和用户目录组成
- 主文件目录:包含所有的用户文件目录(目录项由用户名和指针组成)
- 用户目录:包含用户所有文件的目录项
特点:
- 提高检索速度
- 不利于用户间共享文件
多级目录结构/树形目录结构(层次名称空间)
- 非叶子结点为目录
- 叶子结点为文件
(4)组织文件的数据结构
-
包含文件名和指向数据块指针的线性列表
-
哈希结构的线性表
- 速度快
- 需要考虑碰撞问题
- 适合文件数量固定的情况
(5)路径遍历
定义:
在文件系统中,通过名字解析,将路径解析为各个目录,遍历文件目录,直到找到目标文件。
(名字解析:将逻辑名字转换成物理资源的过程)
绝对路径:从根目录开始查找
过程:/a/b
- 名字解析:(root)/a
- 读取根目录的文件头
- 读取根目录的数据块
- 找到a这个文件项
- 名字解析:a/b
- 读取a的文件头
- 读取a的数据块
- 找到b这个文件项
- 名字解析:b
- 读取b的文件头
相对路径:从当前工作目录开始查找
每个进程都会指向一个文件目录,通过缓存当前工作目录,可以更快的查找
过程:a/b
- 名字解析:(当前工作目录)/a
- 读取当前工作目录的文件头
- 读取当前工作目录的数据块
- 找到a这个文件项
- 名字解析:a/b
- 读取a的文件头
- 读取a的数据块
- 找到b这个文件项
- 名字解析:b
- 读取b的文件头
二:文件存储空间
主要是对空闲空间的管理,通常放置在磁盘分配表中。
1. 空闲区表——连续文件结构
空闲区:外存中的连续空闲区域
空闲表:记录每个空闲区的序号,第一个空闲块号,空闲块数,状态
2. 位示图
定义:
在外存中建立一张位示图,大小由磁盘空间决定,每一位对应一个物理块,一个字可以对应(字长)个物理块。如果i=0表示数据块i是空闲的,反之是已经分配的。
160G字节的磁盘(一个页是4K个字节),需要的内存块是40M字节,也就是需要5M个比特位
过程:
- 从硬盘导入内存
- 如果空闲块均匀分布,则需要扫描N/R次(N为磁盘上的数据块个数,R为空闲块个数)
- 保证一致性
- 定期更新
- 先在磁盘标记,再在内存中标记
3. 空闲块链
每个空闲物理块保存一个指针,指向下一个空闲物理块。所有空闲物理块构成一个链表,链表的头指针放在文件存储器的特定位置。
- 不需要磁盘分配表,节省空间
3. 成组链接法(UNIX)
将空闲块分为多个组,每组的第一个空闲块记录下一组的物理块号和空闲块数,最后一组的第一个空闲块号为0
三:虚拟文件系统
1. 目的
通过虚拟文件系统,进行抽象,屏蔽底层文件系统的差异性
分层结构:
- 上层:虚拟文件系统
- 底层:特定文件系统
2. 功能
- 提供相同的文件和文件系统的接口
- 管理所有文件和文件系统相关联的数据结构
- 高效查询例程,遍历文件系统
- 与特点文件系统交互
3. 结构
(1)卷控制块(文件系统只有一个)
对文件系统进行总控制,表示文件系统的具体信息。
- 空闲块个数
- 块大小
- 计数
- 指针
(2)文件控制块(文件只有一个)
对文件进行控制,表示文件的具体信息
- 文件大小
- 文件权限
- 文件拥有者
- 文件位置
(3)目录节点(目录项只有一个)
对目录项进行控制,将目录项的目录和文件编码成树形数据结构
- 父节点
- 指向文件控制块
- 项目列表
4. 实现映射
- 卷控制块、文件控制块、目录结点被持续存储在存储设备(磁盘)中的数据块(扇区)中
- 在需要的时候加载进内存
- 卷控制块:文件系统挂载时进入内存
- 文件控制块:文件被访问时进入内存
- 目录节点:遍历一个文件路径时进入内存
四:数据缓存
1. 缓存技术
(1) 读入
- 按需读:在需要的时候再读取数据块
- 预先读:预先读取后面的数据块
(2) 写回
- 缓存写操作:假设数据会被再次使用
- 延迟写:减少写回的次数,可以一次写回较多数据
2. 缓存方式
- 普通缓冲区缓存:只缓存磁盘块
- 页缓存:统一缓存数据块和内存页
与内存管理系统的结合
(1)分页要求
当需要一个页时,从主存的物理地址空间加载到虚拟内存的逻辑地址空间,将数据块映射成页
此时主存缓存了内存页和数据块
(2)支持存储
一个页可以从虚拟内存的逻辑地址空间映射到本地文件的二级存储空间中存储
把文件按照数据块的结构展现, 对文件的读写操作转换成对内存的访问
五:使用文件
1. 打开文件:
- 进程打开文件
- 将文件的文件控制块读入内存
- 将文件信息记录在进程的打开文件表
- 返回文件项所在索引,也就是文件描述符
- 如果系统的打开文件表没有这个文件的信息,则记录
- 找到目录或文件的节点信息,获得目录或文件的位置
限制对文件的访问
- 强制:根据锁的保持情况拒绝访问
- 建议:查找锁的状态,操作系统进行决定
2.读入文件/写入文件:
- 将想要读取或者写入数据的偏移量通过文件控制块转换成扇区编号
- 根据系统打开文件表,找到目录或文件的节点信息,获得目录或文件的位置
- 通过偏移量,找到对于的数据库的扇区
- 进行操作
六:共享和保护文件
1. 文件共享
原因
节省文件复制的空间以及因复制文件增加的访存次数
方式
通过文件别名(多个文件名关联同一个文件),对文件名和文件说明分离
(1)硬链接:
多个文件目录项指向同一个索引结点的链接
- 不利于删除共享文件,必须先关闭所有链接,否则其他用户的目录项指针悬空
- 删除时让该文件的引用次数减少,到0时真正删除
- 反向指针:每个文件有一个反向指针的列表,删除时会删除所有的反向指针,使用菊花链管理
- 间接层:在目录项和目录之间添加一个间接层
(2)软链接/符号链接:
多个快捷方式指向同一个文件路径
- 可以跨越文件系统
- 需要增加读盘操作的次数
避免循环
- 只允许到文件的链接,不允许存在子目录的链接
- 每添加一个新的链接都进行循环检测
2. 文件保护——存取控制
(1)存取控制矩阵
一维表示计算机的用户,另一维表示文件,矩阵元素表示存取权限。
- 开销大
(2)存取控制列表(UNIX)
作用:以文件为单位,按照权限对用户分类
内容:文件实体+权限
- 权限
- 读
- 写
- 可执行
- 文件实体
- 文件主
- 同组用户
- 其他用户
(3)用户权限表
以用户或用户组为单位,将用户有权限的文件集中起来存入表中。
内容:文件+用户对应文件的权限
(4)密码
创建文件时用户使用密码加密,读取文件需要解密
七:文件安全与可靠
1. 文件安全性
- 系统级:不允许未经授权的用户进入系统
- 登陆和注册
- 用户级:不允许未经授权的用户使用文件
- 对用户分类,分配权限
- 目录级:保护系统目录
- 只有操作系统的内核可以修改目录
- 文件级:未经授权的文件不能被进行相关操作
- 系统管理员或文件主设置文件属性
2. 文件可靠性
- 转储和恢复:通过转储(备份)的数据恢复系统
- 静态转储
- 动态转储
- 海量转储
- 增量转储
- 日志文件
- 文件系统的一致性
- 检查块的一致性
- 检查文件的一致性
3:语义的一致性
-
多用户同时访问共享文件
-
多用户读写文件
UFS语义:
- 对于打开文件写入内容,其他用户可见
- 共享文件允许多个用户读写
会话语义:
写入内容,只有当文件关闭时可见
读写锁
- 不同的文件
- 文件的不同位置