4.1 文件与文件系统基础
4.1.1 文件基本概念
文件是操作系统对存储设备数据的抽象。
-
逻辑层面:文件是一段线性有序的数据流。
-
物理层面:文件数据可以连续或者离散存储在外存设备中。
文件包含两部分信息:
数据信息:文本、图片、视频等用户数据;程序、可执行代码等程序信息。
元数据(文件属性):文件名、修改时间、文件所有者、存取权限、物理存储位置、文件大小等,由文件系统自动维护。例子:电脑右键查看文件属性,弹出的大小、修改时间、权限信息均为元数据,用户无法直接编辑底层元数据。
4.1.2 文件系统
文件系统是操作系统管理外存的核心子系统,作用是屏蔽硬件底层细节,简化用户数据访问与存储管理。
文件系统核心功能:
实现按路径访问文件,用户无需关心数据在外存的物理存放位置。例子:通过「D:\\学习\\考研笔记.docx」路径打开文件,无需知道文件存在磁盘哪个扇区。
负责外存存储空间的分配与回收,用户写入数据时不需要手动管理空闲块。例子:新建文件、删除文件时,系统自动占用/释放磁盘空间,无需用户手动清理磁盘块。
提供目录组织功能,实现文件的分类、查找。
实现文件的共享与保护。例子:多人共享查看一份办公文档、设置文件只读权限防止误删。
4.1.3 文件分类
按数据形式:源文件、目标文件、可执行文件。
按用途:系统文件、用户文件、库文件。
4.1.4 FCB 文件控制块与索引节点 inode
FCB(文件控制块) 操作系统为每个文件创建的数据结构,用于管理文件,实现按名存取。 一个文件由 FCB + 文件数据两部分组成,FCB 与文件一一对应。存取文件时,先查找 FCB,再通过 FCB 获取文件物理位置完成读写。
FCB 的有序集合就是文件目录,一个 FCB 就是一个目录项;目录本身也作为文件存储,称为目录文件。
假设磁盘目录里有一个文件:note.txt 它的 FCB 目录项是完整全套信息,内容如下:
文件名:note.txt
文件大小:20KB
创建时间:2026-08-05
权限:可读可写
所有者:admin
物理盘块号:100#、101#、102#
工作逻辑 系统查找 note.txt 时,必须把整条完整FCB读入内存,挨个比对文件名。 哪怕只需要找名字,也要加载大小、时间、权限、地址等一堆无用数据。
索引节点 inode(Unix/Linux) 将文件名与其余文件描述信息分离,把除文件名以外的全部元数据存放在独立的数据结构,即索引节点。inode 是文件的唯一标识。
目录,只存两样东西:
文件名:note.txt
inode 编号:8866
磁盘 inode(单独存放全套属性)
文件大小:20KB
创建时间:2026-08-05
权限:可读可写
所有者:admin
物理盘块号:100#、101#、102#
查找文件时,系统只需要读取极小的目录项比对文件名, 不需要加载任何文件属性、地址信息,一页磁盘块能装几百条目录项, 大大减少访盘次数,极大提升检索效率。 只有匹配到目标文件后,才会读取一次 inode 获取物理地址。
引入 inode 的目的:提升文件查找速度。
精简了目录项大小,一个磁盘可以存放更多的目录项,从而减少目录检索时的磁盘访盘次数,避免无效加载大量文件属性,显著提升文件检索效率。
-
磁盘索引节点:存放在磁盘上,包含文件主标识符、文件类型、存取权限、文件物理地址、文件长度、链接计数、各类存取时间。
-
内存索引节点:文件打开时,磁盘 inode 复制到内存。相比磁盘 inode,新增:inode 编号、inode 状态(上锁 / 修改标记)、访问计数、逻辑设备号、空闲链表与散列队列链接指针。
- 内存读写速度远快于磁盘,打开文件后全程用内存 inode 寻址,不用反复读磁盘,大幅提速。
- 记录动态运行信息(磁盘 inode 没有的):
- 访问计数、上锁状态、修改标记、进程占用状态
- 负责进程读写、共享、文件关闭时的计数更新。
链接计数(磁盘inode):统计磁盘上有几个文件名入口(管物理文件)
引用计数(内存inode):统计内存中有几个进程正在打开使用(管内存资源)
4.1.5 文件相关系统调用与核心数据结构
文件通过系统调用完成建立、删除、打开、关闭、读写、加锁等操作。
两大核心表
-
系统打开文件表:整个系统仅有一张,系统级。 表项内容:inode 指针、文件偏移量(读写指针)、访问模式、文件打开计数。
-
例子:多个进程同时打开同一个视频文件,所有进程共享这张表的读写指针。
-
-
用户打开文件表:每个进程一张,存放在 PCB 内。表项索引就是文件描述符 FD,表内存放指向系统打开文件表的指针。
-
例子:浏览器进程、文档进程,各自拥有独立的用户打开文件表,互不干扰。
-
-
联动的逻辑:

