操作系统中,最常见的文件分配方式有连续分配、链式分配和索引分配,连续分配无法改变文件的大小且易产生外部碎片,链式分配解决了以上的问题但是无法实现文件的随机访问、查找效率低。为此,便提出了一种更为高级的文件分配方式——索引分配。
直接索引不使用FAT文件分配表,而是在文件控制块(FCB)中设置一个区域,成为索引块或索引表,每个文件都有一个FCB(Linux系统中使用inode索引节点),因此每个文件都有其对应的索引表。目录条目包括索引表的地址,索引表中不存储任何文件信息,而是存储一个个索引表项,每个索引表项都有一个指向分配给该文件某个磁盘块的指针,要读取文件的第i块数据,通过索引表的第i个表项中的指针来定位所需的块在磁盘中的位置。下面是索引表的示意图:
从上图可以读出,文件1.txt在磁盘中的块分别为4、7、9、0、5.
当创建一个文件时,索引表中的指针均初始化为-1,表示不指向任何磁盘块。首次写入文件的第i块时,系统从磁盘的空闲块中取得一个快,将其地址写到索引块中的第i个条目,以此类推。文件结束时,索引表最后一个条目设置为-1,表示存储的磁盘块到此结束。
内存的分页管理中,每个程序都有一个页表要维护索引表,在文件的索引分配中也一样,每个文件都有自己的索引表。索引表存储在磁盘上,因此为了节约空间,应尽可能让索引表小,然而索引表越小,索引表项也就越少,即能够指向磁盘块的指针数就越少,这样一来,就系统就无法支持大的文件。也就是说,文件的大小受到索引表大小的限制。为了解决这个问题,又提出了新的索引分配解决方案。
在链接索引中,采取了同文件的链式分配相同的思想,由于索引表也是存储在磁盘上的,并且通常占用一个磁盘块的大小,因此可以将多个索引表用指针连接起来,以此来支持大文件的存取。
混合索引指将多种分配方式与索引分配相结合的分配方式。如既采用连续分配的方式,又采用索引分配的方式,即一个文件前面的数据块采用连续分配,后面的数据块采用索引分配。下面给出2012年数据结构考试真题,并结合真题进行进一步说明这种分配方式。
【2012统考真题】
设某文件系统空间最大为4TB(1TB = 1024GB = 1024×1024MB,以此类推)。以磁盘块为基本分配单位,且磁盘块大小为1KB。FCB中有一个512B大小的索引表区域。
(1) 若采用直接索引分配方式,索引表中存放若干个含有指向磁盘块的指针的索引表项,那每个索引表项最少占用多少字节?可支持的单个文件最大为多少字节?
(2) 若采用连续分配+直接索引分配的混合索引的分配方式,其中,索引表项的格式为:前8B的空间表示<起始磁盘块块号,磁盘块数>,用于文件前半部分的顺序存储,其中起始磁盘块块号占6B,磁盘块数占2B;后504B的空间采用(1)中的直接索引结构,即索引表区域大小为504B,并规定索引表项的大小为6B。在这种分配方式下,可支持的单个文件最大为多少字节?为使单个文件支持的长度达到最大,请指出表示起始磁盘块块号和磁盘块数的空间分别所需要的字节数。
【解】
(1) 为了能够充分利用磁盘,索引表必须能够表达整个磁盘空间。系统空间4TB合4×240B,每个磁盘块为1KB,那么整个磁盘就有4TB / 1KB = 4×240B / 210B = 232 个磁盘块。因此索引表必须能够表示整个232个磁盘块,故所有的索引表项加起来最少能够表达32位的二进制数(与内存寻址能力的思想一致,32位操作系统的寻址能力是 232B = 4GB ),32位就是32bits,换算成字节数就是4字节(32 / 8 = 4),即每个索引表项最少需要4字节的空间来存储。那么,索引表本身大小是512B,索引表项的大小是4B,显然,每个索引表最多能够存储512B / 4B = 128个索引表项。每个索引表项含有一个指针,指向一个磁盘块,那么128个索引表项就有128个指针,可以表示128个磁盘块,每个磁盘块的大小为1KB,故可支持的单个文件最大为128KB。
(2)
针对该小问的第①问,分成两部来算,先计算采用连续分配方式的最大总磁盘块大小,再计算采用直接索引分配方式的最大总磁盘块大小,两者求和即可。采用连续分配方式时,能够连续存取的磁盘块总大小取决于磁盘块数,题目中告诉我们磁盘块数这个字段占2B,也就是16bits,因此,其所能寻址空间为216个磁盘块,即 216KB大小的空间;在后面的直接索引分配方式中,索引表占504B,索引表项大小为6B,故能够存储504B / 6B = 84个索引表项,同(1)问,能够表示84KB大小的空间,两者求和知,在这种混合索引分配的情况下,可支持的单个文件最大为 (216+84)KB.
针对第②问,根据上面的分析,可以知道文件的大小仅与连续分配有关,而直接索引分配能够表示的磁盘块数就是固定的84块。而在连续分配下,文件大小又仅仅与磁盘块数这个字段的大小有关,下面进行详细分析。我们设表示起始磁盘块块号和磁盘块数的字段所需要的字节数分别为x字节和y字节,则首先我们得到等式关系:
x+y=8(题目要求)
再一个,由于起始磁盘块块号可以是任意块号,因此,该字段也必须能够表示全部的磁盘空间,这一部分在第(1)问中详细阐述了,也就是最小值为32位,合4字节,即得到不等关系:
x >= 4
那么文件大小可以表示为:
F = (28y + 84)KB
即在 x+y=8 和 x >= 4 的情况下求 F 的最大值,显然,x=y=4时,F的最大值为(232 + 84)KB = 4TB + 84KB,这已经超过文件系统空间的最大值了,多的必然舍弃,因此这时文件最大只能是4TB。
【答案】
(1) 4字节;128KB
(2)
① (216+84)KB,合67,194,880字节
② 4字节、4字节,最大为4TB
多层索引分配方案与之前讲过的内存分页管理中的多级页表方案类似,只不过这里的直接块(或直接索引)指向一个物理块,一级索引指向若干个直接块,二级索引指向若干个一级索引,以此类推;而在多级分页方案中,一级页表扩展到若干个二级页表,每个二级页表扩展到若干个三级页表,以此类推……最终的每个n级页表才指向若干个内存块,两者正好反过来,下面给出多层索引的示意图:
如图所示,索引节点有三个直接块、一个一级索引和一个二级索引。每个直接块指向一个磁盘块,一级索引指向若干直接块,二级索引指向若干个一级索引,以此类推。
【例】
在某操作系统中,文件系统采取多层索引分配方式。在索引节点中,有10个直接块(每个直接块直接指向一个数据块)、1个一级间接块、1个二级间接块和1个三级间接块。假设每个索引块(直接块和所有间接块)和数据块的大小均为4KB,每个索引表项大小为4B。
(1) 仅仅用直接块最多能够表示多大的文件?
(2) 该索引节点能够访问到的地址空间为多大?
(3) 读取文件的第10000B和10MB的内容,分别需要访问磁盘多少次?
【解】
(1) 由题目知,该索引结点共有10个直接块,每个直接块只有一个指向数据块的指针,因此所有的直接块加起来能够表示10个数据块的空间,也就最多能够表示10 × 4KB = 40KB的文件。
(2) 由(1)知,所有的直接块能够表达40KB的空间;一级间接块的大小为4KB,每个索引表项的大小为4B,故1个一级间接块有4KB / 4B = 1024个索引表项,而每个索引表项指向一个直接块,就相当于一个数据块,故1个一级间接块能够表示1024 × 4KB = 4096KB,合4MB的空间;1个二级间接块指向1024个一级间接块,1个一级间接块指向1024个直接块,故1个二级间接块能够表示1024 × 1024 × 4KB,合4GB的空间;同理,1个三级间接块指向1024个二级间接块,1个二级间接块指向1024个一级间接块,1个一级间接块指向1024个直接块,故1个三级间接块能够表示1024 × 1024 × 1024 × 4KB,合4TB。以上结果相加,得到该索引节点能够访问到的地址空间为40KB + 4MB + 4GB + 4TB ≈ 4TB。
(3) 10000B / 4KB ≈ 2.44,2 < 2.44 < 3,故10000B的内容存放于第三个直接块中,直接块直接指向一个数据块,直接从直接块获取数据块的物理地址,根据这个物理地址去磁盘中访问该数据即可,因此访问磁盘2次。由(2)知,全部的直接块可以表示的空间大小为40KB = 0.04MB,全部的一级间接块(其实就有一个)能够表示4MB的内容,全部的二级间接块(其实也就有一个)能够表示4GB的内容。所有的直接块和一级间接块加起来能够表示4.04MB的内容,所有的直接块、一级间接块和二级间接块加起来能够表示4.00404GB的内容,显然4.04MB < 10MB < 4.00404GB,也就是说10MB的位置正好落在二级间接块中,故先读取二级间接块的索引表(访问第一次)找到对应的一级间接块的物理地址,再读取一级间接块的索引表(访问第二次)找到对应的直接块,再读取直接块存放的物理地址(访问第三次),即数据块的地址,再去该地址读取该数据块的内容(访问第四次)。因此,读取10MB的内容时,需要访问磁盘4次。
【答案】
(1) 40KB
(2) ≈4TB
(3) 2次、4次