当前位置: 首页 > news >正文

第四章 文件管理

第四章 文件管理

初识文件管理

image-20250609170017984

文件的逻辑结构

image-20250609170254356

image-20250609171534938

image-20250609171822749

索引文件:其实就是为了解决在实际应用中,我们的信息几乎都是一个个的无定长的记录。在顺序文件中,无定长记录是按照一种“链表”的方式 进行数据的组织形式的。因此,在查询时需要一个一个查询。那么索引文件通过建立“基于定长记录的顺序文件(索引表) ” + 对逻辑文件的映射,达到快速查询的目的。如果按照关键字排列,还可以支持关键字的折半查找。

image-20250609173453028

image-20250609173511493

image-20250609173019823

文件目录

文件管理的核心数据结构

image-20250609174031173

目录结构

image-20250609174425249

image-20250609174543389

image-20250609174944326

image-20250609175130842

文件目录小结

image-20250609175828134

文件的物理结构和文件分配方式

一、核心概念:物理结构与分配方式的定义

1. 文件的物理结构

  • 定义:指文件数据在存储设备(如磁盘)上的实际存储形态与组织方式,即数据块如何排列、链接或索引,体现数据的 “存储布局”。
  • 关注点:数据块的逻辑关系(连续 / 离散)、是否需要指针 / 索引、访问数据的路径。

2. 文件的分配方式

  • 定义:操作系统为文件分配存储空间的策略,决定如何从存储设备中申请、管理和回收磁盘块,是物理结构的实现基础。
  • 关注点:分配策略(连续分配 / 离散分配)、空间管理效率、碎片处理。

二、文件分配方式的分类与对应物理结构

分配方式核心策略对应物理结构典型场景 / 文件系统优缺点
连续分配为文件分配连续的磁盘块,通过起始地址和块数定位数据。连续结构早期机械硬盘、简单文件系统(如 MS-DOS 早期)优点:访问速度快,支持顺序 / 随机访问; 缺点:易产生外部碎片,文件扩展困难。
链式分配为文件分配离散的磁盘块,通过指针(前一块存储下一块地址)串联数据块。链接结构FAT 文件系统(隐式 / 显式链接)优点:充分利用离散空间,无外部碎片; 缺点:只能顺序访问,指针存储开销。
索引分配为文件创建索引表(记录所有数据块地址),磁盘块可离散分配,通过索引表访问。索引结构EXT4、NTFS、APFS 等现代文件系统优点:支持高效随机访问,便于文件扩展; 缺点:索引表占用额外空间。

三、关键对应关系与逻辑

  1. 分配方式决定物理结构
    • 分配方式是 “策略”,物理结构是 “结果”。例如:
      • 选择连续分配 → 数据块必然连续存储(连续结构);
      • 选择链式分配 → 数据块离散存储并通过指针链接(链接结构);
      • 选择索引分配 → 数据块离散存储但通过索引表统一管理(索引结构)。
  2. 核心差异:策略 vs. 形态
    • 分配方式:解决 “如何分空间”(连续分 / 离散分),涉及操作系统的存储管理策略;
    • 物理结构:解决 “分完后数据怎么存”(排成一排 / 用指针连起来 / 用索引表管起来),是分配策略的具体体现。
  3. 应用场景对比
    • 连续结构:适合对访问速度要求高且不常修改的文件(如系统文件),但空间利用率低;
    • 链接结构:适合顺序访问的大文件(如日志文件),但随机访问效率差;
    • 索引结构:适合需要频繁随机访问的文件(如数据库文件),是现代文件系统的主流选择。

四、常见问题与总结

1. 为什么分配方式影响物理结构?

  • 分配策略直接决定数据块的存储位置(连续或离散),而存储位置的组织方式(是否用指针 / 索引)即物理结构。例如,离散分配必须通过指针或索引来建立数据块的逻辑关联。

2. 碎片问题如何产生?

  • 连续分配:文件删除后,连续空间被分割为不连续的小块,形成外部碎片
  • 链式 / 索引分配:数据块本身离散存储,无外部碎片,但可能产生内部碎片(如索引表占用空间)。

3. 总结图示

分配方式(策略)   →   物理结构(结果)  
├─ 连续分配       →   连续存储(无指针/索引)  
├─ 链式分配       →   离散存储+指针链接  
└─ 索引分配       →   离散存储+索引表管理  

通过分配方式与物理结构的绑定关系,操作系统实现了对文件存储的高效管理,平衡了空间利用率与访问性能的需求。

文件存储空间管理(没懂)

image-20250611144930474

文件的基本操作

image-20250611145255741

image-20250611145437774

image-20250611150312587

image-20250611150253296

image-20250611150858247

文件共享

