先来扯淡吧,上一篇文章说到要补习的第二篇文章介绍文件系统的,现在就来写吧。其实这些技术都已经是很久以前的了,但是不管怎么样,是基础,慢慢来学习吧。有种直接上Spark源码的冲动。。

1. 这篇博客具体什么内容?

这篇博客是一篇文件系统入门文章,介绍一种概念上的文件系统,VSFS(Very Simple File System)

2. 文件系统是什么?

文件系统,首先是单纯的软件,因此不会涉及到使用机器硬件特征来优化文件系统;其次,它主要包含两方面内容,什么样的结构来组织文件,怎么利用这种文件结构来完成读写删除操作。

3. 建立VSFS文件系统

  磁盘的最小存储单位是扇区(Sector),首先将磁盘划分为一个个磁盘块(Block),每个块大小4KB,于是我们获得了这样的磁盘空间:

  其次将这64个磁盘块的后56个磁盘块作为存储真实文件数据的区域,称为数据块(Data Region),此外,为了方便查看文件的属性等元数据,我们为每个文件建立一个inode(256Byte),然后将所有文件的inode统一组织起来放在磁盘的固定区域,在这里我们将其放在3-7这5个磁盘块(Inodes):

  在这里,每个inode占用256Byte的空间,而一共是5*4Kb,故而我们一共最多可以存储80个inode,也就是说我们这个小型简单文件系统最多存储80个文件。
  此外,为了便于磁盘管理,我们使用位标记为来标注Data Region 和 Inodes区域的使用情况(假设如果使用则设置,位为1,否则为0),为此分别占用1和2这两个磁盘,分别称为inode bitmapdata bitmap
  最后,我们需要一个磁盘块来存储整个文件系统的原信息(称之为SuperBlock),包括系统管理的数据规模、文件数目、inode区域起始物理地址等等吧。于是最终我们的文件系统磁盘占用是这样的:

  我们这个文件系统接入到操作系统之后,操作系统会首先根据SuperBlock来初始化一些参数,然后将这个文件系统接入到操作系统的文件系统树上面去。

4.VSFS文件系统各部分具体实现

5. 读写操作是怎么执行的

6. Cache

使用Cache来缓存一些数据,这样可以加速操作,比较文件读写太恶心了,读就不多说了,除了缓存数据本身还可以缓存目录的地址。写缓存(Write Buffering) ,这个主要是通过暂缓执行写操作,而尽可能将I/O合并,调度等等吧,是个很好玩的地方。
当然了,你也可以强制不使用write buffering,fsync()就是干这个的。


7. 参考文献

  1. http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf