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

操作系统,文件系统,实现,分配,方式,探析 · 浏览次数 : 146

小编点评

**虚拟文件系统(VFS)** 虚拟文件系统 (VFS) 是一个抽象的接口,它提供了一个统一的接口给用户,使他们可以访问和操作各种文件系统,无论它们是磁盘文件系统、内存文件系统还是网络文件系统。 **文件系统类型** 根据存储位置,文件系统可以分为以下三类: * **磁盘文件系统**:将数据直接存储在磁盘中,例如 Ext 2/3/4、XFS 等。 * **内存文件系统**:这类文件系统的数据存储在内存中,如 /proc 和 /sys 文件系统。 * **网络文件系统**:用于访问其他计算机主机的数据,例如 NFS、SMB 等。 **文件分配方式** 文件分配方式分为连续分配和非连续分配两种。 * **连续分配**:将文件的数据块连续地存储在磁盘上的相邻区域,类似于 Java 中的数组。 * **非连续分配**:将文件的数据块分散存储在磁盘上的不同区域,类似于 Java 中的链表。 **文件系统映射** 每个文件都会被放置在一个目录中,并有一个对应的目录结构文件,记录当前目录下的目录项和文件信息。 **虚拟文件系统(VFS)** 虚拟文件系统 (VFS) 是一个抽象的接口,它提供了一个统一的接口给用户,使他们可以访问和操作各种文件系统,无论它们是磁盘文件系统、内存文件系统还是网络文件系统。 VFS 定义了一组通用的数据结构和标准接口,使程序员无需了解具体文件系统的工作原理,只需要了解 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)作为中间层,统一了不同文件系统的接口。然后介绍了文件的物理结构,包括文件块和逻辑块之间的映射关系。接着详细讨论了连续分配方式的特点和优缺点,包括顺序访问和随机访问的效率,以及磁盘空间碎片和文件长度扩展不方便的问题。为了知识的消化理解,本章留下的问题我们下一章再详细讲下!

与操作系统中文件系统的实现和分配方式探析(上)相似的内容:

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

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

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

本文介绍了非连续空间存放方式中的两种常见形式:链式分配和索引分配。链式分配通过链表的方式实现了文件的非连续分配,其中包括了隐式链接和显式链接两种方式。隐式链接通过遍历链表来获取下一个节点的指针,适合于文件的扩展,但查找效率较低。显式链接则将指针存储在文件分配表中,提高了检索速度,但不适用于大磁盘空间。索引分配通过为每个文件创建索引数据块,实现了文件的非连续分配和直接访问。多级索引和链式索引块是处理

解密Linux中的通用块层:加速存储系统,提升系统性能

本文探讨了Linux操作系统中的通用块层和存储系统I/O软件分层的优化策略。通用块层作为文件系统和磁盘驱动之间的接口,通过排队和调度I/O请求,提高磁盘的读写效率和可靠性。存储系统的I/O软件分层包括文件系统层、通用块层和设备层,它们相互协作,实现对存储系统的高效管理和操作。本文旨在深入了解通用块层和其他I/O软件层的功能和作用,分析优化存储系统的管理和操作,提升系统性能和可靠性。

[转帖]iozone - 性能压力测试工具

《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于dd、fio、vdbench、iozone、iometer、cosbench等性能负载工具,及strace等调试工具。 1 概述 IOzone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。可以测试

[转帖]Linux 6种网络IO模型

https://www.jianshu.com/p/c5aa9197ecf4 背景 大多数文件系统的默认 IO 操作都是缓存 IO,又被称作标准IO。在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存(page cache )中,也就是说,数据会先被拷贝到操作系统

[转帖]linux系统下grub.cfg详解和实例操作

linux系统下grub.cfg详解和实例操作 简介 grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后,内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统对应的驱动,挂载根分区,从而达到启动操作系统的目的。 特殊变量

[转帖]天融信专用运维管理系统(专用计算平台版)V1.0 服务器客户端

是否国产 是 基本功能 用于专用信息设备运行状态数据的采集、分析和异常状态告警。产品包含管理端软件和客户端程序。主要功能包括:1、资产管理与状态采集:支持将用户网络中所有专用信息设备纳入资产管理,基于专用数据采集协议持续收集分析资产对象的操作系统、处理器、内存、文件系统分区、、磁盘I/O、网络接口的

[转帖]关于Linux操作系统中LUN的队列深度(queue_depth)

Linux中的queue_depth(队列深度),可以用lsscsi查看。不过今天在我的vm 虚拟机环境中(无外界存储),是没有lsscsi命令。不过,从网上,搜到了如下的信息:$ lsscsi -l[0:0:1:0] disk FUJITSU MAM3184MP 0105 /dev/sda sta

深入理解操作系统中进程与线程的区别及切换机制(下)

本文首先介绍了进程的控制结构,即进程控制块(PCB),它是表示进程的数据结构,包含了进程的相关信息和资源。PCB之间通过链表连接,形成就绪队列和阻塞队列,用于进程调度和资源管理。接着,文章详细探讨了进程的切换过程。进程切换是为了保证公平分配CPU时间片,涉及保存和恢复进程的执行上下文、更新进程状态和调度算法选择等步骤。文中还提到了进程上下文切换的场景,如时间片用完、内存不足、高优先级进程需求等。最

深入理解操作系统中进程与线程的区别及切换机制(上)

进程是正在运行的程序的实例,它可以包含一个或多个线程。我们了解了进程的执行方式,包括早期单核处理器上的顺序执行以及引入多任务概念实现的伪并行。我们还探讨了进程的状态模型。进程可以处于就绪、运行、阻塞和结束等不同的状态。就绪状态表示进程已经准备好运行,但还没有被调度执行。运行状态表示进程正在执行。阻塞状态表示进程被阻塞,需要等待某些事件的发生才能继续执行。结束状态表示进程已经完成执行。