-
1. 进程通过自身用户打开文件表的FD,定位到对应的系统打开文件表项(找操作入口);
2. 通过系统打开文件表,获取文件动态读写状态(偏移量、共享次数、打开模式);
3. 通过系统表表项的指针找到内存inode,读取文件永久属性和物理存储地址,完成磁盘读写。
-
辨析: 系统打开文件表的打开计数:多少进程共享同一个读写指针; inode 中的引用计数:多少进程在共享该文件本身。
建立文件FD=create(filename,mode) mode 指定存取权限。 执行流程: ①为文件分配磁盘存储空间; ②分配磁盘 inode、内存 inode; ③构造目录项(文件名 + 磁盘 inode 指针)写入对应目录文件; ④填充内存 inode; ⑤分配用户打开文件表项、系统打开文件表项,设置初值; ⑥返回文件描述符 FD。
删除文件 ①删除目录中对应的目录项; ②释放文件占用的存储空间、FCB、缓冲区; ③执行该操作需要用户拥有文件的写权限。
打开文件FD=open(filename,mode) mode 为打开方式。打开后后续读写关闭均使用 FD,不再使用文件路径。 执行流程: ①按文件名检索目录; ②找到文件后,将磁盘 inode 复制到内存 inode;若该文件已经被打开,仅将内存 inode 访问计数 + 1; ③分配用户、系统打开文件表项,建立指针关联; ④返回 FD。
双击打开Word文档,后台执行open调用,仅加载文件元数据,不加载全部文件内容。
fork 创建子进程:父子进程的用户打开文件表项可以指向同一个系统打开文件表项,此时可以共享读写指针。 open 操作不会把文件数据读入内存,仅将 FCB/inode 调入内存;真正读数据时才访问磁盘获取文件内容。 可通过系统调用对文件加锁,实现文件内容保护。
关闭文件close(fd) ①根据 fd 定位用户打开文件表项,删除该表项; ②定位系统打开文件表项,打开计数减一; ③若打开计数不为 0,说明还有进程共享,直接返回; ④若打开计数为 0,释放系统打开文件表项;内存 inode 引用计数减一; ⑤inode 引用计数不为 0 直接返回;否则将内存 inode 写回磁盘 inode,释放内存 inode。
读文件 校验访问合法性;依据内存 inode 中的物理地址定位文件;从当前文件偏移量开始,读取指定字节到缓冲区,再拷贝至用户缓冲区。
4.1.6 文件保护与访问控制
文件保护两大目标:
阻止未授权用户访问;
限制授权用户的访问类型。
应对系统故障破坏文件的手段:建立副本、定时转储。
文件访问类型:读、写、执行、追加、删除、列表;重命名、复制等操作可通过底层系统调用实现。
访问控制实现方案:
访问控制矩阵;

