基本概念:
扇区是最小的物理存储单元,但是一般不直接对扇区进行操作,而是将多个相邻扇区组合成一个更大的集合来操作。(扇区概念在设备管理磁盘满存储器管理)
Windows下叫做簇,Linux下叫做块(以下称为盘块)。
一、连续分配
1. 连续分配方式
把逻辑文件中的记录顺序地存储到邻接的各物理盘块中。这种分配方式保证了逻辑文件中的记录顺序与存储器中文件占用盘块的顺序的一致性。为使系统能找到文件存放的地址,应在目录项的“文件物理地址”字段中,记录该文件第一个记录所在的盘块号和文件长度(以盘块数进行计量)。
就像内存动态分配一样,随着外存(磁盘)空间的分配(创建文件)和收回(删除文件),磁盘空间将会如同内存一样被分割成很多小块,这些小块的连续去的区域难以用来存储文件。
可以使用紧凑的方法,把所有文件紧凑在一起,把所有碎片连成一大块。但是对外存的一次紧凑花费巨大。
2. 连续分配的优缺点
优点:
(1)顺序访问容易。
(2)顺序访问速度快。
缺点:
(1)必须要有连续的空间。(结合1中提到的碎片化)
(2)必须事先知道文件的大小。
(3)对于动态增长的文件,即使事先知道最终大小,也会导致在未达到最终大小前,一直有大量的空间闲置。
二、链接分配
1. 隐式链接
在采用隐式链接分配方式时,在文件目录的每个目录项中,都须含有指向链接文件第一个盘块和最后一个盘块的指针。
如图,该文件第一个盘块是9,最后一个盘块是25,进入9之后可知下一个盘块是16->1->10->25。
缺点:
(1)只适合顺序访问,随机访问及其低效,例如一个文件存储在200个盘块上,要访问第150个,必须从第一个依次访问到第150个。
(2)一旦中间有一个链接断了,则之后的所有文件全部无法访问。
解决方法:两种策略(Windows类和Unix类)
2. 显式链接
这是指把用于链接文件各物理块的指针,显式地(集中)存放在内存(硬盘)中的一张链接表中。该表在整个磁盘仅设置一张,就是把链表指针集中存放。
在每个表项中存放链接指针,即下一个盘块号。由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。由于分配给文件的所有盘块号都放在该表中,故把该表称为文件分配表FAT(File Allocation Table)。
3. FAT和NTFS技术(Windows)
3.1 FAT12
FAT是以盘块(簇)为基本分配单位。
12代表FAT表项为12位。
早期MS-DOS操作系统所使用的是FAT12文件系统,在每个分区中都配有两张文件分配表FAT1和FAT2,在FAT的每个表项中存放下一个盘块号,它实际上是用于盘块之间的链接的指针,通过它可以将一个文件的所有的盘块链接起来,而将文件的第一个盘块号放在自己的 FCB中。
每个分区的最大空间:
由于FAT表项只有12位,则最多有(2^12)/2(因为有两者FAT表)=4096个盘块。若一个盘块大小为521字节,则一个分区最大容量为2MB(4096✖512B)。每个盘块不能太大,不然跟连续分配就很相似了,碎片化严重。
因此想要让每个分区容量变大只能增加FAT表项。
3.2 FAT16
随着磁盘容量增加,FAT12最多只有4096个盘块,意味着每个盘块大小将会增加,就会跟连续分配类似,碎片化严重。因此需要增加表项。
我们把具有16位表宽的FAT表称为FAT16。将FAT表的宽度增至16位,最大表项数将增至65536个,此时便能将一个磁盘分区分为65 536个盘块(216簇)。
在FAT16中每个簇可拥有盘块数量为4、8、16、32、64。若一个盘块512字节,那么一个分区最大为2048MB(512*64*216)。(为什么分成216簇含义暂不明确)
3.3 FAT32
FAT32出现原因依旧是硬盘空间继续变大,FAT16已经不够用。
FAT32表可以表示4 294 967 296项,即 FAT32允许管理比FAT16更多的簇。这样就允许在FAT32中采用较小的簇(如4KB),FAT32分区格式可以管理的单个最大磁盘空间达到4 KB×2^32 = 2 TB。
三种FAT类型的最大分区以及所对应的块的大小:
3.4 NTFS
NTFS采用数据库引擎实现,具有许多新的特征:
➢使用了64位磁盘地址,理论上可以支持磁盘分区大小为:2^64;
➢支持长文件名;
➢系统容错,系统出现故障或差错时,正常运行;
➢数据的一致性;
➢NTFS还提供了文件加密、文件压缩等功能。
4. 索引分配(Unix/Linux)
4.1 单级索引分配
链接分配方式虽然解决了连续分配方式所存在的问题,但又出现了下述另外两个问题:
(1) 不能支持高效的直接存取。要对一个较大的文件进行直接存取, 须首先在FAT中顺序地查找许多盘块号。
(2) FAT本身需占用较大的内存空间。由于一个文件所占用盘块的盘块号是随机地分布在FAT中的,因而只有将整个FAT调入内存,才能保证在FAT中找到一个文件的所有盘块号。当磁盘容量较大时,FAT可能要占用数兆字节以上的内存空间。
(3)安全性。
事实上,在打开某个文件时,只需把该文件占用的盘块的编号调入内存即可,完全没有必要将整个FAT调入内存。
为此,应将每个文件所对应的盘块号集中地放在一起。为每个文件分配一个索引块(表),再把分配给该文件的所有盘块号都记录在该索引块中,因而该索引块就是一个含有许多盘块号的数组。在建立一个文件时,只需在为之建立的目录项中填上指向该索引块的指针。
4.2 多级索引分配
为一个大文件分配索引块是,盘块装满了索引块就得分配第二个索引块,当文件足够大,一个文件就对应很多索引块,反而很低效。因此建立一级索引块作为这些索引块的索引块。、
当文件非常大,可以建立三级、四级索引块。
4.3 混合索引分配方式
所谓混合索引分配方式,是指将多种索引分配方式相结合而形成的一种分配方式。
既采用了直接地址,又采用一级索引分配方式,或两级索引分配方式等。
这种混合索引分配方式已在UNIX系统中采用。
(1)直接地址
为了提高对文件的检索速度,在索引结点中可设置10个直接地址项,即用iaddr(0)~iaddr(9)来存放直接地址。
在这里的每项中所存放的是该文件数据所在盘块的盘块号。假如每个盘块的大小为 4 KB,当文件不大于40 KB时,便可直接从索引结点中读出该文件的全部盘块号。
(2)一次间接地址
对于大、中型文件,只采用直接地址是不现实的。为此,可再利用索引结点中的地址项iaddr(10)来提供一次间接地址。
这种方式的实质就是一级索引分配方式。在一次间址块中可存放1 K 个盘块号,因而允许文件长达4 MB。
(3)多次间接地址
以此类推。