文件系统

引言

我们以探究式的方式来讲解文件系统:

  • 从零开始,提出最基本的需求,设计最基本版本的文件系统。
  • 然后不断迭代,从而引出现代操作系统使用的文件系统。

首先思考下什么是文件?

  • 首先,文件是用来保存数据的,那么数据保存在了哪里呢?
  • 保存在了磁盘中
  • 即文件和磁盘是有关的,那么两者是什么关系呢?
  • 文件是操作系统对磁盘(一级永久性存储介质)的抽象

为什么要讲文件以及磁盘的关系呢?

  • 我们说文件是对磁盘的抽象
  • 其实是一种底层思维,磁盘的基本属性是保存信息、数据
  • 那么提供一个抽象层或多个抽象层的目的是方便使用
  • 同理,我们在各个领域遇到这种情况也可以借鉴这里的思路:提供一层或多层抽象,从而由不易使用到容易使用

以同样的思路来思考问题:

  • 进程是什么的抽象?
  • 地址空间呢?

进程是对CPU的抽象:这样说可能有点笼统,但是思考下:进程是用来做计算任务的,那么CPU呢?CPU也是做计算的。

地址空间是对物理内存的抽象:对物理内存最简单的理解就是从0顺序编号,经过基层抽象和改进后形成了虚拟地址空间的抽象层。

文件系统需要做什么工作?

下面会讨论几个问题,主要围绕着文件系统需要实现哪些功能,方便我们设计文件系统。

1.关于文件名的限制:

  • 操作系统-课堂笔记-文件系统(南航)
  • 为什么文件名中不能有上述字符?作为程序员我们要能真正的回答这个问题,而不是这样的答案:国际规定、方便管理、这是要求,像样的回答最起码应该是:
    • 以上字符可能在别处使用过了,那么到底在哪里使用过了呢?
    • \:这个字符熟悉嘛?Windows下文件路径分隔符,如果文件名里用了,那么造成了歧义,我们看到路径不禁怀疑,这到底是个路径还是个文件呢?
    • /:这个有些历史原因,该字符是DOS界面的指令标识符,如果使用,会造成指令和文件名的混乱
    • ::冒号在Windows下是用来指定盘符的,不能使用的原因同上
    • *:熟悉正则表达式的应该知道,该字符是用来模糊匹配的,称为通配符
    • ?:同上,也是通配符
    • ":双引号为什么不能使用呢?做开发熟悉的童鞋可能知道,在cmd里参数之间要加空格,那么如果文件名里有空格怎么办?将文件名用双引号引起来就好了,所以双引号不能额出现在文件名里!
    • < >:同样需要一些额外的知识才能理解,在Linux里的重定向使用的是<和>
    • |:同样需要一些额外的知识,该符号是管道符,做过操作系统相关实验的同学应该比较容易了解

现在明白了叭,原来Windows的要求都是有据可循的,不是平白无故的要求。

2.文件扩展名有哪些

Windows下有哪些扩展名?

  • .exe, .c, .cpp, .gif, .html, .jpg等等,这些扩展名有什么用呢?做个小实验就明白了
  • 首先我有一张图片:
    操作系统-课堂笔记-文件系统(南航)
  • Windows直接给了我一个缩略图,而且双击可打开。
  • 然后我修改它的扩展名为.jp:
    操作系统-课堂笔记-文件系统(南航)
  • 发现了吗?缩略图没了,然后我再双击:
    操作系统-课堂笔记-文件系统(南航)
  • 出现了这个鬼东西

做了上面的实验后,思考这些扩展名有什么用呢?

  • 图片的扩展名是.jpg的时候,双击直接可以打开,也就是说Windows知道.jpg文件需要用哪个应用程序打开
  • 但是当扩展名被修改成.jp的时候,双击就不行了,Windows说让我找新应用
  • 所以说:扩展名在Windows下的作用是用来标识文件的打开方式
  • 在Unix上,系统对扩展名不做要求,扩展名仅仅用来帮助用户和应用程序识别文件,比如一个常用的操作ubuntu还原之前先备份:cp source.list source.list.back, 目的文件名的后缀名很随意吧!vim source.list.back照样可以打开的!

3.文件有哪些类型?

  1. 普通文件
  2. 目录文件
  3. 特殊文件:特殊文件用于管理 I/O 设备

4.文件是怎么保存的以及文件的属性和操作

文件是字节串:

  • 文件是一串字节
  • 用户可以将任意内容放入文件
  • OS 不关心文件的具体内容
  • windows,unix均采用了这种文件结构

