9.1 文件系统概述
9.1.1 文件
文件是操作系统管理用户数据的基本单位,是存储在外部存储设备上的一组相关信息的集合。文件的核心特性包括:
-
逻辑性和抽象性:文件为用户提供了一种逻辑视图,与底层物理存储细节无关。用户可以通过文件名和路径轻松访问数据,而无需关心数据在磁盘中的存储方式。
-
多样性:文件可以包含各种类型的数据,包括文本、图像、音频和二进制数据等。
-
持久性:文件在设备断电或系统重启后仍然存在,确保数据的长期保存。
文件属性:
每个文件具有一组属性,用于描述文件的状态和访问权限,包括文件名、类型、大小、创建时间、最后修改时间、权限和所有者等。
文件操作:
操作系统提供一系列文件操作,包括创建、删除、读、写、重命名、复制和移动文件。这些操作由系统调用实现,如open()
、read()
和write()
等。
文件是现代计算机系统的重要组成部分,为数据存储和管理提供了基本框架。
9.1.2 文件系统
文件系统是操作系统中负责管理文件和存储设备的核心模块。它提供了一种高效、可靠的方式来组织和存取数据,同时确保数据的安全性和完整性。
文件系统的功能:
- 存储管理:管理磁盘空间的分配和回收,确保存储资源的高效利用。
- 目录管理:提供文件的组织结构(如层次目录),支持用户快速定位文件。
- 文件操作接口:通过标准系统调用提供文件访问功能。
- 数据保护:通过权限控制和加密技术保护文件数据不被未经授权的访问。
- 故障恢复:在意外断电或硬件故障时,通过日志或检查点机制恢复文件系统状态。
文件系统的类型:
不同的文件系统适用于不同的使用场景,如FAT32适用于便携设备,NTFS和ext4适用于PC,HDFS用于分布式存储。
9.1.3 文件的组织
文件在文件系统中通常以以下几种方式组织:
- 无结构文件:文件被视为字节流,如文本文件,操作系统不干涉文件内部组织。
- 结构化文件:文件包含特定格式的数据,例如数据库文件、日志文件等。
文件组织的核心结构:
- 扁平结构:所有文件存储在单一目录中,简单但不适合大规模文件管理。
- 层次结构:文件按目录树组织,支持文件的分级管理,是现代操作系统的主流方式。
- 网络结构:文件之间可存在多对多的关系,支持复杂的交叉引用。
目录结构的作用:
- 支持文件的高效查找和访问。
- 提供命名空间,避免文件名冲突。
- 支持权限管理和操作日志记录。
9.2 文件的逻辑结构和存取方法
9.2.1 文件的逻辑结构
文件的逻辑结构是文件的用户视图,反映了文件数据的逻辑组织方式,与物理存储方式无关。
逻辑结构类型:
-
流式文件:
- 文件被视为一组连续的字节流,常用于文本文件和可执行文件。
- 优点:简单灵活,易于实现。
- 缺点:不适合需要随机访问的数据。
-
记录式文件:
- 文件由多个固定长度的记录组成,每条记录包含多个字段。
- 常用于数据库和日志文件,支持快速定位和字段检索。
-
层次化文件:
- 文件数据具有树形或图形结构,适合存储复杂数据,如XML文件和文件系统元数据。
逻辑结构对文件操作的影响:
- 数据的组织方式直接影响文件的读取和写入效率。
- 流式文件适合顺序访问,而记录式文件支持高效的随机访问。
9.2.2 文件的存取方法
文件的存取方法决定了用户如何读取或写入文件数据。常见的存取方法包括:
-
顺序存取:
- 文件数据按顺序访问,适用于流式文件。
- 优点:实现简单,适合线性处理的数据。
- 缺点:不支持随机访问,大文件处理效率较低。
-
直接存取:
- 允许用户按逻辑块或记录号随机访问文件中的任意数据。
- 优点:支持高效的随机操作,常用于数据库管理系统。
- 缺点:文件系统需维护额外的索引信息。
-
索引存取:
- 为文件构建索引表,索引指向数据块的物理地址。
- 优点:结合顺序存取和直接存取的优势,适合处理大文件。
- 缺点:索引表占用额外存储空间。
-
复合存取:
- 文件数据既支持顺序存取,也支持索引存取。
- 常用于复杂应用场景,如大规模分布式存储。
存取方法的选择:
存取方法的选择取决于文件的逻辑结构和应用需求。例如,日志文件适合顺序存取,而数据库文件通常采用索引存取。优化存取方法能够显著提升文件系统的性能。
9.3 文件的物理结构
9.3.1 连续文件
连续文件是文件物理结构中最简单的一种方式。它将文件的数据存储在磁盘上的一组连续的存储块中。
特点:
- 文件存储在连续的磁盘块上,读取时无需跳跃,顺序性极强。
- 通过起始块号和文件长度即可唯一定位文件内容。
优点:
- 高效性:连续文件的读取速度快,尤其在顺序访问中,磁头无需频繁移动。
- 简单性:文件的存储和管理结构简单,便于实现。
缺点:
- 存储浪费:在存储空间碎片化严重的情况下,很难为大文件找到足够大的连续块。
- 扩展困难:文件增长需要重新分配新的连续空间,增加了存储管理的复杂性。
- 外部碎片问题:删除文件后可能产生大量小的碎片,降低存储利用率。
连续文件结构多用于早期文件系统或存储需求较低的场景,如光盘数据存储。
9.3.2 串联文件
串联文件将文件分割成若干物理块,块之间通过指针连接,形成一个链表。
特点:
- 每个文件块包含数据部分和指向下一个块的指针。
- 文件不需要存储在连续的磁盘块中,但逻辑上仍保持连续性。
优点:
- 动态性:支持文件动态增长,无需提前分配连续空间。
- 减少碎片:克服了连续文件的外部碎片问题,空间利用率更高。
缺点:
- 访问效率低:在顺序访问时需要依次读取指针,随机访问性能较差。
- 空间浪费:每个块需额外存储指针信息,导致一定的存储开销。
串联文件结构适合需要动态扩展的场景,但不适用于高性能存储需求。
9.3.3 索引文件
索引文件为每个文件建立一张索引表,索引表记录了文件逻辑块到物理块的映射关系。
特点:
- 文件的逻辑顺序由索引表决定,而数据可以分散存储在磁盘的各个位置。
- 索引表本身存储在磁盘中,访问时需先加载索引表。
优点:
- 随机访问高效:通过索引表快速定位目标数据块,适合数据库等随机存取场景。
- 灵活性强:文件块可以分布在任意位置,便于动态分配和扩展。
缺点:
- 索引开销大:索引表需要额外的存储空间,尤其是文件较大时索引表也会变大。
- 间接访问开销:访问文件时需多次磁盘I/O操作。
索引文件是现代文件系统的重要组成部分,如UNIX系统中采用的多级索引结构。
9.3.4 文件物理结构比较
连续文件、串联文件和索引文件在性能、灵活性和空间效率上各有优劣:
特性 | 连续文件 | 串联文件 | 索引文件 |
---|---|---|---|
顺序访问 | 高效 | 较高 | 高效 |
随机访问 | 高效 | 效率低 | 高效 |
存储效率 | 外部碎片多 | 指针开销大 | 索引开销大 |
扩展性 | 差 | 较好 | 好 |
管理难度 | 简单 | 较复杂 | 较复杂 |
现代文件系统中,通常结合多种物理结构以平衡性能与效率,如NTFS和ext4文件系统。
9.4 文件存储空间的管理
9.4.1 空闲文件目录
空闲文件目录是记录未使用磁盘块或存储空间的简单方法,其核心是维护一张存储块的清单。
工作原理:
- 每个磁盘块都有一个条目,记录其状态(空闲或已占用)。
- 空闲块的起始位置和数量存储在表中,便于分配和回收。
优点:
- 简单易实现:适合早期文件系统或存储需求低的场景。
- 直观管理:开发者可以直接查看空闲块分布情况。
缺点:
- 效率低:查找空闲块时需遍历整个表。
- 存储开销大:表的大小随磁盘容量线性增长,不适合大容量存储设备。
现代文件系统中,空闲文件目录已被更高效的方法取代。
9.4.2 空闲块链
空闲块链将所有空闲块链接成链表,每个块包含指向下一个空闲块的指针。
特点:
- 每次分配或回收操作只需修改链表的头部。
- 链表的头指针记录空闲链表的起始位置。
优点:
- 动态分配:无需维护大表,适合动态存储场景。
- 存储效率高:减少了表的存储开销。
缺点:
- 访问效率低:查找特定数量的连续块需要遍历链表。
- 故障风险高:链表断裂可能导致部分空闲块丢失。
9.4.3 位示图
位示图(Bitmap)利用位数组记录磁盘块的状态:1表示已占用,0表示空闲。
特点:
- 位示图按块号顺序存储,直接反映磁盘块分布情况。
- 查找空闲块通过位运算完成,效率高。
优点:
- 存储效率高:位图占用空间小,适合大容量磁盘。
- 高效查找:支持并行查找和批量分配操作。
缺点:
- 访问复杂性:需要额外算法支持高效查询。
- 实现难度较高:尤其在磁盘高度分区的情况下。
现代文件系统广泛采用位示图,如ext4和NTFS均使用此方法管理空闲空间。
9.4.4 分配策略
分配策略决定了空闲块的选择规则,影响文件系统性能和存储利用率。
-
首次适配:从空闲块链的头部开始分配第一个满足要求的块。
- 优点:简单快速。
- 缺点:可能导致低效存储分布。
-
最佳适配:寻找最适合文件大小的空闲块。
- 优点:减少外部碎片。
- 缺点:查找时间较长。
-
最差适配:选择最大空闲块分配文件。
- 优点:避免过度分割大块空闲空间。
- 缺点:易产生碎片。
分配策略需根据实际场景权衡选择。
9.5 文件目录
9.5.1 文件目录及其内容
文件目录是文件系统中存储文件信息的数据结构,主要用于组织和管理文件。目录记录了文件的名称、存储位置、属性、权限等元数据。
目录的功能与内容:
- 文件标识:通过文件名唯一标识文件,支持用户快速定位目标文件。
- 文件属性:记录文件大小、创建时间、修改时间、类型等元信息。
- 存储位置:保存文件的物理存储地址或指向存储块的指针。
- 权限控制:包含文件的访问权限和用户权限信息。
- 文件关系:在多级目录中,维护父子目录之间的层级关系。
文件目录的实现方式:
- 顺序存储:将文件目录以列表形式存储,查找时需遍历整个列表,效率低。
- 哈希存储:通过哈希算法加速查找,但冲突处理复杂。
- 树状结构:多级目录通常采用树状结构,支持层级化管理,便于扩展和查找。
文件目录是文件系统的核心组件,其设计直接影响系统性能与可用性。
9.5.2 单级文件目录及缺点
单级文件目录是文件系统中最简单的目录结构,所有文件共享一个全局目录。
工作原理:
- 所有文件存储在一个目录中,目录中的条目以平铺方式组织。
- 每个条目包含文件名、属性和存储地址等信息。
优点:
- 简单易实现:结构直观,适合早期计算机系统或小型系统。
- 访问效率高:文件数量较少时,查找文件相对快速。
缺点:
- 文件命名冲突:所有文件共享同一命名空间,不同用户的文件可能重名。
- 缺乏层次化管理:难以分类存储,文件数量增加后管理混乱。
- 扩展性差:不适合大规模文件存储,文件数量增加会显著降低查找效率。
单级目录已基本被淘汰,仅在简单嵌入式系统中使用。现代文件系统普遍采用多级目录结构以解决上述问题。
9.5.3 多级文件目录
多级文件目录通过树状结构组织文件,支持嵌套子目录。根目录是树的顶层节点,子目录和文件作为子节点存储。
多级目录的特点:
- 分层管理:文件和目录按照层级组织,便于分类和查找。
- 独立命名空间:不同目录中的文件可以重名。
- 灵活扩展:支持任意深度的目录层级,适应大规模文件存储需求。
优点:
- 易于管理:通过目录分类,用户可以高效地组织和访问文件。
- 提高查找效率:文件路径名指明文件所在位置,减少遍历时间。
- 增强安全性:权限控制可以针对目录或文件单独设置,提高安全性。
缺点:
- 复杂性增加:实现和维护成本较高,特别是需要记录目录间的关系。
- 路径解析开销:访问深层目录文件时,需逐级解析路径,增加时间开销。
多级文件目录是现代文件系统的基础,如Windows的NTFS和Linux的ext4均采用此结构。
9.6 共享与安全
9.6.1 文件共享与安全性的关系
文件共享是指多个用户或进程同时访问同一文件的功能,而文件安全性则是确保共享文件在访问过程中不被未授权用户篡改或泄露。共享与安全性之间存在相辅相成的关系:
共享的挑战:
- 数据一致性:多个用户同时修改文件可能导致冲突,需机制确保一致性。
- 权限控制:需严格限制不同用户对文件的访问级别,防止误用。
安全性的保障措施:
- 访问控制:通过权限设置明确谁可以读取、写入或执行文件。
- 身份验证:确保文件仅被授权用户访问,例如密码保护或多因素验证。
- 日志记录:记录文件访问和操作历史,便于审计和追踪问题。
文件共享的设计需在便捷性和安全性之间取得平衡。例如,现代系统采用访问控制列表(ACL)和角色权限模型实现精细化控制。
9.6.2 存取权限的类型及其验证
文件存取权限决定了用户对文件的操作范围,常见权限类型包括:
- 读取权限:允许用户查看文件内容,但不能修改。
- 写入权限:允许用户修改文件内容或追加数据。
- 执行权限:允许用户运行文件(如脚本或程序)。
权限验证流程:
- 身份验证:通过用户名和密码或其他方式确认用户身份。
- 权限检查:系统根据文件的权限设置和用户身份,判断是否允许操作。
- 操作记录:将验证结果和操作记录到日志中,便于后续审查。
在Linux系统中,文件权限通常以rwx(读、写、执行)形式表示,并分为所有者、组和其他用户三种角色。
9.6.3 用文件路径名加快文件的查找
文件路径名是指从根目录到目标文件的完整路径,它可以分为绝对路径和相对路径两种。
路径名的作用:
- 唯一性:路径名可以唯一标识文件,避免同名冲突。
- 快速查找:通过路径直接定位目标目录和文件,无需全盘搜索。
实现机制:
- 目录缓存:常用目录信息存储在缓存中,加速路径解析。
- 路径优化:通过压缩冗余路径(如消除“…”或“.”)减少解析开销。
- 索引加速:现代文件系统中使用B树等数据结构组织目录,加快查找速度。
路径名的高效设计是提升文件系统性能的重要手段。Linux系统的路径解析和缓存机制显著提升了多级目录的访问效率。
9.7 文件操作与文件备份
9.7.1 文件操作
文件操作是文件系统的核心功能,用于管理文件的创建、读取、修改、删除等行为。文件操作一般通过系统调用接口提供,支持用户程序和文件系统的交互。
常见文件操作:
- 创建文件:分配必要的存储空间,并在目录中记录文件信息。
- 打开文件:建立文件描述符,将文件加载到内存,为后续操作做好准备。
- 读取文件:根据文件的存储位置和访问权限,将数据从磁盘读取到内存。
- 写入文件:将数据写入文件,同时更新文件的元信息(如大小、修改时间)。
- 关闭文件:释放文件描述符,更新文件的状态信息并写回存储设备。
- 删除文件:从目录中移除文件记录,并回收存储空间。
高级操作:包括文件锁定(防止数据冲突)、文件重命名和复制等,旨在满足复杂的应用场景需求。
文件操作的高效性直接影响用户体验,现代文件系统通过缓存、日志等技术加速文件操作并提高数据可靠性。
9.7.2 文件备份
文件备份是指将文件或目录的副本存储到其他介质中,用于数据恢复和长期保存。
备份的重要性:
- 防止数据丢失:应对硬件故障、人为错误和恶意攻击等风险。
- 版本控制:保留文件的历史版本,便于回滚到特定时间点。
- 灾难恢复:在系统崩溃或灾害发生后快速恢复关键数据。
备份类型:
- 完全备份:复制整个文件系统或选定目录,确保完整性,但占用大量存储空间。
- 增量备份:仅备份自上次备份以来发生变化的文件,节省空间但恢复时需多次合并。
- 差异备份:备份自上次完全备份以来的变化文件,平衡了时间和空间开销。
备份工具:现代操作系统提供如rsync
、tar
、cpio
等工具支持文件备份,同时也支持云备份和版本化存储。
备份策略:需要综合考虑存储介质(如磁盘、云存储)、备份频率和数据的重要性,制定科学的计划以提高备份效率和可靠性。
9.8 UNIX文件系统的主要结构及实现
9.8.1 UNIX文件系统的特点
UNIX文件系统(UFS)是经典文件系统,设计时以高效性、可移植性和可靠性为目标,支持多用户和多任务操作环境。
主要特点:
- 树形目录结构:采用多级目录组织文件,支持复杂的文件分类与管理。
- 文件设备一体化:设备文件与普通文件统一管理,使得I/O操作更加简洁。
- 索引节点(inode)结构:通过inode存储文件的元信息和数据块位置,分离元数据与实际数据存储。
- 分层存储:结合缓存和磁盘存储,平衡访问速度与存储容量。
- 多种权限控制:支持三种角色(所有者、组、其他)和三种权限(读、写、执行)。
UNIX文件系统的设计影响了许多后续文件系统,如Linux的ext系列和Solaris的ZFS等。
9.8.2 UNIX系统的索引文件结构
索引节点(inode)是UNIX文件系统的核心,用于存储文件的元信息和数据块的地址。
inode内容:
- 文件元信息:如文件大小、类型、权限、所有者、时间戳等。
- 数据块地址:记录文件在磁盘上的实际存储位置,包括直接块、间接块和多级间接块。
索引节点的作用:
- inode与文件名分离,目录中仅存储文件名和inode编号,减少文件名查找开销。
- 支持大文件存储,通过多级间接块解决地址空间不足的问题。
inode的分配和管理直接影响文件系统性能,现代UNIX系统对inode表进行了优化以支持更大规模的文件系统。
9.8.3 UNIX系统文件目录结构
UNIX系统采用多级目录结构,根目录(/)作为最高层次,子目录和文件以树状形式组织。
目录项内容:
- 文件名:唯一标识文件或目录。
- inode编号:指向文件的inode,间接关联文件的实际数据。
目录操作:支持文件的创建、删除、移动和重命名,路径解析则通过逐级搜索完成。
多级目录结构提供了强大的组织能力,便于用户管理大量文件,同时支持灵活的权限控制机制。
9.8.4 UNIX系统的打开文件机构
UNIX系统采用分层的打开文件管理机制,包括用户层、内核层和文件系统层:
- 文件描述符:用户层提供的整数标识符,用于访问打开的文件。
- 文件表:内核层维护每个进程的打开文件信息,包括文件描述符与inode的映射关系。
- 系统文件表:记录系统范围内的所有打开文件,包括引用计数和文件位置指针。
这种分层机制减少了文件操作的冗余,支持多进程共享文件的高效操作。
9.8.5 文件存储器空闲块的管理
UNIX系统采用多种技术管理存储器空闲块:
- 空闲块链:通过链表结构记录空闲块,插入和删除操作简单,但访问速度较慢。
- 位图:使用位图标记空闲块状态,支持快速查找和分配,但需要额外存储空间。
优劣权衡:空闲块链适用于小型文件系统,而位图适用于大规模文件系统。UNIX系统通常结合两者,以兼顾性能和效率。
9.8.6 UNIX文件系统调用
UNIX文件系统提供丰富的系统调用支持文件操作,常用调用包括:
- 文件创建与删除:
creat()
、unlink()
等。 - 文件读写操作:
read()
、write()
,结合缓冲机制提高效率。 - 文件属性管理:
chmod()
、chown()
、stat()
等。 - 文件描述符操作:
open()
、close()
等。
系统调用以简单统一的接口实现复杂功能,确保用户能够高效地操作文件系统。
9.9 Linux文件系统
9.9.1 虚拟文件系统VFS(Virtual File System)概述
虚拟文件系统(VFS)是Linux内核中用于支持多种文件系统的抽象层。它提供统一的接口,使得用户无需关心底层文件系统的具体实现,从而实现了对多种文件系统的透明访问。
VFS的功能:
- 抽象化接口:提供标准的系统调用接口,如
open()
、read()
、write()
,屏蔽底层实现差异。 - 支持多文件系统:包括Ext系列、NTFS、FAT、XFS等,通过VFS可实现对不同文件系统的统一管理。
- 跨平台支持:通过标准化接口,VFS简化了文件系统的移植和扩展。
工作原理:VFS将文件系统的操作分为高层与低层两部分。高层负责处理用户发起的文件操作请求,低层根据具体文件系统类型执行实际操作。VFS通过挂载点将不同文件系统整合到一个统一的文件树中。
VFS的设计是Linux文件系统的核心,使得操作系统能够同时支持多种文件系统并有效管理文件存储。
9.9.2 VFS通用文件系统模型与VFS对象
VFS通用文件系统模型由四类核心对象组成:超级块对象、inode对象、目录项对象和文件对象。
VFS对象:
- 超级块对象(superblock):表示文件系统的全局信息,包括文件系统类型、块大小、总容量等。
- inode对象:表示文件的元数据,包括文件类型、大小、权限、所有者等。
- 目录项对象(dentry):表示目录项信息,用于加速文件路径解析。
- 文件对象(file):表示已打开文件的状态信息,如文件偏移量、访问模式等。
模型工作流程:
- 当用户通过路径访问文件时,VFS首先通过目录项对象找到对应的inode对象,进而根据inode定位文件数据块。
- 文件对象记录打开文件的上下文,超级块对象则提供与整个文件系统相关的信息。
这种对象模型确保了文件操作的高效性,同时简化了文件系统的扩展和管理。
9.9.3 与进程相关的数据结构
VFS与进程的交互依赖一系列内核数据结构,包括文件描述符表、打开文件表和目录项缓存等。
- 文件描述符表:每个进程维护一个文件描述符表,用于记录打开文件的文件描述符和对应的文件对象指针。
- 打开文件表:内核全局维护,记录所有进程已打开文件的文件对象,支持文件的共享和多进程访问。
- 当前工作目录:每个进程都保存当前工作目录的信息,方便相对路径的解析。
这些数据结构使得VFS能够高效处理进程发起的文件操作请求,并确保不同进程间的文件操作相互独立。
9.9.4 VFS系统调用的实现
VFS通过一组通用系统调用接口处理文件操作。这些系统调用包括:
- 文件创建和删除:如
open()
、creat()
、unlink()
等。 - 文件读写:如
read()
、write()
,通过文件对象更新偏移量并访问底层文件系统。 - 文件属性管理:如
chmod()
、stat()
,通过inode对象读取和更新文件元信息。
系统调用的执行流程包括:
- 用户空间请求通过陷入内核传递到VFS层。
- VFS根据操作类型调用对应的底层文件系统接口完成实际操作。
这种设计提供了文件操作的高效性和通用性,同时便于对文件系统进行扩展和维护。
9.9.5 Ext2文件系统概述
Ext2(第二扩展文件系统)是Linux早期广泛使用的文件系统,以其简单、高效和稳定著称。
主要特点:
- 支持大文件和大分区:最多支持2TB的分区和16GB的单文件。
- 静态分配inode:在创建文件系统时预分配inode数量,提高访问效率但限制了inode总数。
- 文件类型标识:支持普通文件、目录、符号链接、设备文件等多种类型。
- 高效性:通过块组机制减少文件碎片,提高磁盘访问速度。
Ext2的设计为后续文件系统(如Ext3、Ext4)提供了重要的基础。
9.9.6 Ext2磁盘数据结构
Ext2文件系统的磁盘数据结构包括:
- 引导块:存储启动信息,位于文件系统的第一个块。
- 超级块:存储文件系统的元信息,如总块数、块大小、空闲块数等。
- 块组描述符表:记录每个块组的元信息,包括空闲块、inode等。
- 块位图和inode位图:用于标记块和inode的分配状态。
- inode表:存储文件的inode结构信息。
- 数据块:存储文件的实际数据。
这些结构共同组成了Ext2的文件存储模型,使得文件系统具有较高的性能和可靠性。
9.9.7 Ext2磁盘空间的管理
Ext2通过块组机制和位图实现磁盘空间的高效管理。
- 块组:将磁盘划分为若干块组,每个块组包含超级块副本、位图、inode表和数据块。块组的设计减少了文件碎片并提高访问效率。
- 位图分配:块位图和inode位图标记磁盘块和inode的使用状态,支持快速分配和回收操作。
- 预分配策略:在文件增长时,预先分配连续的块,进一步优化文件访问性能。
这种分层次的管理方式既提高了文件系统的性能,又便于维护和扩展。
9.9.8 Ext2主存数据结构
Ext2的主存数据结构主要用于缓存磁盘数据,以减少I/O操作并提高访问速度。
- 超级块结构:在内存中保存磁盘超级块的副本,供内核快速访问文件系统元信息。
- inode结构:将磁盘inode加载到内存,加快文件元信息的读取和更新。
- 目录项缓存:缓存常用的目录项,加速路径解析操作。
- 数据块缓存:通过页面缓存存储文件数据块,减少磁盘读写操作。
主存数据结构与磁盘数据结构密切配合,共同实现了文件系统的高效运行。