文件的物理结构是指如何为文件分配磁盘块,主要有如下三种分配方法
- 连续分配
- 链接分配
- 索引分配
类似于内存分页,磁盘中的存储单元也会被划分为一个个的块,很多操作系统中,块的大小与内存块、页面的大小相同
这一个块看起来虽然很简单,但是里面有很多东西。如下是一个块
Super Block
:超级块,存放的是文件系统本身的结构信息。记录的信息有block和inode(后面会说)的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入的时间等等。一旦破坏了Super Block那么整个文件系统的结构就被破坏了Group Descriptor Table
:块组描述符,描述了块组属性信息inode Table
和Data block
:inode Table中存储的就是Inode,每个inode会映射到对应data blocks。一个文件就对应一个inode,inode table有多大就有多少个inode也就可以最多存放多少个文件。有时候会出现一种情况,就是硬盘空间还有,却无法创建文件,这种原因就是文件数太多,但是每个文件又太小,将inode Table给占满了inode Bitmap
:上面两个很好理解,但是有一个问题:如何保证inode不重复?那么这就要靠inode Bitmap,本质是位图,如果inode Table里能存十万个inode,那么inode bitmap就是十万个0,也就是0000…000000(这10万个0占据的空间其实很小),创建文件时,就去遍历这个位图,只要位置处是0,那么就可以申请一个对应的inodeBlock Bitmap
:既然inode有位图,那么Block也有位图,其原理和上面的是相似的,只要位图某个位不为0,就能在块中申请空间,然后将对应位图的位传递给inode Table 和 Data block就能建立对应关系。比如第三个位是1,那么Date blocks=inode Table(3)
于是上面的文字信息可以用下面这张图解释
内存与磁盘之间的数据交换都是以块为单位进行的,也即每次读入一块或每次写入一块
从用户角度上来看,面对的文件是一个统一的整体,但是文件被分块后,所有块可能会被离散地分配到磁盘的不同位置处,那么这里就又涉及到了逻辑地址和物理地址,因此操作系统就要负责从逻辑地址到物理地址的映射
- 逻辑地址:文件的逻辑地址可以表示为 (逻辑块号,块内地址)
- 物理地址:某一块真实存放在磁盘中的位置
一:连续分配
连续分配:连续分配要求每个文件在磁盘上占有一组连续的块。支持顺序访问和直接访问,也即随机访问。且在顺序读/写时速度最快(因为磁头移动时间短)
由于是连续分配,所以各个块的相对地址是没有改变的,因此当用户给出要访问的逻辑块号时,只要操作系统找到该文件对应的目录项,那么物理块号=起始块号+逻辑块号
所以文件目录中需要记录起始块号 和 长度(也即整个文件占用多少个块)
不过,由于连续分配要求每个文件占用的块是连续的,所以在拓展时如果剩余连续的块不够了就会产生迁移,十分不方便
另外连续分配还会使存储空间利用率变低,产生一些很难利用的细小磁盘碎片
二:链接分配
连续分配:链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为以下两种
- 隐式链接
- 显式链接
A:隐式链接
隐式链接中,每个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何地方,除最后一个块外,其余块都有指向下一个块的指针,这些指针对用户来说是透明的。目录中则会记录文件存放的起始块号和结束块号。该种方式易于文件拓展,并且所有空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高
采用这种方式,当用户想要访问逻辑块号 i i i时,就必须从0号块开始依次顺序地访问到第 i i i-1块,所以它不支持随机访问
B:显式链接
在显式链接中,会把所有指针从每个物理块中提取出来,显式的存放在内存的一张链接表中,该表在整个磁盘中仅设置一张,开机时将其读入内存,并常驻内存,称之为文件分配表(FAT)。同时在目录中仅需要记录文件的起始块号。FAT的各个表项在物理上是连续分配的,因而物理块号字段是隐含的。采用这种分配方式的文件,即支持顺序访问也支持随机访问,同时也不会产生外部碎片
当用户想要访问逻辑块号 i i i时,操作系统先找到FCB,然后从目录项中查找起始块号,然后查询FAT,就能找到 i i i号逻辑块对应的物理块了。并且逻辑块号转换为物理块号的过程不需要读磁盘操作
三:索引分配
(1)基本概念
索引分配:索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块,索引表的功能就像书的目录一样,需要哪个章节的内容,顺着目录查就可以了。索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块
- FAT是一个磁盘对应一张,而索引表是一个文件对应一张
采用索引方式的文件需要在FCB中记录自己的索引块号
由于可以用固定的长度表示物理块号,所以索引表中的逻辑块号可以是隐含的
在该种方式下,当用户想要访问某逻辑块时,操作系统首先找到该文件对应的FCB,然后从目录项中可查得索引表的存放位置,将索引表读入内存后,再查索引表即可找到该逻辑块号在外存中的存放位置。所以索引分配方式支持随机访问,并且文件拓展也很容易实现
(2)一个问题
索引分配方式最大的一个问题就是索引块的大小,索引块理应尽可能的小,但是索引块太小的话就无法支持大文件了(反过来的意思就是当文件太大时,一个磁盘块是装不下索引表的),所以常常会采用下面的机制来解决这个问题
- 链接方案
- 多层索引
- 混合索引
A:链接方案
链式索引块:如果索引表太大,那么可以将多个索引块链接起来存放,除最后一个索引块外,每个索引块最后都会留有一个指向下一个索引块的指针
如下
当然这种方式的缺点也显而易见,由于是靠指针来维护,无非会产生以下问题
- 如果索引块太多,那么访问最后一个索引块就必须要前面的所有索引块都加载进来
- 如果某个指针损坏了,那么后面的数据自然就无法读取了
B:多层索引
多层索引:类似于多级页表。使第一层索引块指向第二层的索引块。如有需要,还可以建立更高层的索引块
- 注意:和多级页表一样,每层索引表的大小不能超过一个磁盘块
如下,在FCB中需要记录顶层索引表的块号
C:混合索引
混合索引:是多种索引分配方式的结合体。在混合索引中,一个文件的顶级索引表中,即包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表),还可能包含两级间接索引(指向两层索引表)
- 混合索引是考察重点,其中会涉及以下考察点。具体细节将在王道课习题中详细阐述