文件存取方式:

  • 最简单的方式:顺序读取
    • 从头开始读,顺序读,知道结尾
    • 比如磁带
  • 直接存取:
    • 方式一:每个read函数指明地址,磁头移动到对应地址直接存取
    • 方式二:先seek,然后再顺序读取(Windows Linux均采用此方式)
    • 比如磁盘

文件有哪些属性?

  • 直观的看下有哪些字段,后面具体讨论
    操作系统-课堂笔记-文件系统(南航)
    对文件需要有哪些操作?
  • 创建
  • 删除
  • 读、写
  • 设置读写位置
  • 设置和获取文件属性
  • 重命名等

文件目录怎么表示呢?

  • 目录是我们下面实现文件系统时需要重点关注的地方,历史上出现过单级文件目录系统
  • 仅仅有一个目录,所有文件都在此目录下
  • 世界上第一台超级计算机CDC 6600采用此法。

单级文件目录的优缺点:

  • 简单易实现
  • 查找速度慢,不允许重名

多级目录(树型结构目录):

  • 当前我们的Windows就是多级目录
  • 本质是一个树型结构,目录里还能有目录

路径名:

  • 每个文件都有唯一的路径,比如: C:\Users\xxx, /root/xxx
  • 有绝对路径和相对路径之分

对目录的操作

  • 搜索文件
  • 创建文件
  • 删除文件
  • 遍历目录
  • 重命名文件

文件的实现

上文就算做需求分析了,下面我们来考虑如何实现我们的文件系统。

如何为文件分配磁盘空间?

磁盘调度中讲过:CHS寻址的基本单位是扇区,扇区大小是512字节,LBA寻址的基本单位是块,块大小是扇区的整数倍,一般为4K,那么如何给文件分配物理块呢?这是本小节要解决的问题。

1.连续分配-形如数组的思想

基本思想

 思想很简单,比如第一个文件占8K,假设物理块大小为4K,那么分配给它两个块完事;后面跟12K大小的文件,同理分配3个物理块,形如数组的思想;

存在的问题

 那么问题来了,内存管理中我们已经讨论过连续分配方案的缺点,在磁盘分配这里仍然适用:碎片问题难以解决,碎片如何生成的,点击前述链接仔细阅读!

示例

操作系统-课堂笔记-文件系统(南航)
上图中空白的块即形成的碎片,需要引入“紧凑操作”来解决碎片问题,紧凑后:
操作系统-课堂笔记-文件系统(南航)
从上图可以看出,我们要访问一个文件只需要知道该文件的起始块号和长度即可,十分方便。

优缺点分析

优点:

  • 简单,访问只需要起始块号和长度
  • 可以随机存取,形如数组的随机存取
  • 访问速度快,读连续块的效率高,这里还是之前提到过的局部性原理

缺点:

  • 文件不能动态增长,形如数组插入新值,需要大量移动数组里的值,效率极低
  • 浪费空间:几次动态存储分配后就出现碎片问题,这需要引入“紧凑”操作来解决
连续分配方案的现状

“history often repeats itself”

由于需要提前声明文件大小,连续分配曾经一度被抛弃,后来出现一种特殊的存储介质,这种介质上的数据事先知道大小,并且不会动态删除,于是连续分配方法又被应用。知道这种介质是什么吗?

  • 这种介质是光盘,感觉老师说的这个现象我们90后可能体会不到,因为我们小时候就很流行光盘,我们的儿时也许就是上文所说的后来叭!
如何删除文件?

 数组中如何删除一个值?将后面的元素向前移动,覆盖掉要删除的值!这也是缺点所在,和插入是一样的道理,需要大量移动现有的值,效率极低

2.隐式链接分配—链表思想

基本思想

 文件用链表表示,每个磁盘块中用一个字段存储下一个磁盘块的地址,如下图所示:
操作系统-课堂笔记-文件系统(南航)
上图中的pointer就是指向下一个磁盘块的地址;

使用该方案实现示例:
操作系统-课堂笔记-文件系统(南航)

优缺点分析

优点:

  • 可以有效的消除外部碎片,磁盘利用率高
  • 文件大小可动态增长,不必事先声明文件大小

