第八章 文件管理
3 分钟阅读1,324 字22 个小节
第八章 文件管理
8.1 文件的逻辑结构
| 类型 | 说明 |
|---|---|
| 有结构文件(记录式) | 顺序文件、索引文件、索引顺序文件、直接/哈希文件 |
| 无结构文件(流式) | 字节序列,无明确结构 |
索引顺序文件(ISAM)补充
- 按关键字顺序组织主文件,并建立分层索引加速检索
- 插入新记录常先进入溢出区,再定期重组主文件
- 兼顾顺序访问与按键检索,适合“读多改少”的场景
🎯 本章真题锚点与最短模板
- 高频题号(2009-2025):2009Q30/Q31、2014Q29/Q46、2015Q29、2017Q26/Q30/Q31、2018Q46、2020Q23/Q24/Q31、2022Q46、2024Q26/Q29、2025Q27/Q30/Q31
- 优质例题:i-node含“12直接+1一级+1二级+1三级间接”,给块大小与指针大小,求最大文件长度。
- 最短解题模板:
- 每级可索引块数 = 块大小 / 指针大小。
- 总容量 = 直接块 + 一级 + 二级 + 三级,对应逐级乘方。
- 最终统一换算为KB/MB/GB并标明单位。
⚡ 秒杀版口令卡(10秒回忆)
- 口令:先算每级扇出,再逐级乘方。
- 口令:直接+一级+二级+三级,缺一项都丢分。
- 口令:硬链接同iNode,软链接存路径。
8.2 文件目录
FCB(文件控制块)
包含:文件名、类型、大小、物理地址(起始块号)、创建/修改时间、存取控制信息等
索引节点(i-node)⭐
- 将FCB中除文件名外的信息提取出来形成索引节点
- 目录项仅含文件名+索引节点号
- 显著减小目录项大小→提高目录检索效率
- 磁盘索引节点:存放在磁盘上
- 内存索引节点:打开文件时调入内存,增加引用计数等字段
目录结构
| 结构 | 说明 |
|---|---|
| 单级目录 | 唯一目录,不允许重名 |
| 两级目录 | MFD(主文件目录)+ UFD(用户文件目录) |
| 树形目录 | 多级层次,用绝对路径/相对路径定位 |
| 无环图目录(DAG) | 支持共享子目录/文件 |
目录检索
- 线性检索法:顺序查找
- Hash方法:用文件名哈希直接定位(需解决冲突)
8.3 文件共享
| 方式 | 原理 | 优缺点 |
|---|---|---|
| 硬链接 | 不同目录项指向同一索引节点,count引用计数 | 删除只count-1,count=0才真正删除;目录通常禁建硬链接防环 |
| 软链接(符号链接) | 创建一个LINK类型文件,存放被链接文件的路径名 | 额外I/O开销(需解析路径),被删除后变悬空链接 |
8.4 文件保护
访问矩阵
- 行=域(用户),列=对象(文件),元素=权限集合
- 太大难以存储→实际实现:
| 方式 | 原理 | 特点 |
|---|---|---|
| ACL(访问控制列表) | 按列存储,每个文件记录哪些用户有何权限 | 精简为owner/group/other三类 |
| 能力表 | 按行存储,每个用户记录可访问哪些文件 | 用户持有能力列表 |
特殊权限
- 复制权R':能将权限复制给同一列其他域
- 所有权O:能授予/取消同一列其他域的权限
- 控制权:能修改同一行其他对象的权限
8.5 Linux文件系统
VFS四个对象
- superblock(超级块):整个文件系统的信息
- dentry(目录项):路径中的一个分量
- iNode(索引节点):文件的元信息
- file(文件对象):进程已打开的文件
ext2文件系统
- 块组结构:超级块 + 组描述符 + 块位图 + iNode位图 + iNode表 + 数据块
- iNode 128B,含15个块指针i_block:
i_block[0-11]:12个直接块i_block[12]:一次间接块i_block[13]:二次间接块i_block[14]:三次间接块
⚠️ 口径提示:此处是 ext2 的“12直接 + 1一级 + 1二级 + 1三级”;而经典UNIX教材常写“10直接 + 3级间接”,两者来源不同,不矛盾。
8.6 文件操作与打开文件表(高频补强)
两级打开文件表
- 系统打开文件表(全局)
- 记录:文件元信息引用(如iNode指针)、打开方式、当前偏移量、引用计数等
- 进程打开文件表(每进程)
- 记录:该进程持有的文件描述符
fd与系统打开文件表项的对应关系
- 记录:该进程持有的文件描述符
关键关系:
fd本质是“进程打开文件表的索引”,再间接指向系统打开文件表。
open() 典型路径
- 按路径检索目录项,定位目标文件iNode
- 做权限检查与打开方式检查
- 在系统打开文件表建立/复用表项(引用计数+1)
- 在进程打开文件表分配一个空闲
fd并返回
close() 典型路径
- 根据
fd找到进程打开文件表项并清除 - 对应系统打开文件表项引用计数减1
- 若引用计数为0,按需回写并释放相关内核对象
常考辨析
- 多个
fd可指向同一系统打开文件表项(如dup、fork后继承) - 若共享同一系统表项,文件偏移量通常联动变化;若分别
open,偏移量通常独立