54. A
2026 旧版 · 非 2027 主源 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 54. A
索引分配支持变长的文件,同时可以随机访问文件的指定数据块,选项A正确。链接分配不支持随机访问,需要依靠指针依次访问,选项B错误。连续分配的文件长度固定,不支持可变文件长度(连续分配的文件长度虽然也可变,但是需要大量移动数据,代价较大,相比之下不太合适),选项C错误。动态分区分配是内存管理方式,不是磁盘空间的管理方式,选项D错误。
## 55. B
当文件F首次被进程P打开时,会将磁盘的索引节点复制到内存的索引节点,并新增链接计数(打开计数)等内容。当进程P关闭文件F时,会将内存索引节点的链接计数减1,因为文件F仅被进程P打开,所以链接计数变为0,文件系统释放F的内存索引节点,选项B正确。关闭F不改变目录中文件F的目录项,选项A错误。关闭F只对内存索引节点进行相关的操作,不改变磁盘索引节点的数据结构,选项C、D错误。
## 56. A
当用户首次对某文件发出操作请求时,需要先用系统调用open()将该文件打开。所谓“打开”,是指系统利用文件名检索到指定文件的目录项后,将文件的属性(包括该文件在外存中的物理位置)从外存复制到内存的打开文件表的一个表目中,并给用户返回一个文件描述符fd。此后(只要文件未被关闭),用户对该文件的所有操作就都是通过文件描述符fd来进行的。
## 二、综合应用题
### 01.【解答】
连续分配方式的优点是可以随机访问(磁盘),访问速度快;缺点是要求有连续的存储空间,容易产生碎片,降低磁盘空间利用率,并且不利于文件的增长扩充。
链接分配方式的优点是不要求连续的存储空间,能更有效地利用磁盘空间,并且有利于扩充文件;缺点是只适合顺序访问,不适合随机访问;另外,链接指针占用一定的空间,降低了存储效率,可靠性也差。
索引分配方式的优点是既支持顺序访问又支持随机访问,查找效率高,便于文件删除;缺点是索引表会占用一定的存储空间。
### 02.【解答】
目录是存放在磁盘上的,检索目录时需要访问磁盘,速度很慢。利用“FCB分解法”加快目录检索速度的原理是:将FCB的一部分分解出去,存放在另一个数据结构中,而在目录中仅留下文件的基本信息和指向该数据结构的指针,这样一来就有效地缩减了目录的体积,减少了目录所占磁盘的块数,检索目录时读取磁盘的次数也减少,于是就加快了检索目录的速度。
因为原本整个FCB都是在目录中的,而FCB分解法将FCB的部分内容放在了目录外,所以检索完目录后还需要读取一次磁盘,以找齐FCB的所有内容。
1)分解法前,目录的磁盘块数为 $64 \times 254 / 512 = 31.75$ ,即32块。前31块中每块放了 $512 / 64 = 8$ 个,而最后一块放了 $254 - 31 \times 8 = 6$ 个。所以查找该目录文件的某个FCB的平均访问磁盘次数 $= [8 \times (1 + 2 + 3 + \dots + 31) + 6 \times 32] / 254 = 16.38$ 次。
分解法后,目录的磁盘块数为 $10 \times 254 / 512 = 4.96$ ,即5块。前4块中每块放了 $512 / 10 = 51$ 个,而最后一块放了 $254 - 4 \times 51 = 50$ 个。所找的目录项在第1、2、3、4、5块所需的磁盘访问次数分别为2、3、4、5、6次。所以查找该目录文件的某个FCB的平均访问磁盘次数 $= [51 \times (2 + 3 + 4 + 5) + 50 \times 6] / 254 = 3.99$ 次。
<!-- page: 290 -->
2)分解法前,平均访问磁盘次数 $= (1 + 2 + 3 + \cdots + n) / n = (n + 1) / 2$ 次。
分解法后,平均访问磁盘次数 $= [2 + 3 + 4 + \cdots + (m + 1)] / m = (m + 3) / 2$ 次。
为了使访问磁盘次数减少,显然需要 $(m + 3) / 2 < (n + 1) / 2$,即 $m < n - 2$。
**注意**
第二问中的每个盘块都正好装满,相当于访问每个盘块的概率是相等的,因此计算起来比第一问方便很多。
**03.【解答】**
对于 $540\mathrm{MB}$ 的硬盘,硬盘总块数为 $540\mathrm{MB} / 1\mathrm{KB} = 540\mathrm{K}$ 个。
因为 $540\mathrm{K}$ 刚好小于 $2^{20}$,所以文件分配表的每个表目可用20位,即 $20/8 = 2.5\mathrm{B}$,这样FAT占用的存储空间大小为 $2.5\mathrm{B} \times 540\mathrm{K} = 1350\mathrm{KB}$。
**04.【解答】**
1)要想只用到索引节点的直接块,这个文件应能全部在10个直接块指向的数据块中放下,而数据块的大小为4KB,所以该文件的大小应小于或等于 $4\mathrm{KB} \times 10 = 40\mathrm{KB}$,即文件的大小不超过40KB时可以只用到索引节点的直接块。
2)只需要算出索引节点指向的所有数据块的块数,再乘以数据块的大小即可。直接块指向的数据块数 $= 10$ 块。
一级间接块指向的索引块里的指针数为 $4\mathrm{KB} / 4\mathrm{B} = 1024$,所以一级间接块指向的数据块数为1024块。
二级间接块指向的索引块里的指针数为 $4\mathrm{KB} / 4\mathrm{B} = 1024$,指向的索引块里再拥有 $4\mathrm{KB} / 4\mathrm{B} = 1024$ 个指针数。所以二级间接块指向的数据块数为 $(4\mathrm{KB} / 4\mathrm{B})^2 = 1024^2$。
三级间接块指向的数据块数为 $(4\mathrm{KB} / 4\mathrm{B})^3 = 1024^3$。所以,该索引节点能访问到的地址空间大小为
$$
\left[ 10 + 1 \times \frac{4\mathrm{KB}}{4\mathrm{B}} + 1 \times \left(\frac{4\mathrm{KB}}{4\mathrm{B}}\right)^2 + 1 \times \left(\frac{4\mathrm{KB}}{4\mathrm{B}}\right)^3 \right] \times 4\mathrm{KB} \approx 4100.00\mathrm{GB} = 4.00\mathrm{TB}
$$
3)因为 $10000\mathrm{B} / 4\mathrm{KB} = 2.44$,所以第 $10000\mathrm{B}$ 的内容存放在第3个直接块中,若要读取一个文件的第 $10000\mathrm{B}$ 的内容,需要访问磁盘1次。
4)因为10MB的内容需要数据块数为 $10\mathrm{MB} / 4\mathrm{KB} = 2.5\times 1024$,直接块和一级间接块指向的数据块数 $= 10 + (4\mathrm{KB} / 4\mathrm{B}) = 1034 < 2.5\times 1024$,直接块和一级间接块及二级间接块的数据块数 $= 10 + (4\mathrm{KB} / 4\mathrm{B}) + (4\mathrm{KB} / 4\mathrm{B})^2 > 1\times 1024^2 > 2.5\times 1024$,所以第10MB数据应该在二级间接块下属的某个数据块中,若要读取一个文件的第10MB的内容,需要访问磁盘3次。
**05.【解答】**
第一问要计算混合索引结构的寻址空间大小;第二问只要计算出存储该文件索引块的大小,然后加上该文件本身的大小即可。
1)物理块大小为 $4\mathrm{KB}$,数据大小为 $4\mathrm{B}$,则每个物理块可存储的地址数为 $4\mathrm{KB} / 4\mathrm{B} = 1024$。最大文件的物理块数可达 $10 + 1024 + 1024^2 + 1024^3$,每个物理块大小为 $4\mathrm{KB}$,因此总长度为
$$
(10 + 1024 + 1024^2 + 1024^3) \times 4\mathrm{KB} = 40\mathrm{KB} + 4\mathrm{MB} + 4\mathrm{GB} + 4\mathrm{TB}
$$
这个文件系统允许的最大文件长度是 $4\mathrm{TB} + 4\mathrm{GB} + 4\mathrm{MB} + 40\mathrm{KB}$,约为4TB。
2)占用空间分为文件实际大小和索引项大小,文件大小为2GB,从1)中的计算知,需要使用到二次间接索引项。该文件占用 $2\mathrm{GB} / 4\mathrm{KB} = 512\times 1024$ 个数据块。
<!-- page: 291 -->
一次间接索引项使用1个间接索引块,二次间接索引项使用 $1 + \lceil (512\times 1024 - 10 - 1024) / 1024\rceil = 512$ 个间接索引块(最左的1表示二次间址块),所以间接索引块所占空间大小为 $(1 + 512)\times 4\mathrm{KB} = 2\mathrm{MB} + 4\mathrm{KB}$
另外每个文件使用的 i_node 数据结构占 $13 \times 4\mathrm{B} = 52\mathrm{B}$,因此该文件实际占用磁盘空间大小为 $2\mathrm{GB} + 2\mathrm{MB} + 4\mathrm{KB} + 52\mathrm{B}$。
## 06.【解答】
1)在磁盘中连续存放(采取连续结构),磁盘寻道时间更短,文件随机访问效率更高;在FCB中加入的字段为<起始块号,块数>或<起始块号,结束块号>。
2)将所有的FCB集中存放,文件数据集中存放。这样在随机查找文件名时,只需访问FCB对应的块,可减少磁头移动和磁盘I/O访问次数。
## 07.【解答】
1)文件系统中所能容纳的磁盘块总数为 $4\mathrm{TB} / 1\mathrm{KB} = 2^{32}$。要完全表示所有磁盘块,索引项中的块号最少要占 $32/8 = 4\mathrm{B}$。而索引表区仅采用直接索引结构,因此512B的索引表区能容纳 $512\mathrm{B} / 4\mathrm{B} = 128$ 个索引项。每个索引项对应一个磁盘块,所以该系统可支持的单个文件最大长度是 $128 \times 1\mathrm{KB} = 128\mathrm{KB}$。
2)这里考查的分配方式不同于我们熟悉的三种经典分配方式,但题目中给出了详细的解释。所求的单个文件最大长度一共包含两部分:预分配的连续空间和直接索引区。
连续区块数占2B,共可表示 $2^{16}$ 个磁盘块,即 $2^{26}\mathrm{B}$。直接索引区共 $504\mathrm{B} / 6\mathrm{B} = 84$ 个索引项。所以该系统可支持的单个文件最大长度是 $2^{26}\mathrm{B} + 84\mathrm{KB}$。
为了使单个文件的长度达到最大,应使连续区的块数字段表示的空间大小尽可能接近系统最大容量4TB。分别设起始块号和块数占4B,这样起始块号可以寻址的范围是 $2^{32}$ 个磁盘块,共4TB,即整个系统空间。同样,块数字段可以表示最多 $2^{32}$ 个磁盘块,共4TB。
## 08.【解答】
1)系统采用顺序分配方式时,插入记录需要移动其他的记录块,整个文件共有200条记录,要插入新记录作为第30条,而存储区前后均有足够的磁盘空间,且要求最少的访问存储块数,则要把文件前29条记录前移,若算访盘次数,移动一条记录读出和存回磁盘各是一次访盘,29条记录共访盘58次,存回第30条记录访盘1次,共访盘59次。
F的文件控制区的起始块号和文件长度的内容会因此改变。
2)文件系统采用链接分配方式时,插入记录并不用移动其他记录,只需找到相应的记录,修改指针即可。插入的记录为其第30条记录,因此需要找到文件系统的第29块,一共需要访盘29次,然后把第29块的下块地址部分赋给新块,把新块存回磁盘会访盘1次,然后修改内存中第29块的下块地址字段,再存回磁盘,一共访盘31次。
4B共32位,可以寻址 $2^{32} = 4\mathrm{G}$ 块存储块,每块的大小为1KB,即1024B,其中下块地址部分占4B,数据部分占1020B,因此该系统的文件最大长度是 $4\mathrm{G}\times 1020\mathrm{B} = 4080\mathrm{GB}$。
## 09.【解答】
1)两个目录文件dir和dir1的内容如下表所示。
[tbl-136.md](tbl-136.md)
[tbl-137.md](tbl-137.md)
<!-- page: 292 -->
2)FAT 的簇号为 2 个字节,即 16 比特,因此在 FAT 表中最多允许 $2^{16}$(65536)个表项,一个 FAT 文件最多包含 $2^{16}$(65536)个簇。FAT 的最大长度为 $2^{36} \times 2\mathrm{B} = 128\mathrm{KB}$。文件的最大长度是 $2^{16} \times 4\mathrm{KB} = 256\mathrm{MB}$。
3)在 FAT 的每个表项中存放下一个簇号。file1 的簇号 106 存放在 FAT 的 100 号表项中,簇号 108 存放在 FAT 的 106 号表项中。
4)先在 dir 目录文件里找到 dir1 的簇号,然后读取 48 号簇,得到 dir1 目录文件,接着找到 file1 的第一个簇号,据此在 FAT 里查找 file1 的第 5000 个字节所在的簇号,最后访问磁盘中的该簇。因此,需要访问目录文件 dir1 所在的 48 号簇,及文件 file1 的 106 号簇。
## 10.【解答】
1)簇大小为 $4\mathrm{KB}$,每个地址项长度为 $4\mathrm{B}$,因此每簇有 $4\mathrm{KB}/4\mathrm{B} = 1024$ 个地址项。最大文件的物理块数可达 $8 + 1 \times 1024 + 1 \times 1024^{2} + 1 \times 1024^{3}$,每个物理块(簇)大小为 $4\mathrm{KB}$,因此最大文件长度为 $(8 + 1 \times 1024 + 1 \times 1024^{2} + 1 \times 1024^{3}) \times 4\mathrm{KB} = 32\mathrm{KB} + 4\mathrm{MB} + 4\mathrm{GB} + 4\mathrm{TB}$。
2)文件索引节点总个数为 $1\mathrm{M} \times 4\mathrm{KB} / 64\mathrm{B} = 64\mathrm{M}$,5600B 的文件占 2 个簇,512M 个簇可存放的文件总个数为 $512\mathrm{M} / 2 = 256\mathrm{M}$。可表示的文件总个数受限于文件索引节点总个数,因此能存储 64M 个大小为 5600B 的图像文件。
3)文件 F1 的大小为 $6\mathrm{KB} < 4\mathrm{KB} \times 8 = 32\mathrm{KB}$,因此获取文件 F1 的最后一个簇的簇号只需要访问索引节点的直接地址项。文件 F2 大小为 $40\mathrm{KB}$,$4\mathrm{KB} \times 8 < 40\mathrm{KB} < 4\mathrm{KB} \times 8 + 4\mathrm{KB} \times 1024$,因此获取 F2 的最后一个簇的簇号还需要读一级索引表。综上,需要的时间不相同。
## 11.【解答】
1)在该文件系统中,目录项由文件名和索引节点号构成。由图(a)可知,stu 目录下有两个文件,分别是 course 和 doc。由图(b)可知,这两个文件分别对应索引节点号 2 和 10。因此,目录文件 stu 中两个目录项的内容是
[tbl-138.md](tbl-138.md)
2)由图(b)可知,文件 doc 和文件 course1 对应的索引节点号都是 10,说明 doc 和 course1 两个目录项共享同一个索引节点,本质上对应同一个文件。而文件 course1 存储在 30 号磁盘块,因此文件 doc 占用的磁盘块的块号 x 为 30。
3)需要读 2 个磁盘块。先读 course1 的索引节点所在的磁盘块,再读 course1 的内容所在的磁盘块。目录文件 course 的内容已在内存中,即 course1、course2 对应的目录项已在内存中,根据 course1 对应的目录项可以知道其索引节点号,即可读入 course1 的索引节点所在的磁盘块;根据 course1 的索引节点可知该文件存储在 30 号磁盘块,因此可再读入 course1 的内容所在的磁盘块。
4)存取 course2 需要使用索引节点的一级和二级间接地址项。6MB 大小的文件需要占用 $6\mathrm{MB} / 4\mathrm{KB} = 1536$ 个磁盘块。直接地址项可以记录 10 个磁盘块号,一级间接地址块可以记录 $4\mathrm{KB} / 4\mathrm{B} = 1024$ 个磁盘块号,二级间接地址块可以记录 $1024 \times 1024$ 个磁盘块号,而 $10 + 1024 < 1536 < 10 + 1024 + 1024 \times 1024$。因此,6MB 大小的文件,需要使用一级间接地址项和二级间接地址项(拓展:若文件的总大小超出 $10 + 1024 + 1024 \times 1024$ 块,则还需使用三级间接地址项)。
<!-- page: 293 -->
## 4.2 目录
在学习本节时,请读者思考以下问题:
1)目录管理的要求是什么?
2)在目录中查找某个文件可以使用什么方法?
上节介绍了文件的逻辑结构和物理结构,本节将介绍目录的实现。文件目录也是一种数据结构,用于标识系统中的文件及其物理地址,供检索时使用。通常,一个文件目录也被视为一个文件。在学习本节的内容时,读者可以围绕目录管理的要求来思考。
## 4.2.1 目录的基本概念
上节说过,FCB 的有序集合称为文件目录,一个 FCB 就是一个文件目录项。与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的属性、位置和所有权等。
首先来看目录管理的基本要求:从用户的角度看,目录在用户(应用程序)所需要的文件名和文件之间提供一种映射,所以目录管理要实现“按名存取”;目录存取的效率直接影响到系统的性能,所以要提高对目录的检索速度;在多用户系统中,应允许多个用户共享一个文件,因此目录还需要提供用于控制访问文件的信息。此外,应允许不同用户对不同文件采用相同的名字,以便于用户按自己的习惯给文件命名,目录管理通过树形结构来解决和实现。
## 4.2.2 目录的操作
在理解一个文件系统的需求前,我们首先考虑在目录这个层次上所需要执行的操作,这有助于后面文件系统的整体理解。
- 搜索。当用户使用一个文件时,需要搜索目录,以找到该文件的对应目录项。
- 创建文件。当创建一个新文件时,需要在目录中增加一个目录项。
- 删除文件。当删除一个文件时,需要在目录中删除相应的目录项。
- 创建目录。在树形目录结构中,用户可创建自己的用户文件目录,并可再创建子目录。
- 删除目录。有两种方式:①不删除非空目录,删除时要先删除目录中的所有文件,并递归地删除子目录。②可删除非空目录,目录中的文件和子目录同时被删除。
- 移动目录。将文件或子目录在不同的父目录之间移动,文件的路径名也会随之改变。
- 显示目录。用户可以请求显示目录的内容,如显示该用户目录中的所有文件及属性。
- 修改目录。某些文件属性保存在目录中,因此这些属性的变化需要改变相应的目录项。
## 4.2.3 目录结构
### 1. 单级目录结构
在整个文件系统中只建立一张目录表,每个文件占一个目录项,如图4.12所示。
图4.12 单级目录结构
<!-- page: 294 -->
当建立一个新文件时,必须先检索所有目录项,以确保没有“重名”的情况,然后在该目录中增设一项,将新文件的属性信息填入该项。当访问一个文件时,先按文件名在该目录中查找到相应的FCB,经合法性检查后执行相应的操作。当删除一个文件时,先从该目录中找到该文件的目录项,回收该文件所占用的存储空间,然后清除该目录项。
单级目录结构实现了“按名存取”,但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。
## 2. 两级目录结构
为了克服单级目录所存在的缺点,可以采用两级方案,将文件目录分成主文件目录(Master File Directory,MFD)和用户文件目录(User File Directory,UFD)两级,如图4.13所示。
图4.13 两级目录结构
主文件目录项记录用户名及相应用户文件目录所在的存储位置。用户文件目录项记录该用户所有文件的FCB。当某用户欲对其文件进行访问时,只需搜索该用户对应的UFD,这既解决了不同用户文件的“重名”问题,又在一定程度上保证了文件的安全。
两级目录结构提高了检索的速度,解决了多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。但是两级目录结构缺乏灵活性,不能对文件分类。