一、多级索引文件存储
由于连续存储,链表非连续存储,索引非连续存储均存在着一定的弊端(具体内容可以参考上一篇博文),unix文件系统综合考虑以上各方式的优点和缺点采用了多级索引文件存储的方式。
多级索引文件存储的结构图如下:
对于小文件,文件头直接记录数据块的位置,
对于较大的文件,以三级索引为例,文件头记录一级索引的位置,一级索引中会记录二级索引的位置,二级索引中会记录三级索引的位置,三级索引中记录着数据块的位置。
这种方式最大的好处是,可以根据文件的大小灵活地采用不同的存储方式,若文件太小,则通过直接查找数据块的方式,可大大节省时间。
二、空闲空间的管理
空闲空间的管理有三种方法:
1)空闲表法
这种方法的逻辑是,将连续的空闲地址存入表中,表中记录一个连续的空闲地址中的起始块号和连续的空闲块的个数。
操作系统在查找空闲空间的时候,会在空闲表中依次扫描,找出一个合适的空闲区域,在进程结束释放空间时,同样也需要扫描这张表,选择一个合适的位置,插入进程释放的空闲空间的信息。
优点:
实现简单
支持随机访问
缺点:
维护空闲表的开销太大
若存在大量小的空闲区域,则空闲表的查询效率极低
2)空闲链表
该方法的逻辑是将所有的空闲区域以链表的形式连接起来,操作系统查找空闲空间时,遍历链表,找出合适的空闲空间。进程释放空间时,将空闲空间加入到链表末尾。
优点:
实现较为简单
开销较空闲表小
缺点:
不支持随机访问
寻找空闲空间需要遍历链表,效率太低
3)位图法
这种方法的逻辑是用二进制的01来表示这个磁盘块有没有被使用,0位空闲,1为使用。
1111110011111110001110110111111100111
优点:
访问效率较高
支持随机访问
维护成本较小
三、linux文件系统结构
各部分介绍如下:
1)超级块 ,包含的是⽂件系统的重要信息,⽐如 inode 总个数、块总个数、每个块组的 inode 个数、每个块组的块个数等等。
2)块组描述符 ,包含⽂件系统中各个块组的状态,⽐如块组中空闲块和 inode 的数⽬等,每个块组都包含了⽂件系统中所有块组的组描述符信息。
3)数据位图和 inode 位图 , ⽤于表示对应的数据块或 inode 是空闲的,还是被使⽤中。
4)inode 列表 ,包含了块组中所有的 inode,inode ⽤于保存⽂件系统中与各个⽂件和⽬录相关的所有元数据。
5)数据块 ,包含⽂件的有⽤数据。
四、目录的存储
目录保存的数据结构为哈希表,查找一个目录下的文件,或文件下的子目录,可以通过文件名或者目录名得到一个hash值,通过这个hash值定位到具体的块号,在这个块号中将存储着文件或者子目录的相关数据和文件类型等信息。
优点:
对于表中的某个文件或者子目录,查找迅速
插入和删除较为简答
缺点
hash值可能存在冲突,需要一定的处理措施
目录查询是在磁盘中反复搜索实现的,操作系统与磁盘键IO操作的开销较大,为解决这一弊端,操作系统将查找过的目录缓存在内存中,便于下次查找。