您的位置:首页 > 其它

[操作系统] 文件系统的实现(一)

2017-12-13 13:23 211 查看

文件系统的实现(一)

文件系统的实现一
文件系统布局

文件的实现

目录的实现

实现可变长度文件名

加快文件查找

1. 文件系统布局

文件系统存放在磁盘上。多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统。磁盘的0号扇区称为主引导记录(Master Boot Record,MBR),用来引导计算机。在MBR的结尾是分区表。该表给出了每个分区的起始和结束地址。表中的一个分区被标记为活动分区。在计算机被引导时,BIOS读入并执行MBR。MBR首先确定活动分区,读入第一个块,称为引导块并且执行。引导块中的程序将装载该分区中的操作系统。为统一起见,每个分区都从一个启动块开始。

除了从引导块开始,磁盘分区的布局是随着文件系统的不同而变化的。通常文件系统中都包含一个超级块,

超级块:包含文件系统的所有关键参数,在计算机启动时,或者在该文件系统首次使用时,把超级块读入内存。超级块中包含:确定文件系统类型的魔数、文件系统中数据块的数量以及其他重要管理信息


还有文件系统中的空闲空间管理,说明文件信息的i节点,根目录等。



2. 文件的实现

文件存储的实现的关键问题是记录各个文件分别用到哪些磁盘块。

连续分配

最简单的分配方案是把每个文件作为一连串连续数据块存储在磁盘上。所以,在块大小为1KB的磁盘上,50KB的文件要分配50个连续的块。块大小为2KB的磁盘,要分配25个连续的块。

在这个方法中,每个文件都从一个新的块开始,所以每个文件的最后一块可能会浪费一些空间。

优点:

实现简单,只需记住第一块磁盘地址和文件块数。一个简单的加法就能求出其他块的编号。

读操作性能较好,在单个操作中可以从磁盘上读出整个文件。只需要一次寻找(第一个块)之后不再需要寻道和旋转延迟。

缺点:

磁盘变得很零碎。当删除文件时,占用块被释放,留下很多空闲块。为了利用这些块(不能单纯的将后面的块移动,因为代价太高),所以需要维护一个空洞列表,当创建一个新文件时,需要挑选合适空洞,有必要知道文件最终大小。但是每次在程序执行前都需要询问最终文件大小。

链表分配(隐式链接)

为每个文件构造磁盘块链表,每个块的第一个字作为指向下一块的指针,块的其他部分存放数据。



优点:

可以充分利用磁盘块(除了最后一块中的内部碎片)。在目录中只需存放第一块的磁盘地址,文件的其他块就可以从这个首块地址查找到。

缺点:

顺序读文件非常快,但是随即存取很缓慢,因为每次都要从头开始寻找。

指针占去了一些字节,每个磁盘块存储数据字节数不再是2的整数次幂,因为许多程序以长度为2的整数次幂来读写磁盘块,所以读出完整的块就需要从两个磁盘块中获得信息,因此会降低系统运行效率。

在内存中采用表的链表分配(显式链接)

如果取出每个磁盘块的指针字,把它放在内存的一个表中,就可以解决隐式链表的不足。如下图所示,文件A一次使用了磁盘块4、7、2、10和12,文件B依次使用了磁盘块6、3、11和14。利用图中的表从块4开始,可以找到文件A的全部磁盘块。这个表格被存放在内存中,称为文件分配表(File Allocation Table, FAT)。



优点:

按照这种方式,整个块都可以存数据,长度依然是2的整数次幂。

整个链表都存放在内存中,目录项只需要记录起始块号就可以找到文件的全部块。

缺点:

主要缺点是要把整个表放在内存中。对于200GB的磁盘和1KB大小的块,这张表需要2亿项,每一项对应于这2亿个磁盘块中的一个块。每项至少3个字节,即至少600MB内存。对于大磁盘不合适。

i节点(索引分配)

给每个文件赋予一个称为i节点的数据结构,其中列出了文件属性和文件块的磁盘地址。如果每个i节点只能存储固定数量的磁盘地址,当一个文件所含的磁盘块数目超出了i节点所能容纳的数目,所以最后一个磁盘块的地址不指向数据块,而是指向一个包含磁盘块地址的块的地址。

如图所示,给定i节点就有可能找到文件的所有块。



优点:

相对于在内存中采用表的方式而言,这种机制只有在对应文件打开时,其i节点才在内存中。如果每个i节点占有n个字节,最多k个文件同时打开,那么为了打开文件而保留i节点的数组所占据的全部内存为kn个字节。这个数组的大小与要打开的文件个数相关,而与磁盘大小无关(FAT与磁盘大小成正比)。

3. 目录的实现

在读文件前,必须打开文件。打开文件时,操作系统利用用户给出的路径名找到相应目录项。目录项中提供了查找文件磁盘块所需要的信息。目录系统的主要功能是把ASCII文件名映射成定位文件数据所需的信息。

与此相关的是文件属性的存放问题。每个文件系统都要维护文件所有者,创建时间等相关属性。

直接存放在目录项中

很多系统直接将文件属性放到目录项中,目录中有一个固定大小的目录项列表,每个文件对应一项,其中包含一个文件名、一个文件属性结构以及用以说明磁盘块位置的一个或多个磁盘地址。

存放在i结点中

对于采用i节点的系统,可以将文件属性放在i节点中。这种情况下,目录项只包括文件名和i节点号。



4. 实现可变长度文件名

大多数操作系统支持可变长度的文件名,做简单的方法是为每个文件名给予一个长度限制,如255字符。但对于很多短文件名的系统,会造成空间浪费。

使用大小不等的目录项

这种方法中,每个目录项有一个固定部分,这个固定部分通常以目录项长度开始,然后是固定格式的数据,包括作者、创建时间、保护信息以及其他属性。这个固定长度的头的后面是实际文件名。如图所示,例如有3个文件project-budget、personnel和foo,每个文件名以一个特殊字符结束。为了使每个目录项从字边界开始,每个文件名被填充成整数个字。

缺点:

当移走文件后,引入了一个长度可变的空隙。与连续分配磁盘问题是一样的(造成多余碎片)。

一个目录项可能会分布在多个页面上,读取文件名时可能发生故障。

目录项中不包含文件名

使目录项自身有固定长度,而将文件名放置在目录后面的堆中。

优点:

当一个文件目录项被移走后,另一个文件的目录项总是可以适合这个空隙。

文件名不需要从字的边界开始

缺点:

必须要对堆进行管理,处理文件名时页面故障依旧可能发生。



5. 加快文件查找

当文件过多时,普通的线性查找速度很慢,可以采用两种方法优化。

散列表

将文件名散列,优点是查找迅速,缺点是需要复杂管理。

高速缓存

将查找结果存入高速缓存,在开始查找文件前,先查看文件名是否在高速缓存中。只适合查找主体的文件非常少的时候。

参考书目:现代操作系统第三版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: