文件存储
顺序分配
文件的数据是要存储在硬盘上面的,数据在磁盘上的存放方式,就像程序在内存中存放的方式那样,分为连续空间存放和非连续空间存放两种方式。不同的存储方式有各自的特点,它们的存储效率和读写性能各不相同。
连续空间存放方式顾名思义,文件存放在磁盘连续的物理空间中。这种模式下,文件的数据都是紧密相连,读写效率很高,因为顺序读取可以减少磁盘寻道。
使用连续存放的方式有一个前提,必须先知道一个文件的大小,这样文件系统才会根据文件的大小在磁盘上找到一块连续的空间分配给文件。所以文件头里需要指定起始块的位置和长度,有了这两个信息就可以很好地表示文件存放方式是一块连续的磁盘空间。
连续空间存放的方式虽然读写效率高,但是有磁盘空间碎片和文件长度不易扩展的缺陷。例如在磁盘块中存储了文件A、B和C:
假设文件B被删除了,此时最大连续空闲块数是6。如果新文件所需块数小于等于6,那么新文件可以被正常存放。如果新文件所需块数大于6,那么就无法以连续方式存放到磁盘。
把文件放进连续空闲区
解锁完整互动实验、进阶解析与精选参考答案。
链表分配
链表的方式存放是离散的,于是就可以消除外部碎片,可大大提高磁盘空间的利用率,同时文件的长度可以动态扩展。根据实现的方式的不同,链表可分为隐式链表和显式链接两种形式。
隐式链表实现的方式是文件头要包含第一块和最后一块的位置,并且每个数据块里面留出一个指针空间,用来存放下一个数据块的位置,这样从链头开始就可以顺着指针找到所有的数据块,所以存放是不连续的。
隐式链表存放方式的缺点在于无法直接访问数据块,只能通过指针顺序访问,以及数据块指针消耗了一定的存储空间。隐式链表稳定性较差,系统在运行过程中由于软件或者硬件错误导致指针丢失或损坏,会导致文件数据的丢失。
如果取出每个磁盘块的指针,把它放在内存的一个表中,就可以减少数据块指针占用,并避免为追踪指针逐个读取数据块。显式链接指把用于链接文件各数据块的指针,显式地存放在内存的一张链接表中,该表在整个磁盘仅设置一张,每个表项中存放链接指针,指向下一个数据块号。这个表格称为文件分配表(FAT, File Allocation Table)。
| 块号/FAT表项 | 下一个块 |
|---|---|
| 0 | — |
| 1 | — |
| 2 | — |
| 3 | 11 |
| 4 | 7 |
| 5 | — |
| 6 | 3 |
| 7 | 10 |
| 8 | — |
| 9 | — |
| 10 | 12 |
| 11 | -1 |
| 12 | -1 |
| 13 | — |
沿指针寻找分散的文件块
解锁完整互动实验、进阶解析与精选参考答案。
索引分配
链表的方式解决了连续分配的外部碎片和文件动态扩展的问题,但是不能有效支持直接访问,索引的方式可以解决这个问题。索引的实现是为每个文件创建一个索引数据块,里面存放的是指向文件数据块的指针列表,类似于书的目录,通过目录就可以找到对应章节。文件头需要包含指向索引数据块的指针,这样就可以通过文件头知道索引数据块的位置,再通过索引数据块里的索引信息找到对应的数据块。
索引数据块1
索引的方式优点在于:
- 文件的创建、增大、缩小很方便
- 不会有外部碎片的问题
- 支持顺序读写和随机读写
如果文件很大,大到一个索引数据块放不下索引信息,这时可以通过链表与索引的组合,这种组合称为链式索引块,它的实现方式是在索引数据块留出一个存放下一个索引数据块的指针,于是当一个索引数据块的索引信息用完了,就可以通过指针的方式,找到下一个索引数据块的信息。
索引数据块1
索引数据块8
从文件偏移直接跳到索引数据块
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
知识测验
连续、链表、索引:定位文件
下面是块0~15。删除B后按连续首次适应分配八块的D,写出空闲区、总空闲、最大连续区和D文件头;若D需要九块,能否分配?
每块512字节,定位D中文件字节偏移1570。另有四块文件:链表3 → 11 → 6 → 14 → END,或索引[3, 11, 6, 14];定位同一偏移,比较隐式链表、未缓存单索引块和已缓存FAT的磁盘读取次数。文件头已知,计入目标数据读取。