9.1 外存的组织方式
- 如第8章所述,文件的物理结构直接与外存的组织方式有关。不同的外存组织方式,将形成不同的文件物理结构。目前常用的外存组织方式有3种。
- (1)连续组织方式:在对外存采取连续组织方式时,须为每个文件分配一个连续的磁盘空间,由此所形成的文件物理结构是顺序式文件结构。
- (2)链接组织方式:在对外存采取链接组织方式时,可以为每个文件分配不连续的磁盘空间;通过链接指针可以将一个文件的所有盘块链接在一起,由此所形成的文件物理结构是链接式文件结构。
- (3)索引组织方式:在对外存采取索引组织方式时,所形成的文件物理结构是索引式文件结构。
- 在传统的文件系统中,通常仅采用上述组织方式中的一种来组织外存。在现代OS中,由于存在多种类型(特别是实时类型)的多媒体文件,因此,对外存可能会采取多种类型的组织方式。
9.1.1 连续组织方式
1.连续组织方式简介
- 连续组织方式又称为连续分配方式,要求为每个文件分配一组相邻的盘块。例如,第一个盘块的地址为b,第二个盘块的地址为b+1,第三个盘块的地址为b+2,……。通常,它们都位于一条磁道上,在进行读/写操作时不必移动磁头。在采用连续组织方式时,可把逻辑文件中的记录顺序地存储到邻接的各个物理盘块中,这样所形成的文件结构称为顺序式文件结构,此时的物理文件称为顺序文件。
- 连续组织方式保证了逻辑文件中的记录顺序与存储器中文件占用盘块顺序的一致性。为使系统能找到文件存放的地址,应在目录项的“文件物理地址”字段中记录该文件第一个记录所在的盘块号和文件长度(以盘块为单位)。图9-2所示为磁盘空间的连续组织方式,图中假定了记录与盘块的大小相同,count文件的第一个盘块号为0,文件长度为2,因此会在盘块号为0和1的两个盘块中存放count文件的数据。
- 如同内存的动态分区分配一样,随着文件建立时空间的分配和文件删除时空间的回收,磁盘空间将被分割成许多小块,这些小块已难以用来存储文件,此即外部碎片。同样,我们也可以利用紧凑的方法使盘上所有的文件紧靠在一起,将所有的碎片拼接成一大片连续的存储空间。但是,将外存空闲空间进行一次紧凑所花费的时间远比将内存进行一次紧凑所花费的时间多。
2.连续组织方式的主要优点
(1)顺序访问容易。访问顺序文件非常容易,系统可从目录中找到该顺序文件所在的第一个盘块号,从此开始逐个盘块地往下读/写即可。连续组织方式也支持对定长记录的文件进行随机存取。
(2)顺序访问速度快。采取连续组织方式所装入的文件,其所占用的盘块可能位于一条或几条相邻的磁道上,磁头的移动距离最少,因此,连续组织方式下访问文件的速度是几种外存组织方式中最快的一种。
3.连续组织方式的主要缺点
- (1)要求为一个文件分配连续的存储空间。由内存的连续组织方式得知,为一个文件分配连续的存储空间会产生许多外部碎片,严重降低了外存空间的利用率。如果定期利用紧凑方法来消除外部碎片,则又会花费大量的机器时间。
- (2)必须事先知道文件的长度。要将一个文件装入一个连续的存储区中,必须事先知道文件的大小。获知文件的大小有时只能靠估算,如果估算的文件大小比实际的小,则会因存储空间不足而终止文件的复制,并要求用户重新估算后再次复制。这会促使用户将文件长度估算得比实际的大,进而就会造成浪费。
- (3)不能灵活地删除和插入记录。为保持文件的有序性,在删除和插入记录时,不仅需要对相邻的记录做物理上的移动,还需要动态地改变文件的大小。
- (4)对于动态增长的文件,采用连续组织方式可能会覆盖物理上相邻的后续文件,因此无法满足文件动态增长的要求。另外,由于事先很难知道文件的最终大小,因此很难为其分配空间;即使事先知道文件的最终大小,在采用预分配存储空间这一方法时,也会使大量的存储空间长期空闲。
9.1.2 链接组织方式
如果可以将文件装到多个离散的盘块中,则可消除连续组织方式的上述缺点。在采用链接组织方式时,可为文件分配多个不连续的盘块,再通过每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表,由此所形成的物理文件称为链接文件。链接组织方式的主要优点是:①消除了外部碎片,提高了外存的利用率;②非常容易插入、删除和修改记录;③能适应文件的动态增长,而无须事先知道文件的大小。链接组织方式可分为隐式链接组织方式和显式链接组织方式两种。
1.隐式链接组织方式
- 在采用隐式链接组织方式时,在文件目录的每个目录项中,都须含有指向链接文件第一个盘块和最后一个盘块的指针。图9-3所示为磁盘空间的链接组织方式,其中所展示的链接文件占用了5个盘块。在相应的目录项中,指示了其第一个盘块号是9,最后一个盘块号是25。而每个盘块中都含有一个指向下一个盘块的指针,如在第一个盘块9中设置了第二个盘块的盘块号16;在第二个盘块16中又设置了第三个盘块的盘块号1。如果指针占用4B,则对于盘块大小为512B的磁盘,每个盘块中只有508B可供用户使用。
- 隐式链接组织方式的主要问题在于,它只适用于顺序访问,而对随机访问是极其低效的。如果要访问文件所在的第i个盘块,则必须先读出文件的第1个盘块,以此类推进行顺序查找,直至找到第i个盘块。当i=100时,须启动100次磁盘去实现读盘块操作,平均每次都要花费几十毫秒。可见,随机访问的速度很低。此外,只通过链接指针将一大批离散的盘块链接起来,其可靠性较差,因为其中的任何一个指针出现问题都会导致整个链断开。
- 为了提高检索速度和减小指针所占用的存储空间,可以将几个盘块一起组成一个簇。例如,一个簇可包含4个盘块,在进行盘块分配时是以簇为单位进行的,链接文件中的每个元素也是以簇为单位的。这样将会大幅减少查找指定块的时间,而且也可减小指针所占用的存储空间;但是增大了内部碎片,同时这种改进的效果也是非常有限的。
2.显式链接组织方式
- 显式链接组织方式是指把用于链接文件各物理盘块的指针,显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张,如图9-4所示。表的序号是物理盘块号,从0开始,直至N-1,N为盘块总数。在每个表项中存放指向下一个盘块的链接。在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址被填入相应文件的FCB的“物理地址”字段中。由于查找记录的过程是在内存中进行的,因而链接表不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。由于分配给文件的所有盘块链接指针都存放在该表中,因此把该表称为 文件分配表(file allocation table,FAT)。
3.FAT 文件系统
微软公司早、中期推出的OS一直都是采用的FAT技术,即利用FAT来记录每个文件中所有盘块之间的链接。在MS-DOS系统中,最早使用的是12位的FAT12,后来使用的是16位的FAT16。在Windows 95和Windows 98系统中则升级为32位的FAT32。Windows NT/2000/XP以及之后的Windows系统将FAT32进一步发展为NTFS。
在FAT中引入了 “卷”(volume) 的概念后,其便支持将一个物理磁盘分成四个逻辑磁盘,每个逻辑磁盘就是一个卷(也称为分区),换言之,每个卷都是一个能够被单独格式化和使用的逻辑单元,供文件系统分配空间时使用。一个卷中包含文件系统信息、一组文件以及空闲空间。每个卷都专门划出一个单独区域来存放自己的目录、FAT以及逻辑驱动器字母。针对仅有一个硬盘的计算机,通常最多可将其硬盘分为“C:”“D:”“E:”“F:”四个卷。需要说明的是,在现代OS中,一个物理磁盘可以被划分为多个卷,一个卷也可以由多个物理磁盘组成。下面具体介绍FAT文件系统。
- (1)以盘块为单位的FAT文件系统。
- 早期的FAT12以盘块为基本分配单位。由于FAT是文件系统中最重要的数据结构,为了安全起见,在每个分区中都配有两张相同的文件分配表,即FAT1和FAT2。在FAT的每个表项中均存放下一个盘块号,它实际上是用于盘块之间进行链接的指针,通过它可以将一个文件的所有盘块链接起来;另外,FAT会将文件的第一个盘块号放在自己的FCB中。图9-5所示为MS-DOS系统的文件物理结构,图中给出了两个文件,其中文件A占用三个盘块,盘块号依次为4、6、11;文件B也占用三个盘块,盘块号依次为9、10、5。每个文件的第一个盘块号均放在自己的FCB中。对于1.2MB的软盘,每个盘块的大小为512B,在每个FAT中共含有2.4K(1.2MB÷512B)个表项;由于每个FAT表项占12bit(即1.5B),因此FAT表占用3.6KB(2.4K×1.5B)存储空间。
- 接下来计算以盘块为分配单位时所允许的最大磁盘容量。由于每个FAT表项为12bit,因此,在FAT中最多允许有4 096 (212)个表项。如果以盘块为基本分配单位,每个盘块(也称扇区)的大小一般是512B,那么每个磁盘分区的容量就是2MB (4 096×512B),一个物理磁盘能支持4个逻辑磁盘分区,因此相应的磁盘最大容量仅为8MB (2MB×4)。FAT12可以应付最早时期的容量未超过8MB的磁盘,但很快磁盘的容量就超过了8MB,此时,FAT12是否还可继续使用呢?回答虽然是肯定的,但需要引入一个新的分配单位——簇(cluster)。
- 早期的FAT12以盘块为基本分配单位。由于FAT是文件系统中最重要的数据结构,为了安全起见,在每个分区中都配有两张相同的文件分配表,即FAT1和FAT2。在FAT的每个表项中均存放下一个盘块号,它实际上是用于盘块之间进行链接的指针,通过它可以将一个文件的所有盘块链接起来;另外,FAT会将文件的第一个盘块号放在自己的FCB中。图9-5所示为MS-DOS系统的文件物理结构,图中给出了两个文件,其中文件A占用三个盘块,盘块号依次为4、6、11;文件B也占用三个盘块,盘块号依次为9、10、5。每个文件的第一个盘块号均放在自己的FCB中。对于1.2MB的软盘,每个盘块的大小为512B,在每个FAT中共含有2.4K(1.2MB÷512B)个表项;由于每个FAT表项占12bit(即1.5B),因此FAT表占用3.6KB(2.4K×1.5B)存储空间。
- (2)以簇为单位的FAT文件系统。
- 稍加分析便可得知,如果把每个盘块(扇区)的容量均增大n倍,则磁盘的最大容量便可增加n倍。但要增加盘块的容量是不方便和不灵活的。为此,引入了簇的概念。簇是一组相邻的扇区,其在FAT中被视作一个虚拟扇区。在进行盘块分配时,以簇为基本分配单位。簇的大小一般是2n(n为整数)个盘块。在实际运用中,簇的容量可以是一个盘块(512B)、两个盘块(1KB)、四个盘块(2KB)、八个盘块(4KB)等,FAT16支持多达64个盘块。一个簇应包含扇区的数量与磁盘容量的大小直接相关。例如,在FAT12中,当一个簇仅有一个扇区时,磁盘的最大容量为8MB;当一个簇包含八个扇区时,磁盘的最大容量便可达到64MB。而在FAT16中,由于FAT表项的位数为16,因此最大表项数为65 536(216),此时便能将一个磁盘分区分为65 536 (216)个簇;如果每个簇中最多有64个盘块,那么可以得出FAT16可以管理的最大分区空间为2 048MB (512B×65 536×64)。
- 以簇为基本分配单位的好处是,可使系统能够适应磁盘容量不断增大的情况,还可以减少FAT中的项数(在相同的磁盘容量下,FAT的项数与簇的大小成反比),使FAT占用更少的存储间,并且可以减少访问FAT的开销。但也会造成更大的簇内碎片(它与存储器管理中的页内零头相似),即簇的容量越大,簇内碎片也越大。例如,在FAT16中,当要求磁盘分区的大小为8GB时,每个簇的大小可达128KB,这意味着内部碎片最大可达(128K-1)B。一般而言,对于容量为1GB~4GB的硬盘来说,其会导致浪费10%~20%的存储空间。为了解决这一问题,微软公司推出了FAT32。
- FAT32是FAT系列文件系统的最后一个产品。FAT32的每个簇在FAT中的表项均占据4B,其允许管理比FAT16更多的簇,允许采用较小的簇。FAT32在分区大小为2GB~8GB时,簇的大小为4KB;分区大小为8GB~16GB时,簇的大小为8KB;分区大小为16GB~32GB时,簇的大小则达到了16KB。当每个簇为4KB时,FAT32分区格式理论上可以管理的单个最大磁盘空间可达4KB×2
32=16TB。但是,由于引导扇区只使用4B来记录磁盘的扇区总数,即最多只支持4G个扇区(232),每个扇区512B,因此支持的磁盘容量最大值为(232)×512B=2TB。另外,由于FAT32表项的32位中的高4位不用,因此表项数最多为228个,在簇的大小为4KB时,支持的最大分区大小为228×4KB=1TB。三种FAT文件系统中簇的大小与最大分区的对应关系如表9-1所示。
- FAT32支持更小的簇,这使其具有更高的存储器利用率。例如,两个磁盘的容量都为2GB,一个磁盘采用了FAT16,簇的大小为32KB;另一个磁盘采用了FAT32,簇的大小为4KB,则在通常情况下,FAT32的存储器利用率相比FAT16可以提高15%。FAT32主要应用于Windows 98以及后续的Windows系统,同时支持长文件名,能够有效地节省硬盘空间。
- 但是,FAT32亦存在明显的不足之处。首先,由于文件分配表的扩大,其运行速度比FAT16要慢;其次,FAT32有最小管理空间的限制,FAT32卷必须至少包含65 537个簇,因此FAT32不支持容量小于512MB的分区,对于小分区,仍然需要使用FAT16或FAT12;再次,FAT32的单个文件的长度不能大于4GB;最后,FAT32有兼容性方面的限制(最大限制),即FAT32不能保证向下兼容。因此,微软公司又引入了NTFS。
9.1.3 索引组织方式
1.单级索引组织方式
- 链接组织方式虽然解决了连续组织方式所存在的问题,但又出现了另外两个问题:①不能支持高效的直接存取,若想对一个较大的文件进行存取,则须在FAT中顺序查找许多盘块号;②FAT须占用较大的内存空间,由于一个文件所占用盘块的盘块号随机分布在FAT中,因此只有将整个FAT调入内存,才可保证在FAT中能够找到一个文件的所有盘块号。当磁盘容量较大时,FAT可能要占用数MB甚至更多的内存空间。
- 事实上,在打开某个文件时,只须把该文件占用的盘块的编号调入内存即可,完全没有必要将整个FAT调入内存。为此,应将每个文件所对应的盘块号集中地放在一起,在访问到某个文件时,将该文件所对应的盘块号一起调入内存即可。索引组织方式就是基于这一思想所形成的一种外存组织方式。它为每个文件分配一个索引块(表),把分配给该文件的所有盘块号都记录在该索引块中。在建立一个文件时,只须在为之建立的**目录项中填上指向该索引块的指针(索引表项)**即可。图9-6所示为磁盘空间的索引组织方式。
- 索引组织方式的主要优点是支持直接访问。当要读文件的第i个盘块时,可以方便地直接从该文件的索引块中找到第i个盘块的盘块号;此外,索引组织方式也不会产生外部碎片。当文件较大时,索引组织方式无疑要优于链接组织方式。
- 索引组织方式的主要问题是,每当建立一个索引文件时,都须为该文件分配一个索引块,并将分配给该文件的所有盘块号记录于其中。在每个索引块中可存放数百个盘块号。但对于中、小型文件,其本身通常只占数十个到数个盘块,甚至更少,此时该方式仍会为之分配一个索引块。可见,针对中、小型文件,当采用索引组织方式时,索引块的利用率将会很低。
2.多级索引组织方式(了解)
- 在为一个大文件分配磁盘空间时,如果所分配出去的盘块的盘块号已装满一个索引块,则OS须再为该文件分配另一个索引块,用于将以后继续为之分配的盘块的盘块号记录于其中。依此类推,再通过链指针将各索引块按序链接起来。显然,当文件太大而索引块太多时,这种方法是低效的。此时,应为这些索引块再建立一级索引,称之为第二级索引,即系统再分配一个索引块,作为第一级索引的索引块,将第一块、第二块等索引块的盘块号填入该索引块中,这样便形成了两级索引组织方式。如果文件非常大,则还可以采用三级、四级甚至更多级的索引组织方式。图9-7所示为两级索引组织方式下各索引块之间的链接情况。如果每个盘块的大小为1KB,每个盘块号占4B,则在一个索引块中可存放256个盘块号。这样,在两级索引时,最多可包含的存放文件的盘块的盘块号总数N=256×256=64K。
- 由此可以得出结论:采用两级索引时,所允许的文件最大长度为64MB。倘若盘块的大小为4KB,则在采用单级索引时所允许的最大文件长度为4MB,而在采用两级索引时所允许的最大文件长度可达4GB。