文件系统笔记七、文件目录、属性、共享、挂载的实现方式
引言:在上一篇笔记中,主要讲了文件系统布局及数据存储,这一篇笔记将记录一些相对边缘的问题,比如文件夹如何完成由文件名至文件地址的映射、文件属性的实现、长文件名如何实现、文件是如何共享的、文件系统挂载实现。这些是设计文件系统均需考虑的问题,本篇仅是一些通识性介绍。
1、文件名至文件地址的映射
文件夹的任务是提供从文件名至文件地址的映射,对于文件不同的组织形式,文件的地址表示存在差异,其地址映射方式也存在差异。
1)、文件连续存放:只需要文件的第一个数据块的磁盘地址即可,后面的数据块紧接在该数据块的后面。这种情况下文件夹里面存放的映射是到I-NODE数据块地址。
2)、链表组织形式:只需要知道文件的第一个数据块的磁盘地址即可,后面的数据块可以通过前面的数据块里面指针得到,这种情况下文件夹里面存放的也是到I-NODE数据块地址。
3)、FAT组织形式:*映射仍然保持不变*,我们可以从FAT里面找到后继数据块所在的物理磁盘地址。
4)、I-NODE组织形式:只需要知道文件对应的顶级I-NODE地址即可,文件的数据块地址可以从I-NODE里面获得,这种情况下文件夹里面存放的是到I-NODE编号。
2、文件属性的存放:
每个文件都有一个文件名,而文件里面存放的是数据。但除此之外,还有很多信息是我们感兴趣的,如文件是谁创立的、谁拥有这个文件、是不是可以随机访问等等,这些称为文件属性。
文件属性存放位置因文件组织方式不同而有所差异,如果是连续或链表组织形式,只有文件夹里面可以存放文件属性,如图1所示。
如果是I-NODE组织形式,则属性可以存放在文件夹里,也可以存放在I-NODE里。(其实是一致的,均在访问数据前,获取文件属性)。
3、长文件名的存放:
文件夹存放的是文件名到文件地址的映射,那么每一个文件将在文件夹里面占用一个记录。既然是记录,总有一个长度。为了便于读取文件,文件夹里面的长度通常是固定的(便于计算机处理),对于文件名很长的情况,即文件名长度超过记录能容纳的长度时?如何存放文件名呢?
1)、不允许使用长文件名:这个办法简单,但是用户体验差。
2)、在文件夹内为长文件名分配多个空间:这样造成每个文件占用目录夹记录不一样情况,使得读写更加复杂。
3)、将文件名放在一个可变长度空间:保持文件记录的长度不变,将文件名存放在另一个分开的地方,如系统堆空间。这样每一个文件记录里面保存保存一个指针指向堆里面存放在该文件名的地址。
4、文件共享的实现:
4.1、基本实现:
就像到达一个目的地通过多条路可走一样,访问一个文件也可以选择多条路径,我们通过符号链接可以让多个用户共享一个文件,即一个文件有多个路径名,从多个路径都可以找到该文件在磁盘上存放的地址,即该文件的映射情况保存在多个文件夹里面。
具体来说,就是当用户将一个文件链接到另一个文件夹时,该文件夹里面会增加一条记录,用来保存该文件到文件地址的映射。而为了保持系统一致性,此时会在I-NODE里面记录被链接的次数。有了链接后,文件删除的操作需要修改,删除不是马上将文件删除,而是将该文件对应I-NODE里面的链接计数减1,如果结果为0,即删除该文件,如果不为0,即不删除该文件。
当我们保存其他人百度网盘分享的内容,可能原理也是类似,并不是将元数据拷贝,仅仅是I-NODE值加1,当原文件拥有着删除数据后,I-NODE不为0,同样物理数据没有删除,仅仅是逻辑数据删除。我们还是拥有这个文件的访问权。
4.2、硬链接与软链接:
上面讲到的链接方式,即将文件地址映射加到链接目录下,称为硬链接。这是因为另外一条路径断开后(如删除文件或者路径上文件),其他链接不受影响。硬链接存在的问题是使得文件的创建者没有权利断开已经链接用户的链接。
软链接就是在链接目录里,存放到链接文件的原始路径名。即从链接目录访问文件需要从原始路径过来,这样当原始路径断开时,该链接自然也就断开了,这种在原始路径断开后,不能访问的链接称为软链接。
5、文件系统挂载的实现:
挂载这个词听起来有点高端了,起始我们U盘插到笔记本电脑上,就是一个文件系统挂载的过程。挂载是用来将一个文件系统并入到另一个文件系统的方法,挂载时需要提供被挂载的文件系统的根目录和挂载点。挂载实际上就是修改挂载点的目录内容,增加一个记录将该文件系统的根目录I-NODE地址保存起来。
我们平时用的光盘、U盘等上面都存在一个文件系统,但是我们在平时是无法访问该文件系统的,需要将它们插入计算机相应的设备或结构上,这种插入操作就是挂载,使得光盘、U盘上的文件系统,称为计算机文件系统的一部分,从而可以对其访问。在Windows下,挂载点一般是“我的电脑”, 而在Linux下,挂载点可以是任何目录。同理,卸载即将挂载点目录内容中相关记录删除。
6、闲置空间的管理:
无论是内存还是磁盘空间,操作系统必须保持其使用情况的记录,即哪些空间被占用,哪些空间闲置。有位图及链表两种管理方式,如下所示:
6.1、位图管理闲置空间:
为每个分配单元赋予一个字位,用来记录该单元是否闲置,例如字位取值0表示分配单位闲置,字位取值1表示分配空间被占用,即为位图表示法,其优点是直观简单,在搜索需要闲置空间是只需要找到一篇连续0个数大于等于所分配空间即可。
从图中可以看出,空间前5个单元已经被占用,接下来是4个分配单元处于闲置状态,可以供程序使用,依次类推。
6.2、链表表示闲置空间:
另外一种将分配单元按是否闲置链接起来,这种办法称为链表表示法。
图中P代表程序,及当前这篇空间由程序占用。后面的数字是本片空间的起始分配单元号和大小,而H表示空洞,表示这是一篇闲置空间。例如,图中的第1个链表项表示一个大小为5个分配单元的程序,起始地址为第0个分配块。第2个链表表示一片大小为4个单元的闲置空间块,起始地址为第5个分配单元。
6.3、位图表示和链表表示的比较:
位图表示和链表表示各有优缺点,如果数量少,那么链表比较好,因为链表表项数量少,如果仅有3个程序,则最多需要7个链表,但如果程序多,那么链表的节点就很多。
位图表示法成本固定,不依赖于内存中的程序,因此二者优劣依具体情况而定。从可靠性上,位图表示法没有容错能力 ,但其更改状态时,时间成本低,操作简单。
6.4、磁盘分配块及磁盘配额
关于磁盘块的内容,可参考文件系统笔记三、磁盘块。分配块多大是一个折中考虑的问题,如果分配过大,则浪费空间多。如果分配过小,则数据传输慢。磁盘分配块大小、磁盘利用率与有效数据传输之间存在一定关系如下:
另外无论我们使用什么互联网产品,如QQ、邮箱、百度网盘等。都存在一定的存储空间容量,常见的是,一个用户只能创建一定的文件数且所有文件加起来不能超过某个容量限定。学习文件系统之后,我们对这些有了更好的理解。
小结:本文介绍了文件系统的地址映射、文件属性的存放、长文件名的存放、文件共享机制、文件系统挂载、磁盘闲置空间管理。
参考资料:
1、《操作系统的哲学》 邹恒明 著
纠错与建议
邮箱:db_hebut@163.com