访问控制表:为每个文件 / 目录配置,记录用户名与允许的操作;
口令与密码:口令用于鉴别用户身份,无法控制访问权限;密码一般指加密算法。
4.1.7 文件逻辑结构
文件逻辑结构是站在用户视角看到的文件组织形式。
无结构文件(流式文件) 文件是字节流,以字节为单位,源程序、可执行文件大多属于此类。强行切分为记录会带来额外开销。
有结构文件(记录式文件) 由若干记录组成,记录是最小信息单位。
-
定长记录:所有记录长度相同,数据项相对位置固定。
-
变长记录:记录长度不等,来源:包含变长数据项,或者定长数据项数量可变。
变长记录:检索修改麻烦,但节省存储空间。
(1)顺序文件
记录按某种顺序存放,可以顺序存储或者链式存储;记录大多为定长。
-
串结构:记录按存入时间排序,和关键字无关;只能从头顺序查找。
-
顺序结构:按关键字排序,可以折半查找。
每条记录表项内容:关键字 + 完整用户数据
结构直观示例
[1001 张三] [1002 李四] [1003 王五] [1004 赵六]
查找只能从头遍历,无任何快速索引。
优点:批量存取效率高;磁盘这类顺序存储设备只有顺序文件可以高效工作。
缺点:单个记录查找修改效率低,增删困难。
(2)索引文件
针对变长记录顺序文件查找慢的问题。除主文件外额外建立一张索引表。 索引表保存每个记录的指针、记录长度,索引表按键排序,索引表本身是定长记录的顺序文件。
结构特点:分为两部分:索引表(有序定长)+ 主数据文件。一条数据对应一条索引。
索引表每一项表项内容:关键字 + 该记录物理地址指针 + 记录长度
索引表真实长这样
1001 → 磁盘块 #200(张三数据位置)、记录长度64B
1002 → 磁盘块 #201(李四数据位置)、记录长度64B
1003 → 磁盘块 #202(王五数据位置)、记录长度64B
1004 → 磁盘块 #203(赵六数据位置)、记录长度64B
数据区:单独存放四条学生完整记录,无需有序。
查找流程:先查索引表 → 拿到指针 → 直接定位数据(支持随机查找)。
优点:把变长记录的顺序查找转变为索引表的随机查找,提升速度。
缺点:每个记录都需要索引项,存储开销大。 适用场景:对响应及时性要求高,例如订票系统、库存系统。
(3)索引顺序文件
对记录分组,仅为每组第一条记录建立索引项。 组间关键字有序,组内可以无序,类似分块查找。 最优划分:N 个记录分为
组,每组
个记录。兼顾查找速度与顺序特性。
结构特点:数据分组存放,一组数据只对应一条索引,索引数量极少。
索引表每一项表项内容:组首关键字 + 本组起始物理指针
索引表真实长这样(极简)
1001 → 第一组起始地址(包含:1001、1002)
1003 → 第二组起始地址(包含:1003、1004)
数据区结构
第一组:[1001张三][1002李四]
第二组:[1003王五][1004赵六]
查找流程:索引定位组 → 组内顺序查找。
(4)直接文件与散列文件
直接文件:由关键字直接算出记录物理地址。 散列文件属于直接文件,通过哈希函数将关键字转换为存储地址。
4.2 文件物理结构与目录管理
4.2.1 文件物理结构
文件物理结构描述文件在外存上的组织形式,包含文件分配方式、磁盘空闲块管理。 三种主流分配方式:连续分配、链接分配、索引分配。
连续分配 为文件分配一组相邻磁盘块,逻辑顺序与物理顺序一致。目录项记录首块号、文件总块数。 支持顺序访问、随机访问。
结构特点:一个文件的所有数据盘块,在磁盘上连续挨着存放,无间隔、无跳跃。
目录表项存放内容:文件起始磁盘块号 + 文件总块数
物理存储直观示例
文件data.txt 占用连续3个磁盘块:
#50(第1块数据) #51(第2块数据) #52(第3块数据)
优点:随机访问效率高。
缺点:创建文件前需要预知文件大小;动态扩展困难;插入删除开销大;扩展无相邻盘块时需要整体搬迁文件。
链接分配:分配离散盘块,通过指针串联成链表,消除外部碎片,支持动态增长。
-
隐式链接:目录记录首块、末块;每个盘块存放下一盘块指针。
-
缺点:仅适合顺序访问;读取第 i 块必须从头遍历;指针占用存储空间;一个指针损坏就会丢失后续数据。
Windows 以簇、Linux 以块作为分配单位,由多个扇区组成,降低指针存储占比,但会增大内部碎片。
-

-
结构特点:文件盘块离散散落在磁盘各处,每一个数据块自带「下一块指针」,串成一条链表。
目录表项存放内容:文件起始磁盘块号(仅需1个)
物理存储直观示例(隐式链接)
data.txt 离散分布:
#20数据 → 指针指向 #66
#66数据 → 指针指向 #91
#91数据 → 结束指针
-
-
-
显式链接(FAT 文件分配表) 把所有盘块的后继指针提取出来,存放在整张 FAT 表,一张磁盘共用一张 FAT,开机读入内存常驻。类似于静态链表结构。 按块号索引,-1 代表文件结束,-2 代表盘块空闲;目录项仅保存文件首块号。FAT 同时可以管理空闲磁盘块。
-
FAT 表每一项存放内容:当前盘块的「下一个盘块号 / 结束标记 / 空闲标记」
物理存储直观示例
文件 data.txt 占用:#20 → #66 → #91(结束)
FAT 全局表真实结构:
FAT[20] = 66
FAT[66] = 91
FAT[91] = -1(文件结束)
FAT[其他空闲块] = -2 -

