QEQuantumEinsteinSearchCtrl/⌘K

第八章 文件管理

3 分钟阅读1,32422 个小节
返回目录

第八章 文件管理

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三级间接”,给块大小与指针大小,求最大文件长度。
  • 最短解题模板
    1. 每级可索引块数 = 块大小 / 指针大小。
    2. 总容量 = 直接块 + 一级 + 二级 + 三级,对应逐级乘方。
    3. 最终统一换算为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四个对象

  1. superblock(超级块):整个文件系统的信息
  2. dentry(目录项):路径中的一个分量
  3. iNode(索引节点):文件的元信息
  4. 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 文件操作与打开文件表(高频补强)

两级打开文件表

  1. 系统打开文件表(全局)
    • 记录:文件元信息引用(如iNode指针)、打开方式、当前偏移量、引用计数等
  2. 进程打开文件表(每进程)
    • 记录:该进程持有的文件描述符 fd 与系统打开文件表项的对应关系

关键关系fd 本质是“进程打开文件表的索引”,再间接指向系统打开文件表。

open() 典型路径

  1. 按路径检索目录项,定位目标文件iNode
  2. 做权限检查与打开方式检查
  3. 在系统打开文件表建立/复用表项(引用计数+1)
  4. 在进程打开文件表分配一个空闲 fd 并返回

close() 典型路径

  1. 根据 fd 找到进程打开文件表项并清除
  2. 对应系统打开文件表项引用计数减1
  3. 若引用计数为0,按需回写并释放相关内核对象

常考辨析

  • 多个 fd 可指向同一系统打开文件表项(如 dupfork 后继承)
  • 若共享同一系统表项,文件偏移量通常联动变化;若分别 open,偏移量通常独立