Fast File System,快速文件系统,是由Berkeley大学研究人员设计并实现的建立在UNIX操作系统的一套文件系统。这个系统主要目标已经体现在它的名字上,就是建立一个快速的文件系统。因为他们发现之前的UNIX的文件系统(参考之前的Blog文章“Concepts of Unix File System”)在性能方面存在问题,主要问题是在磁头定位,位置转化过程中浪费了大量的时间,导致效率不高。所以FFS的一大设计思路就是降低磁头的seek时间,而解决方案也很简单,keep related stuff together,这样seek的时候就可以节省时间。整个FFS涉及几个关键概念

Creating New File

Cylinder Group翻译过来就是柱组,已经在之前Blog文章Concepts of Unix File System介绍过了,设计Cylinder Group的目的就是为了完成keep related stuff together,因为在一个柱组的文件可以快速访问。所以相关文件就可以放在一个柱组里。每个Group先包含一个superblock来保存一些metadata,后面接着是inode bitmap和data bitmap用来显示每个block的位置和其是不是已经写满了。

当创建一个文件的时候,比如/foo/bar.txt,并且这个文件大小是4kb。那么因为这是一个新的文件,所以需要分配新的inode而且inode bitmap也需要更新。同时,这个文件大小4kb,在cylinder group中就要分配一个4kb的block然后更新data bitmap来表示对应的data block已经占用。所以这就需要有四次写操作,但是这只是完成了这个文件的创建,并没有把它放进文件目录中。所以父目录/foo也要更新,来把bar.txt放到这个目录下。如此才算完成了一个文件的创建

具体策略也很简单。第一,将一个文件的所有block放到一个group,这样就避免了磁盘磁头的long seek,从而节省了时间。第二,在相同目录的文件放在一个group里,比如/dir1/1.txt, /dir1/2.txt, /dir1/3.txt, 和/dir99/4.txt,那么前三个就会被放到一个group里,最后一个就被放到另一个group里。

Large File Exception

Put Related File Together的策略有一个例外,就是写入当大文件时。按照之前的策略一个大文件的所有block都会被放到一个group中,但是由于文件太大,可能整个group或者大部分group都被这个文件占满了,这就不符合把相关的文件放在一起的原则,因为这个group里只有这一个文件,只要有再访问别的文件就需要seek别的group,这大大降低了FFS的性能。对于写入大文件的策略就是,把它所有block平均的放到不同的group中