Appearance
题目
若文件 F 仅被进程 P 打开并访问,则当进程 P 关闭 F 时,下列操作中,文件系统需要完成的是( )。
错因
A
把"关闭"和"删除"画了等号。关闭只是当前进程不再访问该文件,目录项和文件本身完全不动;从目录里摘掉目录项是 unlink / rm 等删除操作才做的事。F 被关闭后,别的进程仍然能再打开它。
C
以为关闭要回收磁盘上 inode 占用的空间。但磁盘 inode 是文件的元数据本身——只要文件还在(链接计数 > 0),inode 就得留着,下次有人打开还要靠它定位数据块。回收磁盘 inode 是"链接计数 = 0 时的真正删除"才做的事,跟关闭无关。
D
把"打开计数"和"硬链接数"搞混了。磁盘 inode 里的 link count 指有多少目录项指向这个 inode(硬链接数),由 link / unlink 修改;关闭文件改的是另一个数——内存中那份 inode 副本的"打开计数"。两个计数活在不同地方、由不同操作维护。
总解析
打开到关闭之间,OS 在两个层面维护文件状态:磁盘上的持久数据 和 内存中的临时副本。
| 数据 | 位置 | 谁动它 |
|---|---|---|
| 目录项、磁盘 inode、数据块 | 磁盘(持久) | 创建 / 删除文件时 |
| 链接计数(link count) | 磁盘 inode 字段 | link +1、unlink −1 |
| 内存 inode 副本(active inode) | 内核内存(临时) | open 时复制进来,无人用时释放 |
| 打开计数(open count) | 内存 inode 字段 | open +1、close −1,归 0 触发副本释放 |
close(F) 做的事:
- 把内存 inode 的打开计数 −1
- 若打开计数变为 0(没人用了)→ 释放这份内存 inode 副本
- 写回脏数据 / 元数据(如果有修改)
- 不动磁盘上的目录项、磁盘 inode、link count
题面说 F 仅被进程 P 打开并访问,所以 P 关闭后打开计数从 1 → 0,会触发释放内存中的 inode 副本——这正是 B。
A(删目录项)、C(释放磁盘 inode)、D(改链接计数)描述的都是删除文件(unlink 在 link count 归 0 时连带回收)才做的事,跟关闭无关。
最终答案是 B。