缺点:

  • 指针占用空间,使空间利用率变低;
  • 指针占用空间,导致可用字节数不是2的幂次方,这是致命的,为什么?
    • 假设一个块占4K,即由8个扇区组成,我现在要访问块中的第513字节的内容;
    • 考虑块首中没有指针,那么513>>9=1,得到扇区号,直接去找1号扇区即可(从0开始计数);
    • 考虑块首中包含指针,那么(513+pointer_size)>>9才能得到扇区号,每次访问都会多一次加法运算,会影响效率;
  • seek操作:访问特定盘块需要多次读盘
  • 这种方案的可靠性比较低,如果链中的某一个丢失,那么后面的内容全找不到了,学过数据库应该了解,如何增强可靠性?做冗余!
  • 这种方案很难做冗余,因为pointer保存在每个block中,容易做冗余的实现方案是尽可能将pointer集中起来,所以衍生出下文的显式链接;

3.显式链接(FAT)—不纯粹的表

隐式链接思想很简单,就是我们数据结构中学到的链表的基本思想,其存在的问题很明显,也很致命,所以我们考虑显示链接的方法,所谓显式链接即表的思想;

表的思想贯穿的计算机的设计,如页表、段表、多级页表,其实最基本的思想还是来源于生活:书籍的目录就是最典型的表思想;

基本思想

这里的表的思想比较特殊,不是纯粹的书籍目录式的表,而是带指针的表,如下所示:
操作系统-课堂笔记-文件系统(南航)
含义是2号后面接4号,4后面接5号,5后面接1号,1后面接0号!

这样,在文件的结构体中可以只指明起始block块号,然后根据起始block块号以及FAT即可找到文件的所有内容!

优缺点分析

优点:

  • 隐式链接方式的所有优点都具备
  • 查找指定盘块的速度比隐式链接快,因为可以将FAT表一次读入内存,并让其常驻内存中。

缺点:

  • 磁盘比较大时,文件分配表大,占用内存比较多。
  • 下面举例说明:

200GB磁盘,block大小为1KB,问FAT表需要多少项?若描述每个FAT表项需要的比特数为32的整数倍,则FAT表需要消耗多少内存?

  • 200GB/1KB=200M个block
  • 256M=228
  • 即最起码要用28位才能表示一个block号,4字节对齐,即需要4个字节
  • 200M个block号占用的内存空间:200x220x4=0.78GB。
  • 这个有点大了~!接近1G的内存都被FAT吃掉了,要是32G内存还好说,要是4G内存或者更低内存机器呢?计算机早期的内存可都是很小的:Linux0.11版(1991年发布)内核只能管理16M的内存!

FAT占用那么多内存可不行,有没有缓解方案?

  1. 可以将部分FAT放磁盘上鸭,但是会使索引效率降低。
  2. 也可以适用大一点的block,那么保存小文件就很浪费空间了~!
  3. 所以说FAT还不是很好,我们还需要继续改进!

事实上FAT文件系统在历史上使用过很长时间,有这么几个版本:FAT12 FAT16 FAT32,具体发展历史可自行查资料。

知识补充-FAT文件系统目录项

上面的FAT建立起了块与块之间的联系,对于文件系统来说,我们还需要确定文件与文件、文件夹与文件之间的逻辑关系,还有文件名等信息,这些信息保存在目录项中。

FAT文件系统中,每一个文件和文件夹都分配到一个目录项,目录项中记录着文件名、大小、文件内容起始地址以及其他属性,下面看下FAT32文件系统中的目录项组成结构:
操作系统-课堂笔记-文件系统(南航)
上图中的文件起始簇号的高16位和低16位和FAT表有关,有了高16位和低16位就可以去FAT表中找到一整条链,从而能找到完整的文件!

文件和文件夹如何表示?

  • 上图中的属性字节给出了一个字段,叫子目录
  • 如果某文件不是目录的话,那么其文件起始簇号指示的便是文件的内容
  • 如果某文件是目录的话,那么子目录属性位为1,然后文件起始簇号指示的是一条一条记录,这些记录表示该目录下的文件和文件夹,这里有点绕,下面做个小题目:

FAT文件系统中存取的基本单位称为簇,簇是扇区的2次幂,也可以当成之前的块来理解。

在FAT文件系统下查找C:\Windows\1.txt,请描述查找的过程:

  • 首先找驱动器C对应的目录项,该目录项中的文件起始簇号指示了其目录文件地址。
  • 有了目录文件地址,就可以访问到C盘下的所有记录,在其中寻找名为Windows的子目录。这里也有点多级页表的含义,即驱动器C对应的目录项里的文件起始簇号指示的是某一个簇,这个簇里保存的是C盘下的文件(夹)的目录项,的确有点绕,好好体会下!
  • 根据Windows子目录项对应的文件起始簇号继续找该目录下的所有文件(夹),找到名为1.txt的文件
  • 然后将1.txt目录项对应的文件起始簇号对应的簇读入到内存中,OK!

