4.计算机操作系统——文件系统.md 5.0 KB


一、文件系统定义与核心功能

1. 定义

文件系统是操作系统中管理持久化数据的子系统,负责将文件以逻辑结构组织并存储到磁盘等外存设备,提供文件的创建、读写、删除和保护功能。其核心设计目标包括:

  • 按名存取:用户通过文件名访问文件,无需关注物理存储细节
  • 高效存储:优化磁盘空间利用率(如减少碎片)
  • 数据安全:通过权限控制、备份等机制保障数据安全

2. 核心功能

  1. 文件存储管理:分配磁盘空间(如连续/离散分配)
  2. 目录管理:树形结构组织文件,支持快速检索
  3. 元数据管理:维护文件属性(如大小、权限、时间戳)
  4. 缓存机制:通过内存缓存加速文件访问(如目录项缓存)
  5. 虚拟文件系统(VFS):统一接口支持多种文件系统(如Ext4、NTFS)

二、文件系统的基本组成

1. 核心数据结构

| 组件 | 描述 |
|------------------|-------------------------------------------------------------------------|
| 索引节点(inode) | 存储文件元信息(如大小、权限、数据块位置),唯一标识文件,持久化在磁盘 |
| 目录项(dentry) | 记录文件名与inode的映射关系,形成目录结构,缓存在内存以提高访问效率 |
| 超级块(Superblock) | 记录文件系统整体信息(如块大小、inode总数) |

2. 磁盘布局

磁盘被划分为以下区域:

  1. 引导块:系统启动代码
  2. 超级块:文件系统元信息
  3. 索引节点区:存储所有inode
  4. 数据块区:存储文件实际数据
  5. 位图区:记录空闲块/inode状态(0=空闲,1=占用)

三、文件实现机制

1. 文件的物理结构

| 类型 | 特点 | 优缺点 |
|------------------|-------------------------------------------------------------------------|---------------------------------------|
| 连续分配 | 文件占用连续的物理块,通过起始块号+长度定位 | ✔️顺序访问快 ✖️外部碎片严重 |
| 链式分配 | 文件块通过指针链接,支持离散存储 | ✔️无外部碎片 ✖️随机访问效率低 |
| 索引分配 | 建立索引表记录文件块位置,支持多级索引(直接/间接/双重间接指针) | ✔️支持大文件 ✖️索引表占用额外空间 |

2. 文件存储空间管理

| 方法 | 原理 | 应用场景 |
|-------------------|------------------------------------------|--------------------------|
| 空闲表法 | 维护空闲块列表,分配时顺序查找 | 简单但效率低 |
| 位图法 | 用二进制位表示块是否空闲(0/1) | 空间利用率高(如Ext4) |
| 成组链接法 | 将空闲块分组,通过栈结构管理 | UNIX系统常用 |


四、文件存取方法

1. 存取方式

| 类型 | 特点 | 适用场景 |
|-------------------|------------------------------------------|--------------------------|
| 顺序存取 | 按文件逻辑顺序依次读写 | 磁带、流媒体 |
| 直接存取 | 随机访问任意位置(通过块号定位) | 数据库文件 |
| 索引存取 | 通过关键字(如记录ID)快速定位记录 | 大型结构化文件 |

2. 性能优化技术

  • 缓存机制:将热点数据缓存在内存(如页缓存)
  • 预读取:根据局部性原理提前加载相邻数据块
  • 日志技术:记录操作日志,避免系统崩溃导致数据不一致

五、高频考点与答题要点

1. 必背概念对比

  • 硬链接 vs 软链接
    • 硬链接:多个目录项指向同一inode(inode引用计数+1)
    • 软链接:独立文件存储目标路径,类似快捷方式
  • FAT32 vs NTFS
    • FAT32:简单,最大文件4GB;NTFS:支持ACL、日志、大文件

2. 经典问题解析

  • Q1:索引节点(inode)与目录项(dentry)的区别?

    • 答:inode存储文件元信息并持久化;dentry仅缓存在内存,用于快速检索目录结构
  • Q2:如何处理大文件存储?

    • 答:采用多级索引(如双重间接指针)或范围分配(extent)
  • Q3:文件系统如何保证崩溃一致性?

    • 答:通过日志(Journaling)记录操作步骤,崩溃后按日志恢复