云计算百科
云计算领域专业知识百科平台

OS——文件系统

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 个记录分为\\sqrt{N}组,每组\\sqrt{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盘数据不会丢失。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » OS——文件系统
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!