-
优点:查找在内存完成,减少磁盘 IO。
-
缺点:大容量磁盘 FAT 表项数量巨大,内存开销大;表项位数由磁盘总块数决定。
-
-
索引分配 为每个文件分配专门的索引块,存放该文件全部数据盘块号。访问第 i 块就读取索引块的第 i 项。
-
结构特点:单独开辟一个索引块,专门存放该文件所有数据块的块号;数据块完全离散存储。
索引块每一项内容:当前文件的数据磁盘块号
物理存储直观示例
索引块 #100(专门存地址):
第1项 → #30(数据块1)
第2项 → #55(数据块2)
第3项 → #77(数据块3)
数据区离散分布:#30、#55、#77 各自独立存放数据 -
优点:支持随机访问,文件拓展方便,无外部碎片。
-
缺点:索引块带来额外存储开销;访问文件需要两次读磁盘(先读索引块,再读数据块)。
-
4.2.2 目录管理
目录本质是索引,建立文件名到文件物理地址的映射;目录是 FCB 的有序集合,目录项就是 FCB。 目录功能:按名存取、文件共享。Windows 下目录即文件夹。
单级目录:整个文件系统一张目录表。不允许重名;适合单用户,无法实现分类。
两级目录:主文件目录(用户名 + 用户目录指针)+ 用户文件目录。无法对文件分类。
通俗例子:电脑有「管理员、访客」两个用户账户,每个用户有独立的文件存放空间,用户之间文件隔离,但每个用户内部无法建子文件夹分类。
树形目录:根目录为树根,子目录为分支,文件为叶子。
当前目录(工作目录):进程正在使用的目录,加快检索。
绝对路径:从根目录出发;相对路径:从当前目录出发。 优点:解决重名,支持共享。 缺点:路径查找需要逐级访问磁盘,IO 次数增加。
无环图目录:在树形目录基础上增加有向边;允许文件 / 子目录拥有多个父目录,方便共享。
通俗例子:一份公共考研真题文件,可同时放在「操作系统文件夹」和「公共资料文件夹」下,两个目录均可访问该文件,仅保留一份原始副本。
目录操作
-
创建目录:树形目录新建子目录,自动生成.(当前目录)、..(父目录)两个目录项。
-
删除目录:空目录直接删除目录项;非空目录行为由系统决定,要么递归全部删除,要么报错返回。
-
切换目录:修改工作目录,可以指定绝对 / 相对路径,无参数一般切换为主目录。
-
例子:CMD命令行通过cd指令切换文件夹。
-
-
文件查找:逐级解析路径分量,每一级读取对应目录文件,匹配文件名,获取 inode 号,最终得到物理地址。任意一级查找失败直接返回文件不存在。根目录一般常驻内存。
目录实现
线性表:目录项存放在线性表,逐个比对文件名,线性查找。
哈希表:文件名作为 key,盘块指针作为 value;查找速度快,需要处理哈希冲突。
4.2.3 文件共享
目标:外存只保留一份副本,节约存储空间,减少 IO。
硬链接(基于 inode 共享) 用户目录新增目录项,指向同一个 inode,inode 链接计数 count+1。 修改文件对所有链接可见。删除文件只删除目录项,count 减一;count 为 0 才真正释放磁盘空间。 限制:必须在同一个 inode 文件系统内,不能链接不存在的文件。
软链接(符号链接) 独立的特殊文件,存储目标文件的路径字符串。Windows 快捷方式就是软链接。
软链接本身占用磁盘空间;建立软链接,原文件 inode 引用计数不变。 原文件删除、重命名、移动,符号链接文件本身还存在,但访问失败;删除软链接不会影响原文件。
实例:删除软件本体,桌面快捷方式仍存在,但点击无法打开。
4.3 文件系统实现、磁盘空闲块管理、VFS 与挂载
4.3.1 外存引导相关结构
MBR 主引导记录:硬盘开机读取的第一个扇区,BIOS 读取 MBR。包含第一阶段引导代码、分区表,标记活动分区。
引导块:每个分区都有引导块,存放操作系统引导代码,负责加载本分区操作系统。
4.3.2 磁盘空闲盘块管理
空闲表法:维护空闲区表,记录空闲区起始盘块号、盘块数量。
空闲链表法
空闲盘块链:以单个盘块为单位,盘块内存放后继指针。
空闲盘区链:以连续盘块组(盘区)为单位,记录盘区大小、下一个盘区指针。
位示图法:二进制位代表盘块状态,0 代表空闲,1 代表已分配。
分配:查找值为 0 的比特位,行号列号转换为盘块号,置 1。
回收:盘块号换算为行、列,对应比特置 0。 优点:存储空间开销很小。
成组链接法:空闲盘块分组,每组最多 100 块;每组第一个盘块记录下一组的块总数与块号;第一组为空闲盘块号栈(专用块),栈式分配回收。
4.3.3 虚拟文件系统 VFS
VFS 驻留内存,向上层进程提供统一抽象接口。
屏蔽底层不同文件系统差异,硬盘、U 盘、光盘可以使用同一套系统调用访问。
通俗实例:电脑打开硬盘文件、U盘文件、光盘文件,操作方式完全一致,无需适配不同设备格式,就是VFS的屏蔽作用。
4.3.4 文件系统挂载与卸载
挂载:将分区 / 存储设备映射到操作系统某个文件夹下,并建立访问路径。挂载之后访问该目录等价访问设备;卸载后目录恢复为空,设备上原始数据保留。文件系统使用前必须挂载。
通俗实例:插入U盘,系统自动挂载,电脑出现U盘盘符(文件夹入口);弹出U盘即为卸载,断开访问路径,U盘数据不会丢失。
网硕互联帮助中心



评论前必须登录!
注册