一篇围绕文件系统章节展开的总览笔记。
在 概述 里已经把操作系统拆成了进程、内存、文件、I/O 这些大块。前面两章讨论了进程与内存,接下来进入"文件系统"这一章。
这一篇不展开文件系统的细节,而是先建立整章会反复出现的前置信息:文件系统要解决什么问题、它按什么层次组织、每一层分别承担什么职责。
导览
1. 核心问题
文件系统的核心目标是为磁盘访问提供完整的抽象与保护。具体可以拆成下面几个方面:
| 问题 | 关键对象 |
|---|---|
| 文件的定义与命名 | 文件、文件名、扩展名 |
| 文件的组织与定位 | 目录、目录项、inode |
| 逻辑地址到物理块的映射 | 分配方法(连续、链接、索引)、空闲空间管理 |
| 磁盘硬件的交互 | 磁盘结构、磁盘调度、格式化、引导块、交换空间 |
| 多进程与用户的安全共享 | 一致性语义、访问控制、RAID |
| 多种文件系统的统一访问 | VFS、文件描述符、打开文件表、POSIX API |
2. 路线图
这一章后续几篇文章的大致分工如下:
| 主题 | 对象 | 中心议题 | 对应文章 |
|---|---|---|---|
| 文件系统抽象 | 文件、目录与磁盘结构 | 文件、目录与磁盘的结构是怎样的 | 文件系统抽象 |
| 文件系统硬件 | 磁盘 | 数据在物理介质的组织,操作系统的磁盘调度 | 文件系统硬件 |
| 文件系统的保护 | 一致性、权限与 RAID | 一致性、访问权限与冗余实现 | 文件系统的保护 |
| VFS 与 POSIX | VFS 与 POSIX API | 使用统一接口访问不同文件系统 | 虚拟文件系统与文件系统POSIX API |
文件系统层次
文件系统是一组按职责分层的模块。由上到下大体可分为3层:
| 层级 | 职责 | 操作对象 |
|---|---|---|
| 逻辑文件系统 | 管理元数据,维护文件结构 | 文件控制块(FCB)、目录 |
| 文件组织模块 | 将文件的逻辑地址映射为物理地址 | 逻辑块、物理块 |
| 基本文件系统 | 向设备驱动程序发送读写物理块的命令 | 物理块号,设备驱动程序 |
应用程序不直接接触物理块或 I/O 端口。它通过逻辑文件系统暴露的路径名、文件描述符和读写接口访问数据;底层细节由文件组织模块和基本文件系统逐级消化。
1. 逻辑文件系统
逻辑文件系统管理的是用户视角下的文件与目录——文件名、路径、权限、时间戳等元数据。
它通过文件控制块(FCB,File Control Block)维护每个文件的结构信息。在 Unix 中,FCB 的核心部分就是
inode。逻辑文件系统不关心文件数据落在哪个物理块上,只关心"这个文件的 inode 里记录了什么"以及"目录如何把文件名映射到
inode"。
2. 文件组织模块
文件组织模块负责把"文件内的第 N 个逻辑字节"翻译成"磁盘上的第 M 个物理块"。它清楚文件的逻辑块与物理块之间的映射关系。
这一层的核心决策是分配方式——文件数据块在磁盘上如何排布:
| 分配方式 | 思路 | 优势 | 代价 |
|---|---|---|---|
| 连续分配 | 文件占据连续的物理块 | 访问快,计算简单 | 外部碎片,扩展困难 |
| 链接分配 | 每个数据块存放下一个块的指针 | 无外部碎片 | 随机访问慢,指针占用空间 |
| 索引分配 | 所有数据指针集中在索引块中 | 随机访问快,无外部碎片 | 索引块额外占用存储 |
具体的分配细节、变体及空闲空间管理方法属于文件系统抽象篇,本篇只建立层级概念。
3. 基本文件系统
基本文件系统位于文件组织模块之下,它不再关心"文件"这个概念,只关心"从哪个物理块号读,向哪个物理块号写"。它的主要工作是向 I/O 控制层发出对特定物理块的读写命令。
I/O 控制层再往下,就是设备驱动程序和硬件本身——磁头寻道、盘片旋转、DMA 传输都在这一层完成。这些内容将在文件系统硬件篇中展开。
章节关系
| 序号 | 文章 | 内容 |
|---|---|---|
| 3.2 | 文件系统抽象 | 文件结构、目录结构、磁盘结构与数据分配 |
| 3.3 | 文件系统硬件 | 磁盘分类、连接、调度、格式化与引导 |
| 3.4 | 文件系统的保护 | 一致性语义、访问控制、RAID |
| 3.5 | VFS 与 POSIX API | 虚拟文件系统与文件系统编程接口 |