一定要注意上面描述中黑体字部分,目录项的概念很重要,另外上述过程中涉及到数次将数据读入到内存。

计算题

在某FAT16文件系统中,FAT表的每个表项用16位表示,每**簇(即,块)**64扇区,扇区的大小为512字节。
  该分区最大可为多少字节?
  其FAT占用多少存储空间?

解答:

  • 16位能索引216个块
  • 一个块大小是:64*512=215字节
  • 216+15=231字节,即该分区最大可位2GB大小
  • 一个表项16位,即2个字节,216个表项共占217字节大小,即128KB

4.索引分配—纯粹的表思想

我们从连续分配改进成隐式链接,然后再改进成显式链接,显式链接的问题是FAT占用太多的空间,如果将其载入到内存会占用太大的空间,所以我们提出使用索引分配的方案;

这里索引分配的方法可以理解成纯粹的表思想,和分页管理-分页管理类似,同样引入了多级索引结构!

基本思想

首先介绍一个数据结构:inode,该结构中有何内容可以看下图:
操作系统-课堂笔记-文件系统(南航)
该数据结构中包含了文件的基本属性和文件所占用的块号,其中块号就是这里的索引,文件中的具体字段的含义见下文。

优缺点分析

优点:

  • 克服了显式链接方法FAT太大的缺点,如何克服的?使用混合索引结构(详解见下文)
  • 每个文件对应的inode中包含直接索引和一、二、三级间接索引,兼顾大小文件(详解见下文)

4.1索引分配V1-混合索引结构

操作系统-课堂笔记-文件系统(南航)

  • 前面部分是inode,后半部分是block。inode是目录,block是各个章节的内容。我们想要访问某一个文件,最先访问的是inode,从inode得知文件在哪些block中,然后去各个block中去取出内容即可。
  • 另外:inode和block前面都有一个bitmap,用来标识哪些inode或block已经被使用了,比如bitmap是:101,表示第一、三个inode已经被使用,第二个未被使用。
  • 然后看inode的内容:前面几个字段是文件应该有的属性,比如文件大小、文件名等。后面的#0 #1就是用来标识block的ID号,即第0章在第几页,第一章在第几页。
  • 当上述十章目录满足不了我的书籍内容时,会使用多级目录如single indirect和double indirect 和 triple indirect。
  • indirect的含义是间接索引
  • 一个single indirect表示什么?它指向一个block,该block中全部都是block的id,double triple indirect的含义同single indirect。

下面做计算:

  • 首先我们假设要支持1T的最大寻址空间
  • 一个block是4K
  • 1T/4K=240/212=228,即最少需要用28位才能表示所有ID
  • 考虑四字节对齐,所以我们用4个字节,即32位来表示ID号

题目一:40KB+1024B的文件应该分配几个block?

  • (40KB+1024B)/4K=11, 向上取整
  • 我们需要使用11个block才能将文件内容保存起来
  • 那么inode怎么对其进行表示呢?靠#0–#9只能索引40KB内容,所以我们需要使用single indirect,而single indirect需要占用一个block
  • 所以最终需要的空间是:11block的内容+1block的single indirect+1个inode

题目二:单级索引能索引多大文件?二级呢?三级呢?

  • 我们这里的单级索引指的是single indirect
  • 一个single indirect指向一个block,该block中保存的全部都是block id信息
  • 一个block占4KB,一个id占4B,那么一个block能保存1024个id信息
  • 那么一个single indirect所能索引的最大空间是1024x4K=4MB
  • 同理double indirect所能索引的最大空间是:4MBx1024=4GB
  • 一个triple indirect所能索引的最大空间是:4GBx1024=4TB

题目三:一个文件大小是:40K+4M+4M+4K问怎么分配inode?

  • 首先将上式除以4K,得10+1024+1024+1
  • 第一个10用1个一级索引即可(后面有个1,直接索引留给1用)
  • 后面两个1024怎么办?一个single indirect只能寻址1024个block,所以我们需要一个二级索引
  • 该二级索引里面包含两个一级索引
  • 最后一个1用直接索引,即#0-#9
  • 1个一级索引结点+1个二级索引结点+2个一级索引结点+1个直接索引
  • 所以共需要block为:10+1024+1024+1+1+1+2=2063个block

