File System Implementation

这章会介绍一个简单的文件系统vsfs(Very Simple File System)。该系统为简化版的UNIX系统,纯软件;有现在大部分文件系统中的基本磁盘结构、访问方法和各种策略。

带着问题学习:如何实现一个简单的文件系统?

1. The Way To Think

要想理解文件系统如何工作,就要理解文件的系统的两个不同方面:

  1. 数据结构(data structures)
  2. 访问方式(access methods)

2. Overall Organization

开始研究vsfs文件系统的磁盘数据结构,第一件要做的事就是把磁盘划分成多个块(blocks);我们设计的简单的文件系统只有一个块,大小为4KB。

故构建文件系统的磁盘分区很简单:一系列的块,每个块大小为4KB。在N个大小为4KB块的分区中,从0到N-1寻址这些块。假设N = 64,如下所示:
在这里插入图片描述
这些块中存储的大部分都是用户数据(user data)。将用于存储用户数据的磁盘区域称为数据区域(data region),为了简单起见,将上述64个块的后56个块划分为数据区域,如下所示:
在这里插入图片描述
上一章我们也提及到,文件系统需要对文件进行信息描述,这种用于描述数据的数据称为元数据(metadata)。为了存储元数据,文件系统通常具有称为索引节点(inode)的结构。

为了容纳索引节点,磁盘中需要为其预留一些空间。假设64个块中5个块用于此,如下所示:
在这里插入图片描述
索引节点通常不大,对于一个文件系统而言,索引节点的数量表示文件系统中可以拥有的最大文件数

到目前为止,我们的文件系统有了数据块(D)和索引节点(I),但是还缺少一种重要组件来跟踪索引节点或数据块是空闲还是已分配,这种分配结构(allocation structures)是任何文件系统中必不可少的。

跟踪分配方法很有多,可以使用free list指向第一个空闲块,然后指向下一个空闲块;也可以使用bitmap,一个用于数据(d),一个用于索引节点(i),表示对应的对象/块是空闲(0)还是已使用(1):
在这里插入图片描述
上图中还剩一个块,我们保留其为超级块(superblock),用符号S表示,超级快包含该文件系统的特别信息。例如,文件系统中有多少个索引节点和多少个数据块、索引节点表从哪个块开始等:在这里插入图片描述
当使用文件系统时,操作系统首先会读取超级块的内容。

3. File Organization: The Inode

在文件系统的磁盘结构中最重要的一点就是索引节点(inode),inode为index node的简称。

每个索引节点间接地由一个数字(i-number)表示,该数字早期被叫做文件的低级名字。在简单的文件系统中,给定一个i-number,你能够直接计算出磁盘上对应的索引节点的位置。例如,给定20KB空间(5个4KB块),有80个索引节点(每个索引节点256B),假设索引节点起始地址为12KB(超级块起始地址为0KB,索引节点位图起始地址为4KB,数据位图起始地址为8KB)。则有如下所示:在这里插入图片描述
为了读取索引节点号32的内容,文件系统首先计算索引节点区域的偏移量 = 32 * sizeof(inode) = 8192,将其添加到索引节点起始地址(inodeStartAddr = 12KB),然后得到正确的地址20KB。

磁盘不是字节可寻址的,而是由大量可寻址的扇区组成,通常为512字节。故为了读取索引节点号32的内容,文件系统将发出一个读请求到扇区 20 * 1024 / 512 = 40。通常如下所示计算:

blk = (inumber  sizeof(inode_t)) / blockSize;
sector = ((blk * blockSize) + inodeStartAddr) / sectorSize;

在这里插入图片描述
设计索引节点最重要的决定之一就是该节点如何引用数据块的位置。一种简单的方法就是索引节点中存储指向磁盘地址的直接指针,这种方法的限制在于如果文件很大(大于块大小乘以inode中直接指针的数量),那么方法就会失效。

3.1 The Multi-Level Index

为了支持更大的文件,文件系统设计者不得不引进不同的索引节点结构。一种常见的想法就是使用间接指针,该指针不指向包含用户数据的块,而是指向包含更多指针的块,该块中的指针指向用户数据。假设有4KB块和4字节磁盘地址,又添加了1024个指针,那么文件可以增长为(12 + 1024)* 4KB = 4144KB。

如果文件还是太大,继续添加指向间接指针的间接指针,方法和创建目录一样。

总的来说,这种不平衡的树被称为指向文件块的多级索引方法。看一下包含12个直接指针以及一个和两个间接指针的示例。假设块大小为4KB,指针为4个字节,则此结构可容纳的大小为(12 + 1024 + 10242) * 4KB。

在这里插入图片描述

为什么要使用像这样的非平衡树?为什么不是别的方法?这都是通过研究者们数十年的研究得出的,一个重要结论就是大部分文件都很小。
在这里插入图片描述

4. Directory Organization

在许多文件系统中,目录具有简单的结构,只包含(entry name, inode number)对的列表。对于给定目录中的每个文件或目录,目录的数据块中都有一个字符串和一个数字;对于每个字符串,也可能有一个长度。假设一个目录dir(索引节点号为5)有三个文件(foo, barfoo, bar_is_a_pretty_longname),对应的索引节点号为12、13和24。如下所示:
在这里插入图片描述
reclen:record length(the total bytes for the name plus any left over space)
strlen:string length(the actual length of the name)

删除文件可能会在目录中间留下一个空白空间,因此也应该有一些方法来对其进行标记。

5. Free Space Management

一个文件系统必须清楚哪个索引节点和数据块是空闲的,哪个正在被使用;以致当一个新文件或目录被创建时,文件系统能够为其分配空间。因此,空闲空间管理(free space management)对于所有文件系统都很重要。

6. Access Paths: Reading and Writing

知道了文件系统中文件和目录是如何存储的,了解在访问路径上发生了什么是了解文件系统的第二个关键。对于以下示例,假设文件系统已经安装,因此超级块已在内存中,其他所有内容仍在磁盘上。

6.1 Reading A File From Disk

在这里插入图片描述

6.2 Writing A File To Disk

在这里插入图片描述

7. Caching and Buffering

相反,现代系统采用动态分区方法。具体而言,许多现代操作系统将虚拟内存页面和文件系统页面集成到统一的页面缓存中。通过这种方式,可以在给定的时间跨虚拟内存和文件系统更灵活地分配内存,具体取决于哪个需要更多内存。

原文地址:http://www.cnblogs.com/astralcon/p/16792733.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性