共享方式:

image-20250611151804155

文件保护

image-20250611153328362

文件系统的层次结构

image-20250611153742282

image-20250611154051759

文件系统布局

物理格式化、逻辑格式化、内存中的文件系统结构

虚拟文件系统和文件系统挂载

虚拟文件系统:相当于一种接口的作用

image-20250611165353473

2.对上(应用进程),屏蔽实现。对下(内核),要求必须按照“接口”进行实现。

image-20250611165853982

image-20250611170231246

image-20250611171321760

小结

一、文件管理:核心功能与目标

  • 核心职责:统一管理文件的存储、检索、保护,提供抽象接口屏蔽底层硬件差异。
  • 关键目标:高效性(减少 I/O)、安全性(权限控制)、透明性(用户无需关心物理存储)。
  • 辨析:文件管理与存储管理的区别 —— 前者聚焦数据组织与抽象接口,后者关注内存 / 外存的物理空间分配。

二、逻辑结构:用户视角的文件组织

  1. 无结构(流式文件)
    • 示例:文本文件(.txt)、二进制文件(.exe),视为无差别的字节流。
    • 优势:灵活,适用于任意数据;缺点:需应用层自行解析结构。
  2. 有结构(记录式文件)
    • 按记录单位组织(如数据库表每条记录为一行),支持按关键字检索(如索引文件)。
    • 辨析:逻辑结构与物理结构解耦 —— 同一逻辑结构可对应不同物理存储方式(如连续 / 索引存储)。

三、物理结构:磁盘上的数据布局

类型实现方式典型场景优缺点
连续存储数据块在磁盘上连续存放FAT32 早期文件系统读速度快,但扩展困难(需连续空间),碎片问题严重。
链式存储块间通过指针链接(显式 / 隐式)早期 U 盘、简单文件系统适合零散空间,扩展灵活;但随机访问需遍历链表,效率低。
索引存储用索引表记录所有块地址(单级 / 多级)EXT4、NTFS、XFS支持高效随机访问(直接查索引),大文件管理能力强(如 EXT4 支持 TB 级文件)。
  • 辨析:物理结构影响 I/O 性能 —— 索引存储在随机访问场景(如数据库)中显著优于链式存储,但索引表本身占用空间。

四、存储空间管理:磁盘块的分配与回收

  1. 分配方法
    • 位图法:用二进制位表示块是否空闲(1 = 已用,0 = 空闲),查询效率高(如 FAT32 的 FAT 表)。
    • 空闲链表:将空闲块连成链表,分配时遍历查找(适合小文件系统)。
    • 成组链接法:结合位图与链表,Linux ext 系列文件系统采用,兼顾效率与空间。
  2. 回收策略:释放块时更新空闲状态(如位图置 0),注意避免 “空闲块丢失”(如文件删除时未正确回收块)。

五、基本操作:系统调用与语义

操作核心功能系统调用示例(Linux)关键细节
打开(Open)验证权限,获取文件句柄,初始化读写位置open()打开时指定模式(读 / 写 / 追加),返回文件描述符(fd)。
读写(I/O)按偏移量操作数据,支持缓冲read()/write()内核通过页缓存(Page Cache)减少磁盘 I/O,写操作可能延迟刷盘(Delayed Write)。
定位(Lseek)修改当前读写位置lseek()支持绝对定位(如SEEK_SET)和相对定位(如SEEK_CUR)。
关闭(Close)释放句柄,刷新缓存close()引用计数减 1,为 0 时真正释放资源,避免句柄泄漏。
  • 辨析:缓冲 I/O 与直接 I/O—— 前者利用内存缓存提升性能(如fread),后者绕过缓存(如O_DIRECT标志,适合数据库)。

六、文件共享:多进程协作与资源复用

  1. 共享机制
    • 文件描述符表:进程级,记录打开文件的读写位置等状态。
    • 打开文件表:系统级,记录文件的 inode、引用计数、权限等,实现跨进程共享。
    • 硬链接(Hard Link):多个文件名指向同一 inode(如 Linux 的ln命令),共享数据块。
    • 软链接(Symbolic Link):类似快捷方式,存储目标路径,可跨文件系统(如ln -s)。
  2. 并发控制
    • 文件锁:互斥锁(独占写)与共享锁(允许多读),通过flock()fcntl()实现。
    • 辨析:硬链接与软链接的本质区别 —— 硬链接无独立 inode,不能指向目录;软链接有独立 inode,可指向任意文件 / 目录,删除原文件后失效。

