操作系统概念笔记——第十一章:文件系统实现
Posted 叶卡捷琳堡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统概念笔记——第十一章:文件系统实现相关的知识,希望对你有一定的参考价值。
文章目录
第十一章:文件系统实现
文件系统永久地驻留在外存上,外存可以永久存储大量数据。
本章主要讨论在最为常用的外存(磁盘)上,如何存储和访问文件的有关问题
11.1 文件系统结构
磁盘提供大量的外存空间来维持文件系统。
磁盘有下列两个特点,这两个特点使其可以称为存储多个文件的方便介质
- 可以原地重写。可以从磁盘上读一块,修改该块,并将它写回原来的位置
- 可以直接访问磁盘上的任意一块信息。从一个文件切换到另一个文件只需要简单地移动读写磁头并等待磁盘转动即可完成
为了提供对磁盘的高效且便捷的访问,操作系统通过文件系统来轻松地存储、定位、提取数据
I/O控制为最底层,由设备驱动程序和中断处理程序组成,实现内存与磁盘之间的信息传输
基本文件系统只需要向合适的设备驱动程序发送一般命令就可对磁盘上的物理块进行读写。
文件组织模块知道文件及其逻辑块和物理块。可以将逻辑块地址转换为基本文件系统所用的物理块地址
逻辑文件系统管理元数据。元数据包括文件系统的所有结构数据,而不包括实际数据。逻辑文件系统通过文件控制块维护文件结构
文件控制块(FCB)
包含文件的信息,如拥有者、权限、文件内容的位置。
11.2 文件系统实现
11.2.1 概述
实现文件系统要使用多个磁盘和内存结构。在磁盘上,文件系统可能包括如下信息:如何启动所存储的操作系统、总块数、空闲块的数目和位置、目录结构以及各个具体文件。
(每个卷的)引导控制块:包括系统从该卷引导操作系统所需要的信息。如果磁盘没有操作系统,则这块的内容为空
(每个卷的)卷控制块:包括卷的详细信息。分区的块数、块的大小、空闲块的数量和指针
文件系统实现的操作结构
11.3 目录实现
11.3.1 线性列表
最简单的目录实现方法是使用存储文件名和数据库指针的线性列表
要创建新文件,必须首先搜索目录以确定没有同样名称的文件存在。接着,在目录增加一个新条目。
要删除文件时,根据给定文件名搜索目录,接着释放分配给它的空间
11.3.2 哈希表
哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针。因此,它大大地减少目录搜索时间。插入和删除也比较简单,但需要避免产生冲突
11.4 分配方法
常用的磁盘空间分配方法主要有三个
- 连续分配
- 链接分配
- 索引分配
11.4.1 连续分配
连续分配方法要求每个文件再磁盘上占有一组连续的块。
磁盘地址为磁盘定义了一个线性序列,采用这种方式,在访问块b后访问块b+1通常不需要移动磁头。当需要磁头移动时,只需要移动一个磁道
如果文件有n块长并从位置b开始,那么该文件将占有块b,b+1,b+2,…,b+n-1
一个文件的目录条目包括开始块的地址和该文件所分配的区域的长度
对于连续分配的文件,访问相对比较容易。如果需要顺序访问,则文件系统会记住上次访问过块的磁盘地址,如需要可读入下一块。要直接访问一个从块b开始的文件的块i,可以直接访问块b+i。因此连续内存分配支持顺序访问和直接访问。
连续分配会存在外部碎片问题,随着文件的分配和删除,磁盘空闲空间被分成许多小片。只要空闲空间分成小片,就会存在外部碎片。
为了减少连续分配中的缺点,有些操作系统使用修正的连续分配方案,该方案分配一块连续空间,当空间不够时,另一块被称为扩展的连续空间会被添加到原来的分配中
如果采用这种分配,那么文件块的位置就成为开始地址、块数、指向下一拓展的指针
11.4.2 链接分配
链接分配解决了连续分配的所有问题。
在链接分配中,每个文件是磁盘块的链表:磁盘块分布在磁盘的任何地方。
目录包括文件第一块的指针和最后一块的指针。
比如,一个有5块的文件可能从第9块开始,之后是第16块,第1块,第10块,最后是第25块。
每块都有一个指向下一块的指针
链接分配也有缺点。主要问题是,链接分配只能有效地用于文件的顺序访问。要找到文件的第i块,必须从文件的开始起,跟着指针,找到第i块。对指针的每次访问都需要读磁盘,有时需要磁盘寻道。因此,链接分配不能有效地支持文件的直接访问
链接分配的另一个缺点是,指针本身也需要空间。因此,每个文件也需要比原来更多的空间
对上面这个缺点的解决方法是使用簇,一个簇包含多个磁盘块。文件系统可以定义一个一个簇为4块,并以簇为单位来操作。当然这种方法的缺点是增加了内部碎片,如果一个簇没有被充分使用,那么就会浪费更多空间。
链接分配的变种:文件分配表-FAT
磁盘每个卷的开始部分用于存储该FAT,每块都在该表中有一项。该表可以通过块号码来索引
FAT的使用与链表类似,目录条目包含文件首块的块号码。根据块号码索引的FAT条目包含文件下一块的块号码。这条链会一直持续到最后一块,该块对应FAT条目的值作为文件结束值。
未使用的块用0值来表示。为文件分配一个新的块只要简单地找到第一个值为0的FAT条目,用新块的地址替换前面的文件结束值,用文件结束值替代0。
一个由块217、618、339组成的文件的FAT结构如图
11.4.3 索引分配
虽然链接分配解决了连续分配的外部碎片和大小声明问题。但是,如果不用FAT,那么链接分配就不能有效支持直接访问。
索引分配通过把所有指针放在一起,即通过索引块解决了这一问题
每个文件都有它的索引块,这是一个磁盘块地址的数组,索引块的第i个条目指向文件的第i块
目录条目包含索引块的地址。要读第i块,通过索引块的第i个条目的指针来查找和读入所需的块
当创建文件时,索引块的所欲哦指针都设为nil。当首次写入第i块时,先从空闲空间管理器中得到一块,再将其地址写到索引块的第i个条目
索引分配支持直接访问,且没有外部碎片问题
索引分配的问题:会浪费空间。假设每个文件只有一块或两块长,采用链接分配,每块只浪费一个指针,采用索引分配,尽管只有一个或两个指针为非空,也必须分配一个完整的索引块。
每个文件必须有一个索引块,因此需要索引块尽可能地小。但如果索引块太小,那么它不能为大文件存储足够多的指针。因此必须使用一定的机制来处理这个问题
链接方案: 为了处理大文件,可以将多个索引块链接起来
多层索引: 用第一层索引块指向一组第二层的索引块,第二层索引块再指向文件块。为了访问这一块,操作系统通过第一层索引查找第二层索引,再用第二层索引查找所需的数据块。
组合方案: 在UFS中使用的方案是,将索引块的头15个指针存在文件inode中,当中的头12块指向直接块,其它三个指针指向简介间接块。第一个间接块为一级间接块的地址。一级间接块为索引块。下一个是一个二级间接块指针,它包含了一个块的地址,而这个块中的地址指向了一些块,这些块中又包含了指向真实数据块的指针。最后一个指针为三级间接块指针。
Unix的inode
11.5 空闲空间管理
11.5.1 位向量
在操作系统中,通常用位图或位向量实现空闲空间表,每块用一位表示。
如果一块为空闲,则其位为1。如果一块已分配,则其位为0。
例子
这种方法的主要优点是,查找磁盘上的第一个空闲块和n个连续空闲块时相对简单和高效
在使用位图的系统上找到第一个空块来分配磁盘空间的一种技术是,按顺序检查位图的每个字,看其是否为0,再对第一个值为非0的字进行搜索值为1的位偏移,该偏移对应着第一个空闲块
11.5.2 链表
空闲空间管理的另一种方法是将所有空闲磁盘块用链表连接起来,并将指向第一空闲块的指针保存在磁盘的特殊位置
11.6 效率和性能
在讨论了块分配和目录管理方法,可以进一步讨论它们对磁盘效率和性能的影响。
由于磁盘是计算机中最慢的部分,因此磁盘速度通常成为影响系统性能的瓶颈
11.6.1 效率
磁盘空间的有效使用主要取决于所使用的磁盘分配和目录管理算法。
通常,与文件相关的所有数据项都需要研究,以考虑其对效率和性能的影响
访问数据的指针大小也会影响磁盘的效率
11.6.2 性能
不同的操作系统采用不同的缓存方式,有的系统采用一块独立内存作为缓冲缓存,位于其中的块假设马上需要使用。其它操作系统使用页面缓存来缓存文件数据,页面缓存使用虚拟内存技术,将文件数据作为页而不是面向文件系统的块来缓存,这有时也被称为统一虚拟内存
统一虚拟内存的优点
打开文件访问有两种方法,一种是IO映射,另一种是使用系统调用read和write
如果没有使用统一缓存,则内存映射需要使用两个缓存:页面缓存和缓冲缓存,这种需要两次缓存文件数据的方法被称为双重缓存。这不但浪费内存,还会消耗CPU时间
如果提供了统一缓冲缓存,可以避免双重缓存,也可以使允许虚拟内存系统管理文件数据
11.7 恢复
文件和目录可以保存在内存和磁盘中,因此必须确保数据不会丢失并保证数据的一致性
11.7.1 一致性检查
一致性检查程序将目录结构数据与磁盘数据块相比较,并试图纠正所发现的不一致。
分配算法和空闲空间管理算法决定了检查程序能发现什么类型的问题,以及如何成功地纠正问题
11.7.2 备份和恢复
磁盘有时会出错,所以必须注意确保数据在出错时不会永远丢失。因此,可以利用系统将磁盘中的数据备份到另一存储设备。这样,恢复单个文件或磁盘时,只需要从备份中进行恢复就可以了
以上是关于操作系统概念笔记——第十一章:文件系统实现的主要内容,如果未能解决你的问题,请参考以下文章