文件系统
功能
文件系统(File System)作为操作系统与存储设备之间的桥梁,负责数据的存储、访问、管理和保护。简单来说,文件系统主要包含以下功能:
- 数据存储与组织
- 文件系统以文件和目录的形式组织数据,将存储设备的物理空间划分为逻辑单元(如文件、文件夹),便于用户和应用程序访问与管理数据。
- 空间管理
- 通过空闲块管理(分配、回收、组织),文件系统高效利用存储空间,减少碎片,支持文件的创建、扩展和删除。常见方法包括连续分配、链接分配和索引分配。
- 数据访问与操作
- 提供标准接口(如读、写、打开、关闭)支持对文件的访问和操作,确保数据的高效检索和修改,同时支持随机访问和顺序访问。
- 数据保护和安全
- 权限管理
- 数据完整性校验
文件系统和磁盘的功能区别
文件系统和磁盘在存储管理中扮演不同角色。磁盘负责物理存储,提供固定大小的扇区(通常为512字节或4KB),作为数据读写的 最小物理单位。文件系统则在磁盘之上构建逻辑结构,负责数据的组织和管理,以 盘块(或簇) 为单位进行空间分配和操作。
盘块/簇是文件系统定义的 逻辑单位,其大小在格式化时确定(常见如4KB、8KB等),用于管理文件的存储和访问。盘块通常是扇区的整数倍,便于将逻辑操作映射到物理存储。扇区则是磁盘的物理单位,硬件层面的最小读写单位,固定且不可更改。
全局结构
如上图所示,磁盘从逻辑上分为如下部分:
- 引导区(Master Boot Sector,MBR):引导区位于磁盘的起始位置,通常是磁盘的第一个扇区。它包含引导加载程序(boot loader),用于引导操作系统。引导加载程序负责启动计算机并加载操作系统内核。
- 分区表(Partition Table):分区表通常存储在磁盘的第一个扇区之后,用于记录磁盘上的分区信息。分区表指示了磁盘上每个分区的起始位置、大小和文件系统类型。不同操作系统使用不同的分区表格式,如 MBR(Master Boot Record)和 GPT(GUID Partition Table)。
- 分区(Partition):分区中存储有文件系统,文件系统中包含元数据和数据区这两个部分。
- 元数据:
- 超级块(Superblock):包含文件系统的关键信息,在计算机启动时,超级块会被载入内存。超级块中包含的典型信息包括分区的块的数量、块的大小、空闲空间的管理方式等。
- 空闲块信息:管理磁盘中空闲块的存储数据,具体方法见下文空闲空间管理方法
- inodes:管理文件的元数据
- 数据区:文件系统的数据区存储了实际的文件数据。这是存储文件内容的地方。文件系统会将文件数据分为一个或多个块或簇,并将这些块分布在磁盘上的不同位置。文件系统的数据区通常占据了磁盘上的大部分空间。
- 元数据:
下图是一个文件系统在分区(Partition)上的存储示例,文件系统的元数据由 superblock、inode 位图区(inode bmap)、数据块位图区(data bmap)、inode 存储区(inode region)这四个部分构成。
外存空闲管理
文件存储设备(如硬盘、SSD)将存储空间划分为多个大小相同的物理块(通常为 512 字节、4KB 或更大),以块为单位进行数据的读写和交换。因此,文件系统的外存管理实质上是对这些物理块(特别是空闲块)的组织、分配与回收的管理。以下详细说明空闲块管理的关键问题和方法:
空闲表法
与文件连续分配方案中的目录保存内容类似,这里用一个表格记录连续空闲块在存储空间中的位置。
空闲链表法
使用链表数据结构,其中每个节点代表一个空闲数据块。链表的头节点存储了第一个空闲块的位置(磁盘块号),每个节点的下一个节点指向下一个空闲块。因此,整个链表由一系列相邻的空闲块组成。
位示图法
位图是一个二进制位数组,其中的每个位对应于磁盘上的一个数据块。位图中的每个位可以表示两个状态:
- 0:表示相应的数据块是空闲的,可以分配给文件。
- 1:表示相应的数据块已经被分配给文件,不再空闲。
成组链接法
成组链接法的细节比较复杂,这里仅掌握其思想即可(较小概率在选择题中考察):
与文件混合索引分配方式思路类似,用一个磁盘块 A 来存储所有的空闲盘号,如果 A 满了,就用一个新的空闲磁盘 B 来作为头结点,并且将其中的一个盘块号标记为 A 的盘块号(作为一阶间址)。
虚拟文件系统
虚拟文件系统(Virtual File System,简称 VFS)是一种操作系统内核中的抽象层设计,它为不同类型的文件系统提供了统一的接口。通过 VFS,操作系统可以屏蔽底层文件系统的具体实现细节,使上层的应用程序和系统调用能够以一致的方式访问各种存储设备和文件系统,而无需了解其底层结构。
VFS 的主要目标是提供一个标准接口,使不同类型的文件系统(如本地文件系统、网络文件系统、CD-ROM 文件系统等)能够以一致的方式与操作系统内核进行通信。这有助于增强操作系统的可扩展性和可移植性,同时使应用程序更容易编写,因为它们可以依赖统一的文件系统接口。
在 VFS 的架构下,每种文件系统通过注册相应的驱动程序或模块与 VFS 接口进行对接。当应用程序执行文件操作(如打开、读取、写入或关闭文件)时,这些请求会通过 VFS 统一调度到对应的底层文件系统,从而实现跨文件系统的透明访问。
文件系统挂载
文件系统挂载是指将一个文件系统与操作系统的目录结构关联起来,以便可以访问文件和目录。在大多数操作系统中,文件系统挂载是一种将存储设备(如硬盘分区、CD-ROM、网络共享等)上的文件系统连接到操作系统的文件树中的过程。
文件系统挂载是文件系统管理中的一个重要概念,它使操作系统能够有效地访问和管理不同类型的存储设备上的数据。通过挂载,不同文件系统可以在一个统一的文件树中协同工作,使文件和目录对用户和应用程序来说似乎是在同一个系统中。