考题:混合索引结构(就是上述结构)中的inode应该包含哪些
内容?

字段 含义
filename 文件名
mode 文件的访问模式
owners 文件的拥有者
timestamps 时间戳
size block block的大小?占用多少block?
count 第几个inode?
#0-#9 10个直接索引
single indirect 一级间接索引
double indirect 二级间接索引
triple indirect 三级间接索引

4.2索引分配V2-列优化

第一个版本的文件系统已经搞定,而且我们通过几个题目也理清楚了其工作原理,那么思考该版本的文件系统有何缺点?

  • 考虑一个功能:文件查找,该文件系统如何实现文件查找?
  • 我们搜索文件都是按照文件名进行搜索,那么这里如何搜索呢?
  • 该版本的文件系统的文件名保存在inode的第一个字段里,我们要通过遍历所有inode来查找文件名。
  • 即每次找一个filename都需要跳跃一段空间,思考有没有更高效的实现?
  • 能不能将文件名集中保存起来,从而提升文件搜索效率?
  • 思路一:将所有文件名集中起来,做成一个hash表,hash表的查找效率不错
  • 但是文件搜索功能需要处理通配符,即模糊查找,这是hash表做不到的。
  • 所以衍生出版本2:inode不按照上述顺序设计,而是将filename提到最前面,先保存filename再保存其他信息

上述优化方案称为列优化,是数据库设计中使用的一种方案
操作系统-课堂笔记-文件系统(南航)
仔细看下上图,f0 f1 f2 … 后面对应i0 i1 i2…,f0 f1 f2是文件名,i0, i1, i2是各个文件对应的inode。

有了列优化后如何实现模糊搜索呢?

  • emmm其实我也没搞懂
  • 笔者将自身的理解写出来
  • 首先列优化的作用是优化了文件搜索的速度
  • 为什么列优化能提高搜索效率呢?这里涉及到空间局部性原理的知识,局部性原理
  • 其实局部性原理也很好理解:一个知识点在书本的第2页,找起来很方便。但是如果一个知识点被拆分,分别放在了第1页,第10页,第11页,那找起来就慢了!~ 这就是空间局部性!
  • 模糊搜索的原理是什么呢?我觉得需要去了解下正则表达式的原理才行,这里先把这个问题放这,这里能够理解列优化可以优化查询效率即可。

4.3索引分配V3-支持多级目录

到这里:v1版本实现了大文件的存储,v2版本优化了搜索性能,回想前面我们引入的问题,我们如何支持文件目录功能呢?

  1. 最简单的做法是维护一张名字地址映射表
  2. 此处的名字包含目录地址
  3. 如果是单级目录还好说
  4. 如果是多级目录呢?可能需要添加一个字段,表示父目录,这样的话搜索时间复杂度就提高了,所以需要思考更好的方法实现多级目录!

思考这样的实现:将
声明:

  • Unix、Linux系列操作系统中的根目录是/!
  • 理论上来讲,我们可以只使用一个inode来表示文件系统,该inode表示根目录/!
  • 下图给出实现方案
    操作系统-课堂笔记-文件系统(南航)
     根目录的inode对应的#0中的block记录了dir1 i3 D等信息,说实话这里我也搞混了,没弄明白老师的这张图是啥意思
     i3可能指示某个block,这个block中保存了inode信息,即明面上的inode只有i0了,其余的都隐藏在了block中?
     上面仅仅是猜测,实在是不记得当时老师的意思了,哪位同学如果记得评论给我说声哈!

不过我记得本版本的缺点是:可靠性差,如果i0丢失,那么整个文件系统就全没了~!提高可靠性的主要手段是做冗余,做冗余的前提是最好保证数据是集中的,而本版的inode是分散的,所以继续改进;

4.4索引分配V4-支持多级目录-优化

操作系统-课堂笔记-文件系统(南航)
本版本将inode集中起来,方便做冗余从而提高了文件系统的可靠性!

原谅我思路断了一下,不过这里的考题集中在和混合索引相关的计算,仔细做做上面给出的几个例题就OK!

使用inode后如何查找文件呢?以/home/exam/t1.c为例:

  • Unix、Linux系统的根目录是/,所以先读入根目录的inode,根目录inode对应的编号应该是0!
  • 有了根目录的inode之后,便能得到根目录下对应的所有文件(夹)对应的inode(看上图)。
  • 将所有inode读入内存,搜索所有inode,找到文件名为home的inode。
  • 同理我们从home-inode得到的home目录下的所有文件(夹)对应的inode。
  • 然后再这些inode读入内存,再搜索得到exam对应的inode。
  • 同理根据exam-inode得到了exam目录下的所有文件(夹)对应的inode。
  • 然后将这些inode读入内存,从其中找名为t1.txt对应的inode,找到后根据其inode里面的直接索引和间接索引将对应的块读读入内存,OK!

