考纲内容
- 文件系统基础
- 文件的概念、逻辑结构
- 顺序文件、索引文件、索引顺序文件
- 目录结构、文件控制块和索引结点
- 单级目录结构和两级目录结构、树形目录结构、图形目录结构
- 文件共享、文件保护、访问类型、访问控制
- 文件系统实现
- 文件系统层次结构、目录实现、文件实现
- 磁盘组织与管理
- 磁盘的结构、磁盘调度算法、磁盘的管理
1. 文件系统基础
1. 文件的相关概念
1. 相关定义
- 文件:以计算机硬盘为载体的存储在计算机上的信息集合
- 文件系统:用于实现文件的权限访问、修改、查询和保存等功能
- 组成
- 与文件管理有关的软件
- 被管理文件
- 实施文件管理所需的数据结构
- 功能
- 实现对文件的基本操作
- 管理与磁盘的信息交换
- 完成文件逻辑结构和物理结构的变换
- 组织文件在磁盘上的存放
- 采取好的文件排放顺序和磁盘调度方法
- 组成
- 数据项:文件系统中最低级的数据组织形式
- 基本数据项:用于描述一个对象的某种属性的一个值
- 组合数据项:多个基本数据项组成
- 记录:一组数据项的集合,用于描述一个对象在某方面的属性
- 注意
- 系统运行时,计算机以进程为基本单位进行资源的调度和分配
- 用户输入输出时,以文件为基本单位
2. 文件的属性
- 名称:文件名称唯一,以容易读取的形式保存
- 标识符:文件的唯一标签,通常为数字,是对人不可读的一种内部名称
- 类型:被支持不同类型的文件系统所使用
- 位置:指向设备和设备上文件的指针
- 大小:文件当前的大小,包含文件允许的最大值
- 保护:对文件进行保护的访问控制信息
- 时间、日期和用户标识:文件创建、修改和上次访问的相关信息,用于保护和跟踪文件的使用
3. 文件的基本操作
1. 创建文件(create系统调用)
- 所需参数
- 所需的外存空间大小
- 文件存放路径
- 文件名
- 流程
- 在外存中找到文件所需的空间
- 在目录中为该文件创建对应的目录项,该条目记录文件名称、在文件系统中的位置以及其他可能的信息
2. 写文件(write系统调用)
- 所需参数
- 文件描述符
- 缓冲区首址
- 传送的字节数
- 流程:从用户指定的内存区域中,将指定大小的数据写回写指针(系统维护)指定的外存
3. 读文件(read系统调用)
- 所需参数
- 文件描述符
- 缓冲区首址
- 传送的字节数
- 流程:从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中
4. 文件重定位(文件寻址)
- 流程:按照某种文件搜索目录,将当前文件位置设为定值。并且不会读、写文件
5. 删除文件(delete系统调用)
- 所需参数
- 文件存放路径
- 文件名
- 流程
- 从目录中找到文件名对应的目录项
- 回收目标文件占用的磁盘块
- 从目录表中删除文件对应的目录项
6. 截断文件
- 流程 :允许文件的所有属性不变,并删除文件内容,即将其长度设为0并释放其空间
4. 文件的打开与关闭
1. 打开文件(open系统调用)
- 所需参数
- 文件存放路径
- 文件名
- 要对文件的操作类型
- 流程
- 从目录中找到文件名对应的目录项,并检查该用户是否有指定的操作权限
- 将目录项复制到内存中的“打开文件表”中,并将对应表目的编号(指针)返回给用户
- 用户使用打开文件表的编号来指明要操作的文件
2. 关闭文件(close系统调用)
- 流程
- 将进程的打开文件表相应表项删除
- 回收分配给该文件的内存空间等资源
- 系统打开文件表的打开计数器count减1,若count=0,则删除对应表项
3. 文件关联信息
- 文件指针:系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对于打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存
- 文件打开计数:文件关闭时,必须重用其打开文件表条目,否则内存空间会不够用,计数器为0关闭文件,删除该条目
- 文件磁盘位置:该信息存储在内存中,以免每个操作都要从磁盘中读取
- 访问权限:每个进程打开文件都需要一个访问模式(创建、只读、读写、添加等)。该信息保存在进程打开的文件表中,以便操作系统能够允许或拒绝之后的I/O请求
2. 文件的逻辑结构(从用户观点)
1. 无结构文件(流式文件)
- 定义:将数据按顺序组织成记录并积累、保存,是有序相关信息项的集合,以字节为单位
- 优点:管理简单,方便用户对其操作
- 缺点:由于其没有结构,所以只能采用穷举搜索
- 适用情况:基本信息单位操作不多的文件
- 实例:文本文件
2. 有结构文件(记录式文件)
-
实例:数据库表
-
顺序文件
- 定义:文件的记录是一个接一个排列,记录通常是定长的,可以顺序存储或者链表存储
- 两种结构
- 串结构:记录之间的顺序与关键字无关,按存入时间的先后排序
- 顺序结构:所有记录按关键字顺序排列
- 优点:批量处理时,所有逻辑文件中效率最高的
- 缺点:增删改查操作比较困难
-
索引文件
- 定长记录文件: 按照公式 A=记录 i * 文件长度 L 可以直接得到文件地址
- 变长记录文件:查找前 i -1 条记录后,才能查找第 i 条记录
- 缺点:只能顺序查找,系统开销较大
- 解决办法:建立索引表后可以提高查找速度(索引表本身是定长记录的顺序文件)
-
索引顺序文件
- 定义:索引文件将顺序文件中的所有记录分成若干组,为顺序文件建立起一张索引表,在索引表中为每组中的第一条记录建立一个索引项,其中含有该记录的关键字值和指向该记录的指针
- 特点:组内关键字可无序,组间关键字必须有序
- 优点:提高了查找效率,
- 缺点:索引表占用了存储空间
-
直接文件或散列文件
- 定义:给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址
- 特点:没有顺序的特性
3. 目录结构
- 包含有关文件的信息,如属性、位置和所有权等,由操作系统进行管理
1. 文件控制块和索引结点
1.文件控制块(FCB)
- 功能:用来存放控制文件需要的各种信息的数据结构,实现“按名存取”,一个FCB就是一个文件目录项
- 包含信息
- 基本信息:文件名,文件的物理位置,逻辑结构,物理结构等
- 存取控制信息:文件存取权限
- 使用信息:文件建立时间,修改时间
- 特点:必须连续存放
2. 索引结点
- 定义:检索目录文件时,仅用到文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才需要从该目录项中读出该文件的物理地址。文件的描述信息单独形成索引结点
- 磁盘索引结点:存放在磁盘上的索引结点。UNIX中每个文件都有一个唯一的磁盘索引结点
- 文件主标识符:拥有该文件的个人或小组的标识符
- 文件类型:普通文件、目录文件、特别文件
- 文件存取权限:各类用户对该文件的存取权限
- 文件物理地址:每个索引结点中含有13个地址项,直接或者间接的方式给出数据文件所在盘块的编号
- 文件长度:字节为单位
- 文件链接计数:本文件系统中所有指向该文件的文件名的指针计数
- 文件存取时间:文件最近被进程存取,修改以及索引结点最近被修改的时间
- 内存索引结点增加的内容
- 索引结点编号:用于标识内存索引结点
- 状态:指示 i 结点是否被上锁或者被修改
- 访问计数:每当有一个进程要访问此 i 结点时,计数加1,访问结束减1
- 逻辑设备号:文件所属文件系统的逻辑设备号
- 链接指针:设置分别指向空闲链表和散列队列的指针
- 目录所需执行的操作
- 搜索:用户使用一个文件时,需要搜索目录,找到该文件对应的目录项
- 创建文件:创建一个新文件时,需要在目录中增加一个目录项
- 删除文件:删除一个文件时,需要在目录中删除相应的目录项
- 显示目录:用户可以请求显示目录的内容,显示该用户目录中的所有文件及属性
- 修改目录:某些文件保存在目录中,因而这些属性的变化需要改变相应的目录项
2. 目录结构分类
1. 单级目录结构
- 策略:整个文件系统只建立一张目录表,每个文件占一个目录项
- 优点:实现了按名存取
- 缺点
- 查找速度慢
- 文件不允许重名
- 不便于文件共享
- 不适用于多用户的操作系统
2. 两级目录结构
- 策略:将文件分为主文件目录(MFD)和用户文件目录(UFD)
- MFD项:记录用户名及相应用户文件目录所在的存储位置
- UFD项:记录该用户文件的FCB信息
- 优点:解决了不同用户文件重名问题,在一定程度上保证了文件的安全
- 缺点:缺乏灵活性,不能对文件分类
3. 多级目录结构(树形目录结构)
- 策略:将两级目录结构的层次关系加以推广,就形成了多级目录结构,即树形目录结构
- 特点:进程对各文件的访问都是相对于当前目录进行的
- 优点:对文件分类很方便,层次结构清晰,能够有效的进行文件管理和保护
- 缺点:需按照路径名访问中间结点,增加了磁盘访问次数,降低了查询速度
4. 无环图目录结构
- 策略:在树形目录结构基础上增加了一些指向同一结点的有向边,使整个目录成为一个有向无环图
- 优点:有利于实现文件共享
4. 文件共享
1. 基于索引结点的共享方式(硬链接)
- 定义:文件目录中只设置文件名及指向相应索引节点的指针,在索引结点中还有一个链接计数count,用于表示链接到本索引结点(即文件)上的用户目录项的数目
- 特点
- 硬链接是多个指针指向一个索引结点,只要还有指针指向索引结点,索引结点就不能删除
- 建立链接时,引用计数值 + 1
- 优点:硬链接的查找速度比软链接快
2. 利用符号链实现文件共享(软链接)
- 定义:B用户共享A用户的文件F的时候,系统创建一个LINK类型的新文件,也取名F,然后将文件F写入用户B的目录中,新文件中只是含有被链接文件F的路径名
- 特点:
- 软链接就是把到达共享文件的路径记录下来,当要访问文件时,根据路径寻找文件
- 建立链接时,引用计数值直接赋值
- 优点:网络共享只需要提供该文件所在机器的网络地址及该机器中的文件路径
- 缺点:由于是根据文件路径名查找文件,增加时间开销并且增加了启动磁盘的频率,符号链的索引结点会耗费硬盘空间
5. 文件保护
- 定义:解决对文件的读、写、执行的许可问题(访问权限的保护)
- 实现方式
- 口令保护、加密保护:防止用户文件被他人窃取或者存取
- 访问控制:控制用户对文件的访问方式
- 访问类型:读、写、执行、添加、删除、列表清单(列出文件名和属性名)、文件重命名、复制、编辑等(通过低层系统调用实现,保护可以只在低层提供)
- 访问控制
- 定义:根据用户身份进行控制,为每个文件和目录增加一个访问控制列表(ACL)(规定每个用户名及其所允许的访问类型)
- 优点:灵活性高,可以使用复杂的访问方法
- 缺点:长度无法预计且可能导致复杂的空间管理
- 精简访问列表——UNIX系统
- 拥有者:创建文件的用户
- 组:一组需要共享文件且具有类似访问的用户
- 其他:系统内的所有其他用户
- 口令:用户请求访问时需要提供相应的口令
- 优点:时间和空间开销不多
- 缺点:口令直接存储在系统内部,不安全
- 密码:用户对文件进行加密,用户访问需要密钥解密
- 优点:保密性强,节省了存储空间
- 缺点:加密和解密需要花费一定时间
2. 文件系统的实现
1. 文件层结构
- 用户调用接口:由若干程序模块组成,每个模块对应一条系统调用
- 文件目录系统:管理文件目录,管理活跃文件目录表、读写状态信息表、用户进程的打开文件表、存储设备上的文件目录结构,调用下一级存取控制模块
- 存取控制验证:实现文件保护,将用户的访问请求与FCB中指示的访问控制权限进行比较,以确认访问的合法性
- 逻辑文件系统与文件信息缓冲区:根据文件的逻辑结构将用户要读写的逻辑记录转换成文件逻辑结构内的相应块号
- 物理文件系统:把逻辑结构所在的相对块号转换成实际的物理地址
- 辅助分配模块:管理辅存空间,负责分配辅存空间和回收辅存空间
- 设备管理程序模块:分配设备、分配设备读写用缓冲区、磁盘调度、启动设备、处理设备中断、释放设备读写缓冲区、释放设备
2. 目录实现
1. 线性列表
- 定义:使用存储文件名和数据块指针的线性表
- 实现
- 创建文件
- 搜索目录表以确定没有同名的文件存在
- 在目录表后增加一个目录项
- 删除文件
- 根据给定的文件名搜索目录表
- 释放分配给它的空间
- 重用目录项
- 将目录项标记为不再使用
- 加到空闲目录项表上
- 将目录表中的最后一个目录项复制到空闲位置,降低目录表长度
- 创建文件
- 优点:实现简单
- 缺点:耗费时间
2. 哈希表
- 方法:根据文件名得到一个值,然后返回一个指向线性列表中元素的指针
- 优点:查找迅速,插入和删除简单
- 缺点:要避免冲突,哈希表长度固定以及哈希函数对表长有依赖性
3. 文件实现
1. 文件的分配方式
1. 连续分配
-
策略:每个文件在磁盘上占用一组连续的块,磁盘地址定义了磁盘上的一个线性排序
-
特点:访存1次
-
优点
- 实现简单,支持顺序访问和随机访问
- 存取速度最快,访问磁盘所需的寻道数和寻道时间最小
-
缺点:文件长度不宜动态的增加,会产生外部碎片
2. 链接分配
-
策略:采用离散分配方式,提高了磁盘空间利用率,消除了外部碎片
-
特点:访存n次
-
隐式链接
- 策略:磁盘块离散分布,除最后一个盘块,其他盘块都有指向下一个盘块的指针
- 优点:不会有碎片问题,外存利用率高,支持顺序访问
- 缺点:不支持随机访问,稳定性存在问题,
-
显式链接
- 策略:把用于链接文件各物理块的指针,从每个物理块的末尾提取出来,显示的存放在内存的一张连接表(FAT,常驻内存)中,整个磁盘设置一张
- 优点:提高检索速度,减少了访问磁盘次数,支持随机访问
- 缺点: 文件分配表需要占用一定的存储空间
3. 索引分配
- 策略:把所有的盘块号都集中放在一起构成索引表
- 特点
- m级要访存m+1次
- 每个文件必须有一个索引块,表中记录了各个逻辑块对应的物理块
- 优点:支持随机访问,没有外部碎片
- 缺点:索引块占内存空间
- 优化机制
-
链接方案:一个索引块通常为一个磁盘块(本身能直接读写),为了处理大文件,可以将多个索引块链接起来
-
多层索引:第一层索引块指向第二层索引块,第二层索引指向文件块,还可根据文件大小的要求再建立第三层、第四层索引块
-
混合索引:系统既采用直接地址又采用单级索引分配方式或者两级索引分配方式
-
- 重点
- 要会根据多层索引、混合索引的结构计算出文件的最大长度(各级索引表不能超过一个块)
- 要能自己分析访问某个数据块所需要的读磁盘次数(FCB中会存有指向顶级索引块的指针,每次读入下一级的索引块都需要一次读磁盘操作)
4. 总结
2. 文件存储空间管理
1. 文件存储空间的划分与初始化(逻辑格式化)
- 特点
- 文件存储在一个文件卷中,文件卷可以是物理盘的一部分,也可以是整个物理盘
- 在一个文件卷中,文件数据信息的空间(文件区) 和 存放文件控制信息FCB的空间(目录区) 是分离的
- 划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
- 初始化:划分好目录区和文件区,建立空间空间管理表格及存放逻辑卷信息的超级块
- 文件存储空间管理
- 文件存储设备分成许多大小相同的物理块,以块为单位交换信息
- 实质是对空闲块的组织和管理
2. 管理方式
- 空闲表法:属于连续分配方式
- 分配方式:系统为空闲区建立一张空闲盘块表,每个空闲区对应于一个空闲表项(包括表项序号、该空闲区第一个盘块号、空闲盘块数等信息),再将所有空闲区按其起始盘块号递增的次序排列
- 回收策略:若空闲表中插入点的前区和后区相邻接,对相邻接者应予以合并
- 空闲链表法:操作系统保存着链头链尾指针
- 空线盘块链:将磁盘上的所有空闲空间以盘块为单位拉成一条链
- 分配策略:从链首开始,依次摘下适当数目的空线盘块分配给用户
- 回收策略:将回收的盘块一次插入空闲盘块链的末尾
- 优点:分配和回收一个盘块的过程非常简单,适于离散分配
- 缺点:为一个文件分配盘块时可能要重复多次操作
- 空闲盘区链:将磁盘上的所有空闲盘区(每个盘区可包含若干连续的盘块)拉成一条链
- 分配策略:从链头开始检索,按照某种算法规则找到一个大小符合要求的空闲盘区,分配给文件,若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件
- 回收策略:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中;若回收区没有和任何空闲区相邻,将回收区作为一个单独的空闲盘区挂到链尾
- 优点:为一个文件分配多个盘块时效率更高,适用于离散分配和连续分配
- 空线盘块链:将磁盘上的所有空闲空间以盘块为单位拉成一条链
- 位示图法:采用二进制的一位来表示一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应
- 盘块的分配(重要考点)
- 顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位
- 将找到的一个或一组二进制位,转换成与之对应的盘块号
- 从1开始: b = n ( i − 1 ) + j b = n(i-1) + j b=n(i−1)+j
- 从0开始: b = n i + j b = ni + j b=ni+j
- 其中i为行号,j为列号,n为每行的位数
- 修改位示图,令map[i,j]=1
- 盘块的回收
- 将回收盘块的盘块号转换成位示图中的行号和列号
- 从1开始: i = ( b − 1 ) / n + 1 ; j = ( b − 1 ) % n + 1 i = (b-1) / n + 1 ; j = (b-1) \% n + 1 i=(b−1)/n+1;j=(b−1)%n+1
- 从0开始: i = b / n ; j = b % n i = b / n ; j = b \% n i=b/n;j=b%n
- 修改位示图,令map[i,j]=0
- 将回收盘块的盘块号转换成位示图中的行号和列号
- 盘块的分配(重要考点)
- 成组链接法(一般不考)
- 思想:把顺序的n各空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一顺序空闲扇区的地址,如此继续,直至所有空闲扇区均链接。系统只需保存第一个指向第一个空闲扇区的指针
- 优点:克服了表太大的缺点
- 应用:UNIX
- 超级块:表示文件存储器空闲区间的“位向量”表或第一个成组链块,以及卷中的目录区、文件区划分信息都需要存放在辅存储器中,一般放在卷头位置(系统启动时便读入内存)
3. 磁盘的组织与管理
1. 磁盘结构
- 磁道:磁盘盘面上的数据存储在一组同心圆中
- 特点
- 每个扇区固定存储大小,一个扇区称为一个盘块,扇区是磁盘可寻址的最小单位
- 各磁道存储密度由最外道向里增加
- 磁盘地址用 柱面号-盘面号-扇区号(块号)表示(减少磁头移动消耗时间)
- 磁盘分类
- 固定头磁盘:磁头相对于盘片的径向方向固定
- 活动头磁盘:每个磁道一个磁头,磁头可以移动
- 固定盘磁盘:磁头臂可以来回伸缩定位磁道,磁盘永久固定在磁盘驱动器内
- 可换盘磁盘:可以移动和替换
2. 磁盘调度算法
1. 读写时间组成
- 寻找时间:将磁头移动到指定磁道所需要的时间(与磁盘调度算法相关)
- 跨越n条磁道的时间 + 启动磁臂的时间s: T s = m × n + s T_s = m\times n + s Ts=m×n+s
- 延迟时间:磁头定位到某一磁道的扇区(块号)所需要的时间(与磁盘转速成线性相关)
- 转速为r,取平均时间
T r = 1 2 r T_r = \frac{1}{2r} Tr=2r1
- 转速为r,取平均时间
- 传输时间:从磁盘读出或者向磁盘写入数据所经历的时间(与磁盘转速成线性相关)
- 读写字节数为b,N为一个磁道上的字节数
T t = 1 r × b N = b r N T_t =\frac{1}r\times\frac{b}N= \frac{b}{rN} Tt=r1×Nb=rNb
- 读写字节数为b,N为一个磁道上的字节数
- 总平均时间
T a = T s + 1 2 r + b r N T_a=T_s+\frac{1}{2r}+\frac{b}{rN} Ta=Ts+2r1+rNb - 提高磁盘传输效率的方法
- 减少寻道时间:磁盘调度算法
- 减少传输时间:由磁盘本身性质决定,不能通过一定的措施减少
- 减少延迟时间:所有盘面连轴转,磁头读写一个物理块后,需要经过短暂的处理时间才能开始读写下一块
- 对盘面扇区进行交替编号
- 对磁盘片组中的不同盘面错位命名
2. 磁盘调度算法
1. 先来先服务算法(FCFS)
- 思想:按照进程请求访问磁盘的先后顺序进行调度
- 优点:公平、实现简单
- 缺点:适用于少量进程访问,进程过多则接近于随机调度
2. 最短寻找时间优先算法(SSTF)
- 思想:选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道
- 优点:性能强于FCFS
- 缺点:会产生饥饿现象
3. 扫描算法(SCAN)(电梯调度算法)
- 思想:在磁头当前移动方向上选择与当前磁头所在的磁道距离最近的请求作为下一次服务对象(方向一致 + 距离最近)
- 优点:寻道性能好,可以避免饥饿现象
- 缺点:不公平(偏向于最里或最外的请求),访问局部性方面不如FCFS和SSTF
4. 循环扫描算法(C-SCAN)
- 思想:磁头单向移动来提供服务,回返时直接回到起始端而不服务任何请求
- SCAN和C-SCAN,磁头总是严格地从盘面的一端到另一端
5. LOOK和C-LOOK调度
- 思想:磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点
- 默认SCAN和C-SCAN为LOOK和C-LOOK
3. 磁盘的管理
1. 磁盘初始化
- 物理分区:将磁盘分为由一个或多个柱面组成的分区
- 逻辑分区:创建文件系统,操作系统将初始的文件系统数据结构(包括空闲和已分配的空间及一个初始为空的目录)存储到磁盘上
2. 引导块
- 初始化程序(自举程序)——开机即运行
- 初始化CPU寄存器、设备控制器和内存等,然后启动操作系统
- 将磁盘上的操作系统内核装入内存,并转到起始地址,从而操作系统开始运行
- 注意:只在ROM中保留很小的自举程序,将完整功能的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位(C盘)
3. 坏块
- 定义:无法使用的扇区(硬件故障,不可修复)
- 处理方法
- 对于简单的磁盘:可以在逻辑格式化时对整个磁盘进行坏块检查,在FAT上标明
- 对于复杂的磁盘:控制器维护一个磁盘坏块链表,同时将一些块作为备用,用于替代坏块(扇区备用)
4. 补充
- 文件系统实现
- UNIX的索引结点