Skip to content

2023年 408 操作系统 第 31 题

操作系统2023年选择题2分

题目

若文件 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) 做的事:

  1. 把内存 inode 的打开计数 −1
  2. 若打开计数变为 0(没人用了)→ 释放这份内存 inode 副本
  3. 写回脏数据 / 元数据(如果有修改)
  4. 不动磁盘上的目录项、磁盘 inode、link count

题面说 F 仅被进程 P 打开并访问,所以 P 关闭后打开计数从 1 → 0,会触发释放内存中的 inode 副本——这正是 B

A(删目录项)、C(释放磁盘 inode)、D(改链接计数)描述的都是删除文件unlink 在 link count 归 0 时连带回收)才做的事,跟关闭无关。

最终答案是 B

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题