关于文件共享

还记得数据库系统发展的三个阶段吗?人工管理阶段、文件系统阶段、数据库系统阶段!

文件系统阶段的缺点是什么?文件共享性差,冗余度高!为何差,且看下文详解

基于索引结点的共享方式

操作系统-课堂笔记-文件系统(南航)
Wang用户和Lee用户共享某个文件, inode里的索引结点编号对应是相同的,此方案的缺点是拥有者无法彻底删除文件,举个例子:

我将本博客以上述方案分享给大家,有一天我不想让大家看博客了,我要删除该博客,但是我这个删除没有任何意义,我删除后指示博客的拥有者变成你们了,你们仍然可以看,是不是很鸡肋!

基于符号链接的共享方式

类似于Windows的快捷方式,Linux中也有,具体可了解ln命令,符号链接中保存的是某文件的路径地址,不能保存磁盘地址(不然拥有者也无法删除了,为何如此?思考文件删除的过程,因为删除文件并没有改变磁盘中的内容,只是无法根据inode找到对应的磁盘内容了)。

此方案的优点是:拥有者可以彻底删除文件,具体原因仔细思考删除文件过程(见下文)。
缺点是:需要多次读盘,笔者感觉也不算什么缺点叭!

本小结的内容仅仅是为了说明一点:文件系统的共享性比较差,数据库系统的共享性要比文件系统强!但是文件系统更加傻瓜式,数据库系统就得需要程序员技能了!

日志文件系统

还记得数据库中的日志吗?回想下:数据库中的事务如果执行了一半关机了,重启后数据库系统是怎么撤回已做的更改的?就是利用日志文件!

数据库中的日志是为了保证事务的原子性的,同理这里的日志文件系统也是此功能!

从删除文件说起

数据库课上被经常举的例子是银行转账:A给B转账,A的账户余额减了,断电,B的余额没有加,这是一种错误的状态,如何避免这种错误状态?

同理我们从删除文件讲起,思考如何删除一个文件?

  1. 从目录文件里删除(到底删除的什么内容,TIPS:和inode有关)
  2. 将inode归还
  3. 将磁盘空间归还(里面的数据其实还在的,只不过找不到了)为何这样?可能是因为将磁盘所有内容重新覆盖一遍效率很低!

正常情况下,上述几个操作的次序无所谓,但是如果执行过程中断电了呢?

  • 可能出现这种情况:只把目录里的条目删除!
  • 只归还了i-node
  • 只释放了磁盘空间~!?那不就乱套啦

错误解决方案

这里和数据库日志的解决方案是一样的:操作之前先将操作记录到磁盘,然后执行操作,执行完毕后,删除磁盘中的记录。

思考上述问题的具体解决方案:断电后重启,发现记录还有没被删除的,那么根据记录重新执行,然后将记录删除。

以上就是日志文件系统的基本思想,NTFS(Windows家族使用的文件系统)、EXT3(Linux家族使用的文件系统)等均体现了上述思想!

总结

本章主要讨论了文件系统的改进方案,考虑的主要问题还是如何分配空闲磁盘。

  1. 首先是连续分配,缺点在于碎片问题
  2. 隐式链接法,致命的缺点是块可用空间不是2的整数幂
  3. 显式链接法,FAT文件系统还是用了很长时间的,其缺点是FAT占用空间太大!
  4. 离散化:使用位示图+混合索引,就是书籍的目录思想,和之前的页表思想是一致的!
  5. 其实隐式链接和显式链接也是离散化方案,只不过没有索引方法离散的彻底,他们的基本思想都是查表

有错别字可以评论说声,希望CSDN出个文档校验功能!

本系列博客目录
下一篇:EXT2文件系统

相关文章:

  • 2021-10-21
  • 2021-05-15
  • 2021-12-31
  • 2021-11-21
  • 2021-08-23
  • 2022-02-17
  • 2022-03-05
  • 2022-01-20
猜你喜欢
  • 2022-01-10
  • 2021-08-08
  • 2021-07-06
  • 2021-07-25
  • 2021-10-01
  • 2021-04-25
  • 2021-12-27
相关资源
相似解决方案