操作系统中文件系统的实现和分配方式探析(上)

简介: 本文主要讨论了操作系统中文件系统的实现和分配方式。首先介绍了虚拟文件系统(VFS)作为中间层,统一了不同文件系统的接口。然后介绍了文件的物理结构,包括文件块和逻辑块之间的映射关系。接着详细讨论了连续分配方式的特点和优缺点,包括顺序访问和随机访问的效率,以及磁盘空间碎片和文件长度扩展不方便的问题。最后提到了非连续分配方式来解决连续分配方式的问题,并留下了下次讨论的悬念。文件系统的实现和分配方式对于操作系统的性能和可靠性都有重要影响,因此深入理解和研究文件系统的原理和机制是非常有价值的。

虚拟文件系统

在 Linux 文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间存在着紧密的关系。 如下图:

image

在操作系统中,文件系统起到了重要的作用,它们负责管理操作系统中的文件和目录。然而,不同的文件系统有着不同的实现方式和存储位置。为了提供一个统一的接口给用户,操作系统引入了虚拟文件系统(Virtual File System,VFS)作为中间层。

VFS 定义了一组通用的数据结构和标准接口,使得程序员无需了解具体文件系统的工作原理,只需要了解 VFS 提供的接口即可进行文件操作,其实连提供的接口各种编程语言都替我们封装好了,只需要调用一些方法就完事了。

Linux 支持多种文件系统,根据存储位置的不同,可以将文件系统分为三类。

  1. 磁盘的文件系统,它将数据直接存储在磁盘中,例如 Ext 2/3/4、XFS 等。
  2. 内存的文件系统,这类文件系统的数据存储在内存中,如 /proc 和 /sys 文件系统,读写这些文件实际上是读写内核中相关的数据。
  3. 网络的文件系统,用于访问其他计算机主机的数据,例如 NFS、SMB 等。

为了正常使用文件系统,首先需要将其挂载到某个目录上。例如,在 Linux 系统启动时,会将文件系统挂载到根目录,从而使文件系统可用。

文件的物理结构

操作系统负责管理磁盘中的数据,并将其呈现为易读的形式,使我们不需要关心数据的具体存放位置及其存储方式。操作系统背后的机制将数据存储在磁盘上,以便我们可以方便地访问和操作。

在操作系统的辅助下,我们看下文件的物理结构是如何在磁盘中存储的。

文件块

我们知道,物理磁盘上存储的最小单位是扇区,通常为512字节。这意味着即使一个数据不足512字节,它仍然会占用512字节的磁盘空间。然而,由于扇区的大小较小,会导致读写效率降低。

为了方便管理和访问文件,操作系统引入了逻辑块的概念。几乎所有的文件系统都会将文件分割成固定大小的块来存储,前面我们说过通常一个块的大小为4KB。如果磁盘的扇区大小为512字节,而文件系统的块大小为4KB,那么文件系统的存储单元就是8个扇区。这也解释了为什么文件的大小和占用空间之间存在差异。文件的大小指的是文件本身的实际大小,但并不一定等于占用的空间大小。因为不管文件的大小是否达到4KB,只要有数据,都会分配给它一个块进行存储。

需要注意的是,在Windows的NTFS文件系统中,如果写入的数据很小,小于1KB,它将被存储在文件表中,而不是以4KB为单位的块中。但一旦数据超过1KB,将会分配4KB的存储空间。

内存管理也采用类似的逻辑块的概念。文件的逻辑地址也被分为一块块的文件块,逻辑地址由逻辑块号和块内地址组成。用户通过逻辑地址来操作文件,而操作系统负责完成逻辑地址与物理地址的映射,以实现对文件的访问和操作。

image

文件分配方式

文件分配方式大致可以分为连续分配和非连续分配两种。连续分配是指将文件的数据块连续地存储在磁盘上的相邻区域,类似于Java中的数组。非连续分配则是将文件的数据块分散存储在磁盘上的不同区域,类似于Java中的链表。

连续分配

这种分配方式可以提高访问速度,因为文件的块是连续存储的,所以在访问文件时不需要进行磁头的来回移动,可以直接顺序访问。这种顺序访问的特性使得连续分配适用于访问模式较为顺序的文件,比如视频文件或音乐文件。

image

那么操作系统如何完成逻辑块与物理块之间的映射呢?

在实际情况中,每个文件都会被放置在一个目录中,无论是最外层的根目录还是用户自己创建的目录,都会有一个对应的目录结构文件,它记录了当前目录下的目录项和文件信息。如图所示:

image

