Appearance
题目
某文件系统的磁盘块大小为 4 KB,目录项由文件名和索引节点号构成,每个索引节点占 256 字节,其中包含直接地址项 10 个,一级、二级和三级间接地址项各 1 个,每个地址项占 4 字节。
该文件系统中子目录 stu 的结构如下图所示:stu 包含子目录 course 和文件 doc,course 子目录包含文件 course1 和 course2。各文件的文件名、索引节点号、占用磁盘块的块号也一并给出(其中文件 doc 占用的磁盘块号 x 为待求)。
请回答下列问题。
(1) 目录文件 stu 中每个目录项的内容是什么?
(2) 文件 doc 占用的磁盘块的块号 x 的值是多少?
(3) 若目录文件 course 的内容已在内存,则打开文件 course1 并将其读入内存,需要读几个磁盘块?说明理由。
(4) 若文件 course2 的大小增长到 6 MB,为了存取 course2 需要使用该文件索引节点的哪几级间接地址项?说明理由。
解析
(1)目录 stu 的目录项内容
题目已给出目录项的格式 ——「文件名 + 索引节点号」。从上面树结构看,stu 直接包含两个孩子:子目录 course 与文件 doc。查表得它们的索引节点号分别是 2 和 10,所以 stu 的目录文件内容是这两条目录项:
| 文件名 | 索引节点号 |
|---|---|
course | 2 |
doc | 10 |
编者注(易错点):目录项里只有"文件名 + 索引节点号"这两个字段;文件具体存在哪个磁盘块、文件多大等等,统统由索引节点(inode)记录,不放在目录项里。把磁盘块号一起写进去就丢分了。
(2)求 x:文件 doc 的磁盘块号
观察表格里的索引节点号列:doc 与 course1 的索引节点号都是 10!
这是 Unix 类文件系统里的 硬链接:两个目录项(一个在 stu 下叫 doc,一个在 course 下叫 course1)指向同一个 inode,意味着它们是同一个文件的两个名字,在磁盘上只占同一份数据。所以 doc 占用的磁盘块号必然等于 course1 占用的磁盘块号:
编者注(易错点):考场上看到两个文件 inode 号相同时不要犯怵——这就是硬链接,不是题目印错。判断"是不是同一个文件",看 inode 号;判断"在哪个目录里能看到这个文件",看目录项的归属。
(3)打开 course1 需要读几个磁盘块
题目说 course 目录文件的内容已经在内存,意味着我们已经能直接看到 course1 这条目录项 → 拿到 course1 的索引节点号 10。但要真正读出 course1 的内容,还差两步:
- 读 inode:根据 inode 号 10 算出该 inode 所在的磁盘块,把这个磁盘块从磁盘读进内存 —— 第 1 个磁盘块
- 读数据:在 inode 里查到 course1 的数据存在 30 号磁盘块,再把 30 号块读进内存 —— 第 2 个磁盘块
所以一共要读 2 个磁盘块。
编者注(易错点):很多同学少算"读 inode"这一步,直接答 1 个块。要记住:目录项里只有 inode 号,没有数据块号;想知道数据块号必须先读 inode。
(4)course2 长到 6 MB,要用到哪几级间接地址项
Step 1:6 MB 文件占多少个磁盘块?
磁盘块大小 4 KB,所以:
Step 2:算每一级间接地址能管多少个磁盘块
每个磁盘块 4 KB = 4096 B,每个地址项 4 B,所以每个"间接块"能装:
| 寻址级别 | 能直接管理的磁盘块数 | 累计可达 |
|---|---|---|
| 直接地址项(10 个) | 10 | 10 |
| 一级间接地址项(1 个) | 1024 | 10 + 1024 = 1034 |
| 二级间接地址项(1 个) | 1024 × 1024 = 1 048 576 | 1034 + 1 048 576 ≈ 1.05M |
| 三级间接地址项(1 个) | 1024³ ≈ 10.7 亿 | 远远超出 |
Step 3:把 1536 套进区间
也就是说,1536 个磁盘块"装不下"在直接 + 一级间接里(前者只能管 1034 个),但装得下在加上二级间接以后。
结论:存取 course2 需要用到 直接地址项、一级间接地址项 和 二级间接地址项,不需要三级间接地址项。
编者注(易错点):
- 不要漏算"直接地址项"——只要文件大小 > 0,前 10 块一定先用直接地址项填,下一级才接力。题目问"用到哪几级"时,直接地址项也算一级,不能漏。
- 不要把"够装下"等同于"刚好用完"——虽然 1536 < 1 049 610 远没填满二级间接的容量,但只要超过了一级的上限,二级就必须启用。