Appearance
408
操作系统
OS-04-02 文件操作(创建/打开/读写/关闭/删除)
一、定位信息
- 所属圈层:核心层
- 前置知识回顾:理解文件控制块(FCB/inode)的概念,知道文件由数据部分和元数据组成。
- 知识网络位置:本单元描述用户与文件系统的交互接口,是理解文件系统工作原理的关键。文件操作的实现涉及FCB管理(OS-04-01)、目录结构(OS-04-06)和文件物理结构(OS-04-05)。
- 考点热度等级:M级(中频常考)——打开/读写/关闭文件的过程是选择题常见考点。
二、知识点讲解
2.1 创建文件(create)
创建文件的过程:
- 在目录中查找,确认文件名不存在
- 在磁盘上分配一个空闲inode(FCB)
- 在inode中填写初始信息(大小=0、创建时间等)
- 在父目录中添加一个目录项(文件名, inode号)
- 返回文件描述符(或文件句柄)
2.2 打开文件(open)
打开文件是将文件的FCB/inode信息从磁盘读入内存,建立进程与文件的连接。打开文件后,后续的读写操作不需要每次都从磁盘读取FCB。
打开文件的过程:
- 用户发出
open(文件名)系统调用 - OS根据文件名在目录中查找,找到对应的inode号
- 将inode信息从磁盘读入内存中的打开文件表
- 在进程的文件描述符表中分配一个条目,指向打开文件表中的对应项
- 返回文件描述符(一个整数),后续操作使用该描述符
打开文件表:
- 系统级打开文件表:整个系统维护一张,记录所有被打开文件的信息(引用计数、读写位置等)
- 进程级文件描述符表:每个进程维护一张,记录该进程打开的文件
2.3 读写文件(read/write)
读写文件的过程:
- 用户发出
read(文件描述符, 缓冲区, 长度)或write(文件描述符, 数据, 长度) - OS根据文件描述符找到对应的打开文件表项
- 检查访问权限(读/写权限)
- 根据读写位置,计算要访问的磁盘块
- 执行磁盘I/O,传输数据
- 更新读写位置指针
2.4 关闭文件(close)
关闭文件的过程:
- 用户发出
close(文件描述符)系统调用 - 将文件的修改信息写回磁盘(更新inode)
- 释放文件描述符表中的条目
- 减少系统级打开文件表中的引用计数
- 若引用计数为0,释放打开文件表中的条目
2.5 删除文件(delete)
删除文件的过程:
- 在目录中查找文件,找到对应的目录项
- 释放文件占用的所有磁盘块(回收到空闲空间)
- 释放inode
- 从父目录中删除目录项
注意:删除文件时需要检查是否有其他进程正在使用该文件(引用计数)。在Unix中,只有当引用计数为0时才真正删除文件。
三、记忆与理解辅助
1. 类比记忆:文件操作就像去图书馆——创建=办借书证(登记信息),打开=借书(从书架拿到手上),读写=看书/做笔记,关闭=还书,删除=注销借书证并销毁书。
2. 口诀:"创建分配inode,打开读入内存中;读写靠描述符,关闭释放资源清;删除回收磁盘块,目录项也要删。"
3. 文件操作与FCB的关系:
| 操作 | FCB相关动作 |
|---|---|
| 创建 | 分配FCB/inode,初始化 |
| 打开 | 将FCB/inode读入内存 |
| 读写 | 通过内存中的FCB定位数据 |
| 关闭 | 将修改后的FCB写回磁盘 |
| 删除 | 释放FCB/inode |
4. 打开文件表结构:
进程文件描述符表 系统级打开文件表 inode表(磁盘)
┌──────┐ ┌──────────┐ ┌──────────┐
│ 0 → │────────────→│ 文件A │─────────→│ inode A │
│ 1 → │──┐ │ ref=2 │ └──────────┘
│ 2 → │ │ └──────────┘
└──────┘ │ ┌──────────┐ ┌──────────┐
└─────────→│ 文件B │─────────→│ inode B │
│ ref=1 │ └──────────┘
└──────────┘四、例题与精解
例题1(基础巩固)
题目:进程A和进程B先后打开同一个文件 file.txt(假设文件之前未被打开)。进程A的文件描述符为3,进程B的文件描述符为5。问: (1)系统级打开文件表中有几个条目? (2)该条目的引用计数是多少? (3)进程A关闭文件后,进程B还能继续读写吗?
命题意图:考查打开文件表和引用计数机制。
精解:
1. 审题分析:两个进程打开同一文件,需要分析打开文件表的状态。
2. 解题思路:分析系统级打开文件表和进程级文件描述符表的关系。
3. 完整步骤:
(1)系统级打开文件表中有 1个 条目。两个进程打开同一文件,系统级表只创建一个条目(共享)。
(2)引用计数 = 2。进程A打开时引用计数=1,进程B打开时引用计数=2。
(3)能继续读写。进程A关闭文件时,引用计数减为1。因为引用计数 > 0,系统级打开文件表的条目不释放,进程B仍可通过自己的文件描述符5访问文件。
4. 方法反思:引用计数机制确保了文件的安全关闭——只有当所有进程都关闭文件后,系统才释放打开文件表的条目。这也是Unix中unlink(删除文件名)后文件仍可被已打开的进程继续使用的原因。
例题2(中等提升)
题目:某文件系统中,文件F的inode已被读入内存。进程P执行以下操作序列:
fd = open("F", O_RDONLY);
read(fd, buf, 100);
close(fd);
fd = open("F", O_RDWR);
write(fd, data, 50);
close(fd);请描述每次系统调用时OS的具体操作。
命题意图:考查文件操作的完整流程。
精解:
1. 审题分析:依次分析open、read、close、open、write、close的操作。
2. 解题思路:按照文件操作的流程逐步分析。
3. 完整步骤:
open("F", O_RDONLY):
- 在目录中查找"F",找到inode号
- 将inode读入系统级打开文件表(引用计数=1)
- 在进程P的文件描述符表中分配条目,指向打开文件表项
- 设置访问模式为只读
- 返回文件描述符 fd
read(fd, buf, 100):
- 通过fd找到打开文件表项
- 检查访问权限:O_RDONLY允许读 ✓
- 根据读写位置,计算要读取的磁盘块
- 从磁盘读取100字节到buf
- 更新读写位置 += 100
close(fd):
- 释放进程P的文件描述符表中fd对应的条目
- 系统级打开文件表引用计数减为0
- 释放打开文件表条目
- 将inode的修改信息(如访问时间)写回磁盘
open("F", O_RDWR):
- 与第一次open类似,但访问模式设为读写
write(fd, data, 50):
- 通过fd找到打开文件表项
- 检查访问权限:O_RDWR允许写 ✓
- 根据读写位置,计算要写入的磁盘块
- 将50字节写入磁盘
- 更新读写位置 += 50,更新文件大小
close(fd):
- 同第一次close,将修改后的inode写回磁盘
4. 方法反思:open和close是成对出现的,open建立连接,close断开连接。read/write只在文件打开后才能执行。考试中需要理解每一步的具体操作,特别是引用计数和权限检查。
五、考情分析
- 考查频次:文件操作在近5年真题中出现约2-3次。
- 常见题型:选择题(打开文件表、引用计数判断)、综合题(文件操作流程描述)。
- 分值占比:选择题2分,综合题3-5分。
- 命题趋势:近年来倾向于考查打开文件表的结构和引用计数机制,需要理解系统级和进程级两级表的关系。基于大纲与命题规律推测。
六、易错点提醒
错误表现:认为打开文件就是将整个文件读入内存。 错误原因:混淆了"打开"和"读取"。 正确理解/做法:打开文件只是将文件的**元数据(FCB/inode)**读入内存,不读取文件数据。文件数据在read时才按需读取。
错误表现:认为关闭文件后文件描述符仍然有效。 错误原因:不理解close的含义。 正确理解/做法:close释放文件描述符,之后使用该描述符会出错。但系统可能将该描述符号分配给后续打开的文件。
错误表现:认为删除文件时一定会释放所有资源。 错误原因:不理解引用计数机制。 正确理解/做法:在Unix中,如果文件正在被其他进程打开(引用计数 > 0),删除操作(unlink)只是删除目录项,文件数据不会立即释放,直到所有进程关闭文件后才真正释放。
七、来源标注
- 依据2026考研统考408大纲
- 依据《操作系统概念》(Operating System Concepts, Silberschatz)第11章
- 依据汤小丹《计算机操作系统》第4版第4章