七、文件保护:权限、加密与一致性

  1. 访问控制模型
    • Unix 权限模型:基于所有者(User)、组(Group)、其他(Others)的 r/w/x 权限(如chmod 755)。
    • ACL(访问控制列表):Windows / 现代 Linux 支持,更精细控制(如指定用户 A 可读,用户 B 可写)。
  2. 数据安全
    • 加密:透明加密(如 Linux 的 eCryptfs)对用户透明,存储时自动加密。
    • 校验:通过 CRC、哈希(如 MD5)防止数据篡改。
  3. 一致性保障
    • 日志文件系统(如 EXT4、NTFS):记录关键操作(如写块),崩溃后通过日志恢复(类似数据库事务)。

八、文件系统层次结构与布局

  1. 逻辑分层
    • 用户接口层:处理路径解析(如/home/user/file.txt),调用下层接口。
    • 文件目录层:管理目录树、inode 映射(如通过文件名查 inode)。
    • 存储管理层:负责块分配、缓存管理(如页缓存、预读策略)。
    • 设备接口层:与磁盘驱动交互,执行实际 I/O 操作(如扇区读写)。
  2. 物理布局(以 Linux EXT4 为例)
    • 引导块(Boot Block):存储启动代码,每个分区一个。
    • 超级块(Superblock):记录文件系统元数据(块大小、inode 总数、空闲块数等)。
    • inode 表:存储所有文件的 inode(元数据 + 块地址)。
    • 数据块区:实际存储文件数据。

九、虚拟文件系统(VFS)与挂载

  1. VFS:统一文件系统接口
    • 抽象层,屏蔽不同文件系统(EXT4/NTFS/FAT32)的差异,提供统一系统调用接口。
    • 核心数据结构:struct file(文件实例)、struct inode(VFS 层 inode)、struct super_block(超级块)。
  2. 挂载(Mount)
    • 将外部存储设备(如 U 盘)或文件系统关联到目录树的过程(如 Linux 中mount /dev/sdb1 /mnt/usb)。
    • 关键步骤:
      1. 解析设备路径,读取超级块;
      2. 在 VFS 中注册文件系统类型;
      3. 将设备挂载点(如/mnt/usb)与文件系统根目录关联。
  • 辨析:VFS 与具体文件系统的关系 ——VFS 是 “接口规范”,EXT4/NTFS 等是 “实现”,类似面向对象中的接口与类。

总结:核心辨析与关联

  • 逻辑结构 vs 物理结构:前者是用户视角的抽象(如记录式文件),后者是磁盘存储的具体实现(如索引存储),通过文件系统层解耦。
  • 文件共享 vs 文件保护:共享需并发控制(锁机制),保护需权限隔离,二者通过打开文件表、ACL 等机制协同。
  • VFS 的核心价值:屏蔽不同文件系统差异,使open()/read()等接口可操作本地磁盘、U 盘、网络文件系统(如 NFS)等,实现 “一切皆文件” 的抽象。
http://www.xdnf.cn/news/990613.html

相关文章:

  • 软件测试用例设计总结
  • Position Embedding 有哪些方式?
  • @Indexed原理与实战
  • Java大模型开发入门 (3/15): 拥抱官方标准 - 使用OpenAI官方Java SDK调用DeepSeek
  • 航电系统之轨迹克隆技术篇
  • pyvis报错AttributeError: ‘NoneType‘ object has no attribute ‘render‘
  • python打卡day51@浙大疏锦行
  • 期权末日轮实值期权盈利未平仓怎么办?
  • 【多模态/T5】[特殊字符] 为什么视频生成模型还在用T5?聊聊模型选择的学问
  • Windows版PostgreSQL 安装 postgis扩展
  • 大数据下的分页通用架构设计:从随机IO到顺序IO
  • Gartner<Reference Architecture Brief: Data Integration>学习心得
  • 嵌入式程序存储结构
  • HW中常态化反钓鱼训练的具体战略部署
  • 【网络】每天掌握一个Linux命令 - netperf
  • 6. TypeScript 函数
  • 提升集装箱及金属包装容器制造交付效率:数字化项目管理系统的核心优势
  • 异常谋杀案--Java异常处理篇
  • 工程论文: TORL: Scaling Tool-Integrated RL
  • StackOverflowError
  • (javaSE)继承和多态:成员变量,super,子类构造方法,super和this,初始化, protected 继承方式 final关键字 继承与组合
  • Dify-7: RAG 知识系统
  • 什么是项目进度管理?项目进度管理有哪些核心功能?
  • LLM 系列(二) :基础概念篇
  • 力扣-347.前K个高频元素
  • 控制器轨迹生成
  • 编程项目学习,怎么快速掌握
  • 菜鸟带新鸟--EPlan2022创建自己的标识字母
  • 创建和运行线程
  • *res = append(*res, temp) 为什么要使用 temp 作为临时存储值