【2021/7/19更新】【梳理】简明操作系统原理 第十四章 UNIX文件系统(docx)

配套教材:
Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau Andrea C. Arpaci-Dusseau Peter Reiher
参考书目:
1、计算机操作系统(第4版) 汤小丹 梁红兵 哲凤屏 汤子瀛 编著 西安电子科技大学出版社

在线阅读:
http://pages.cs.wisc.edu/~remzi/OSTEP/
University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的
————————————————————————————————————————
这是专业必修课《操作系统原理》的复习指引。
需要掌握的概念在文档中以蓝色标识,并用可读性更好的字体显示 Linux 命令和代码。代码部分语法高亮。
文档下载地址:
链接:https://pan.baidu.com/s/1-mJDw1ALmM0lvBPJucDREQ
提取码:0000

十四 UNIX文件系统

最早的UNIX文件系统的结构是这样的:

S区域记录了整个文件系统的基本信息,包括卷(volume)大小、索引节点数、指向空闲区域开头的指针,等等。索引节点区包括全部文件的索引节点。数据区则记录文件内容。
这个文件系统结构简单,而且为文件与目录的层次结构的实现打下了基础。但是,这种结构的文件系统的性能很糟。因为它并没有考虑机械盘的结构。当磁盘读取索引节点后,可能需要寻道至较远的位置才能读到文件。硬盘使用久了以后,还会产生许多碎片(fragment),使得性能问题雪上加霜。
产生碎片的机理有:
(1)硬盘尽可能在距离磁头最近的空白位置开始写入文件,写入完毕后磁头会悬停,不会主动移动到另一片空白区域。
(2)文件被删除以后,释放出来的空间不会与其它空闲空间合并。
(3)当一段空闲空间写满后,如果文件尚未写入完毕,必须寻找另外的空闲空间继续写入。
可见,随着磁盘的使用,磁盘碎片将会越来越多:



磁盘碎片整理(defragmentation)程序能够将文件的多个不连续部分尽量合并,从而减少碎片、恢复磁盘性能。
此外,最初的文件系统的块大小很小(512 Bytes),虽然减少了内部碎片,但数据传输速率受到严重影响。

后来,Berkeley的一个研究小组研发了快速文件系统(Fast File System,FFS)。FFS充分考虑了磁盘的物理结构,以求尽量提升性能。FFS保持相关的API(open()、read()、write()、close()等)不变,而大改内部结构。
FFS开创了文件系统研究的新纪元。事实上,所有的现代文件系统都保持接口的不变来确保兼容性,而在内部结构的改进上下功夫。

FFS将磁盘划分为大量的柱面(cylinder)。一个柱面指的是不同盘面上相同位置(离圆心的距离相同)的磁道的集合。若干个连续的柱面又归为一个柱面组(cylinder group)。
当然,磁盘不会向文件系统透露太多的信息。文件系统不知道一个柱面到底怎样被使用。磁盘只是简单地将逻辑地址报告给文件系统,而隐去了盘片的几何细节。因此,现代文件系统(例如ext2、ext3、ext4)将磁盘划分为块组(block group)。一个块组包含许多个块,对应磁盘上的一段连续空间。如果两个文件存放在同一个柱面组或块组中,FFS就能保证依次访问它们不用进行长时间的寻道。
划分了柱面的硬盘中,为了保证顺序访问的速率,两个编号相邻的逻辑块在磁盘上的物理位置不一定是相邻的。

每个柱面组的结构是这样的:

与最初的UNIX文件系统一样,S区为文件系统的装载所需。而且这个区域有多个备份,如果一个副本损坏了,由于还有其它副本,挂载和访问文件系统不受影响。
在组内,FFS需要追踪每个索引节点和数据块。索引节点位映像(inode bitmap,ib)和数据位映像(data bitmap,db)负责这个功能。位映像是管理空闲空间的优秀方式,原因是:通过位映像,可以迅速找到一个大块的空闲区域,并将其分配给一个文件。这种方法也许还可以避免在老式文件系统上的空闲列表本身的碎片问题。

以创建一个空文件为例,我们来说明文件系统用到的数据结构如何更新。
虽然文件是空的,但是它依然需要占用一个块(一般为4 KB)。由于是新创建的文件,所以需要一个新的索引节点。索引节点区和索引节点位映像区都需要更新。文件本身也有一些数据,这些写入数据区,数据位映像也要修改。到这里为止,创建一个文件需要在所在的柱面组进行4次写入(这些写入操作可能先存入缓冲区里)。
光是这些还没完,当创建新文件时,必须将其写入正确的层级,即目录树需要正确更新。文件所在的目录中,必须添加新文件的相关信息;这个更新可能在父目录所在的数据块内就可以完成,也可能需要申请新的数据块,并更新位映像。父目录的索引节点也要更新,因为目录的长度和修改日期都改变了。

FFS放置文件、目录和元数据的原则是:将相关联的信息尽量靠近。于是,具有相关关系的信息尽可能被放在同一个块组;不具有相关性的内容则不放在同一块组。为了实现这个目标,FFS应用了一些启发式算法。
对于目录,FFS尽量找到一个已分配目录较少、空闲的索引节点较多的柱面组(以便之后能够在此分配更多的文件),将目录数据和索引节点放入。当然,也可以运用其它的算法(比如考虑空闲数据块的数量)。
对于文件,FFS做两件事。首先,(一般情况下)确保将数据块和索引节点分配在同一组,避免访问索引节点和数据时需要长时间寻道。其次,它将同一目录下的所有文件都放在目录所在的柱面组中。
以下是一种分配 /、/a、/b、/a/c、/a/d、/a/e、/b/f的方式:

与之相对的是将索引节点尽量分散的分配方式,这种方式使得一个柱面组的索引节点表不会很快被写满:

访问一个目录时,一
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值