具体来说,操作系统通过逻辑块号和块内地址的映射关系来实现逻辑块与物理块之间的对应关系,即(逻辑块号,块内地址)-> (物理块号,块内地址)。对于用户访问一个文件的内容,操作系统会通过文件的标识符找到对应的目录项,并通过逻辑块号计算出物理块号,即物理块号 = 起始块号 + 逻辑块号。由于可以根据逻辑块号直接计算出物理块号,所以连续分配方式支持顺序访问和随机访问。

连续分配方式在读写文件时效率较高,因为文件的磁盘块是相邻的,减少了移动磁头的时间。这也是为什么一些中间件或数据库在写文件时采用顺序写的机制,以提高处理速度。

连续空间存放的方式虽然读写效率高,但是缺点也很明显,有「磁盘空间碎片」和「文件长度不易扩展」的缺陷。

然而,连续分配方式也存在明显的缺点,主要是磁盘空间碎片和文件长度不易扩展。当一个文件被删除时,会留下一块空缺,如果新文件的大小小于该空缺的大小,可以将其放置在空缺中。但如果新文件的大小大于所有空缺的总大小,即使磁盘上有足够的空闲空间,也无法存放该文件。在这种情况下,我们可以通过移动已有文件来腾出空间以容纳新文件,但是磁盘上的文件移动是非常耗时的,因此这种方式并不太实际。

image

另一个问题是文件长度扩展不方便。例如,在上述图示中,如果文件A需要扩大,就需要更多的磁盘空间。然而,唯一的办法就是通过移动文件来腾出足够的空间,而这种方式的效率非常低下。

那么有没有更好的方式来解决上面的问题呢?确实,为了解决连续分配方式的问题,可以采用非连续空间存放方式,如链式存储、索引存储和组织表等方式。这些方式可以克服连续分配方式的空间碎片和文件长度扩展不方便的问题。那这种非连续的分配方式我们下回讲解!

总结

本文主要讨论了操作系统中文件系统的实现和分配方式。首先介绍了虚拟文件系统(VFS)作为中间层,统一了不同文件系统的接口。然后介绍了文件的物理结构,包括文件块和逻辑块之间的映射关系。接着详细讨论了连续分配方式的特点和优缺点,包括顺序访问和随机访问的效率,以及磁盘空间碎片和文件长度扩展不方便的问题。为了知识的消化理解,本章留下的问题我们下一章再详细讲下!

相关文章
|
2月前
|
存储 算法 安全
操作系统之文件系统的奥秘
【9月更文挑战第19天】本文将深入探索操作系统中不可或缺的组件——文件系统,揭示其工作原理与实现细节。我们将通过浅显的语言和生动的比喻,一步步解析文件系统如何组织数据、管理存储空间,并确保数据的完整性和安全性。文章不仅适合初学者构建基础概念,也能帮助有经验的开发者更深入地理解文件系统的高级特性。
|
7天前
|
存储 安全 大数据
深入浅出操作系统:文件系统的秘密
【10月更文挑战第35天】本文将揭示文件系统背后的奥秘,从其基本概念到复杂的实现机制。我们将一起探索文件系统的结构和原理,并了解它如何影响我们的日常计算体验。通过简单的例子和比喻,文章旨在使读者对文件系统有一个清晰而深刻的理解,就像甘地所言:“你必须成为你希望在世界上看到的改变。”让我们一起成为理解操作系统的先行者。
|
5月前
|
存储 Linux 数据处理
探索Linux操作系统的内核与文件系统
本文深入探讨了Linux操作系统的核心组件,包括其独特的内核结构和灵活的文件系统。文章首先概述了Linux内核的主要功能和架构,接着详细分析了文件系统的工作原理以及它如何支持数据存储和检索。通过比较不同的文件系统类型,本文旨在为读者提供一个关于如何根据特定需求选择合适文件系统的参考框架。
|
2月前
|
存储 缓存 文件存储
探索操作系统中的文件系统管理
【9月更文挑战第25天】在数字世界的海洋中,操作系统是指引我们航行的灯塔。它不仅管理着硬件资源,还维护着软件的秩序。本文将深入探讨操作系统中一个至关重要的部分——文件系统管理。我们将从基础概念出发,逐步深入到文件系统的设计与实现,最后通过代码示例来直观展示文件系统的操作。让我们一起揭开文件系统管理的神秘面纱,理解其背后的逻辑与奥秘。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
45 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
54 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
3月前
|
存储 算法 Unix
OS—文件系统
OS—文件系统
52 0
|
4月前
|
存储 缓存 固态存储
Linux操作系统之文件系统详解
Linux操作系统之文件系统详解
|
6月前
|
存储 缓存 安全
操作系统(14)----文件系统的结构
操作系统(14)----文件系统的结构
127 1

热门文章

最新文章