[架构之路-232]:目标系统 - 纵向分层 - 操作系统 - 数据存储:文件系统存储方法汇总

目录

前言:

一、文件系统存储方法基本原理和常见应用案例:

二、Windows FAT文件系统

2.1 概述

三、Linux EXT文件系统

3.1 基本原理

3.2 索引节点表(Inode Table)

3.2.1 索引节点表层次结构

3.2.2 间接索引表的大小和表项个数

四、NFS文件系统


前言:

为了在以块为基本单位的硬盘上,管理和存储数据长度不定长的文件,且能够实现不连续存储(在硬盘上连续存储数据的要求抬高了,硬盘上很难保证有连续大块的存储空间),操作系统想了很多的办法,采用了很多算法和数据结构来达成此目的。

一、文件系统存储方法基本原理和常见应用案例:

操作系统的文件系统:解决的是数据数据在内存和硬盘中进行映射的方法。

下面将详细介绍每种存储方法的基本原理和常见应用案例:

  1. 随机存取存储(Random Access Storage):

    • 基本原理:随机存取存储方法将文件数据划分为块或扇区,并使用磁盘寻址技术实现对这些块的随机访问。每个块都有一个唯一的地址,可以通过地址直接访问块内的数据。
    • 应用案例:Windows操作系统中常用的NTFS文件系统采用了随机存取存储方法。NTFS通过索引节点表(MFT)来管理文件,使用簇(Cluster)作为数据存储的基本单位,支持高效的随机读写和快速定位。
  2. 连续存储(Contiguous Storage)://不常见,早期文件系统

    • 基本原理:连续存储方法将文件的数据连续地存储在磁盘上。文件在存储时被分配一段连续的物理空间,数据块按照顺序存储,形成一个连续的数据区域
    • 应用案例:早期的FAT文件系统和一些嵌入式设备常使用连续存储方法。这种方法对于传输速度要求较高的应用场景非常适用,例如音频和视频的播放器,因为可以连续读取文件数据以提供流畅的播放体验
  3. 链接表存储(Linked List Storage):

    • 基本原理:链接表存储方法使用链表结构来记录文件数据的存储位置。每个链表节点包含一部分文件数据和指向下一个节点的指针,通过遍历链表可以读取整个文件的数据。
    • 应用案例:许多UNIX和类UNIX系统使用的文件系统,如EXT系列(如EXT2、EXT3、EXT4)和XFS,采用了链接表存储方法。这种方法可以高效地管理不连续的文件存储,适用于支持大文件和灵活的文件分配的场景
  4. 文件分配表存储(File Allocation Table Storage):

    • 基本原理:文件分配表存储方法通过维护一个文件分配表(FAT)来记录磁盘上每个块的使用情况和链表关系。FAT表中的每个表项对应一个块,记录了该块的使用状态和下一个块的地址。
    • 应用案例:早期的FAT文件系统(如FAT16、FAT32)以及一些嵌入式设备中使用了文件分配表存储方法。这种方法简单且易于实现,适用于存储容量较小、对性能要求不高的应用场景。
  5. 索引节点存储(Indexed Node Storage):

    • 基本原理:索引节点存储方法使用索引节点(inode)来记录文件和目录的元数据,包括文件属性和数据的物理存储位置。通过索引节点,文件系统可以快速定位和访问文件的数据。
    • 应用案例:常见的UNIX和类UNIX系统(如Linux、Mac OS)所使用的文件系统,如EXT2/EXT3/EXT4、HFS+,采用了索引节点存储方法。索引节点结构允许快速访问和管理文件,适用于大型文件系统和复杂的数据结构
  6. 日志结构存储(Log-structured Storage):

    • 基本原理:日志结构存储方法通过将文件的修改操作以日志的形式记录下来,并按时间顺序追加到日志区域中。重放日志可以恢复文件系统的状态,实现高度的数据一致性和恢复能力。
    • 应用案例:ZFS(Zettabyte File System)是一种常见的日志结构存储的文件系统,在大规模存储和高可靠性要求的场景下被广泛使用。ZFS使用了写时复制(Copy-on-Write)技术和数据校验来保证数据的完整性和可靠性。

这些文件系统存储方法的应用案例说明了不同存储方法的特点和适用场景。根据需求和应用场景的不同,选择合适的存储方法对于文件系统的性能、可靠性和效率非常重要。

二、Windows FAT文件系统

2.1 概述

FAT(File Allocation Table)文件系统是一种使用在许多操作系统中的文件系统,如Windows中的FAT16、FAT32以及有些可移动存储设备和嵌入式系统中的FAT12。

以下是FAT文件系统的原理和数据结构的简要说明:

  1. 分区和引导扇区:FAT文件系统以分区的形式存在于存储设备上,每个分区的开头有一个引导扇区(Boot Sector),包含分区的基本信息和引导代码

  2. 文件分配表(FAT):FAT文件系统的核心是文件分配表(File Allocation Table),它是一个表格,用于记录文件在存储设备上的分配情况。每个表项记录着磁盘上的一个簇(Cluster)的状态,标识它的使用情况。

  3. 簇:FAT文件系统将存储设备分为一个个固定大小的簇(Cluster),每个簇由连续的扇区组成。FAT通过簇号来标识文件的存储位置,而不是直接使用物理磁盘块号

  4. 目录项:FAT文件系统使用目录项(Directory Entry)来存储文件和目录的元数据,包括文件名、扩展名、属性、起始簇号等等。目录项以目录的形式组织,每个目录的起始位置都有一个特殊的目录项(根目录项)作为入口。

  5. 文件分配:文件在FAT文件系统中分配的方式是通过在FAT表中标记簇的使用情况。文件的第一个簇号存储在目录项中,然后通过在FAT表中依次查找下一个簇号来确定文件的完整存储位置。

  6. 空闲空间管理:FAT文件系统通过在FAT表中标记空闲簇来管理可用空间。标记为“未使用”的表项表示该簇是可用的,标记为“已使用”的表项表示该簇已被分配给文件或目录。

这些是FAT文件系统的基本原理和数据结构。通过使用FAT表来跟踪和管理文件的存储位置,FAT文件系统能够支持文件的读取、写入和删除。不同版本的FAT文件系统(如FAT12、FAT16和FAT32)在文件分配表的结构和大小、簇大小等方面略有差异,但基本原理是相似的。

三、Linux EXT文件系统

3.1 基本原理

Linux EXT(Extended File System)文件系统的基本原理和数据结构是构建在磁盘块、索引节点(inode)和数据块上的。下面是关于EXT文件系统的基本原理和数据结构的简要说明:

  1. 基本原理:EXT文件系统是一个层次化的文件系统,通过块设备(如硬盘)来存储文件和目录。它将磁盘分为若干个块组(Block Group),每个块组包含了文件系统的关键组件:超级块组描述符表索引节点表数据块。其中最重要的是索引节点表。

  2. 超级块(Superblock):每个EXT文件系统都有一个超级块,存储文件系统的整体信息,如块设备的大小、块组数量、inode数量等等。它提供了文件系统的整体结构和配置信息。

  3. 组描述符表(Group Descriptor Table):组描述符表存储了每个块组的元数据信息,如空闲块数量、inode数量、位图地址等。它提供了块组级别的信息,帮助系统定位和管理块组。

  4. 索引节点表(Inode Table):EXT文件系统使用索引节点(inode)来记录文件的元数据信息,如文件大小、权限和时间戳等。每个文件和目录都有一个唯一的inode编号,通过inode可以快速地找到文件的元数据信息。

  5. 数据块(Data Block):数据块是用于存储文件的实际内容的区域。EXT文件系统使用不同大小的数据块,如4KB、8KB等,具体的块大小取决于文件系统的配置。文件的数据块通过inode中的指针链表来引用。

  6. 索引节点之间的关系:索引节点之间的关系是通过指针链表来建立的。一个索引节点中包含一组指针,指向数据块或其他索引节点。具体的指针链表结构有三级间接指针、二级间接指针和一级间接指针

EXT文件系统的数据结构使得系统可以高效地管理文件和目录,快速定位和读取文件的元数据和内容。同时,EXT文件系统还实现了一些高级特性,如日志功能(journaling)以提高文件系统的可靠性和恢复能力,以及扩展属性(extended attributes)等。

需要注意的是,EXT文件系统是在Linux平台上使用的,而其他操作系统可能使用不同的文件系统。因此,在跨平台使用时应注意文件系统的兼容性和可能存在的差异。

3.2 索引节点表(Inode Table)

3.2.1 索引节点表层次结构

索引节点表(Inode Table)是文件系统中的一个重要的数据结构,用于存储文件和目录的元数据信息。索引节点表的内容和层次结构如下:

  1. 索引节点(Inode):索引节点表中的每个条目对应一个文件或目录的数据,称为索引节点。每个索引节点包含了文件或目录的元数据信息和指向数据块的指针。

  2. 文件或目录的属性:每个索引节点记录了与文件或目录相关的属性,如文件大小、所有者和所属组、访问权限、时间戳(创建、修改、访问时间)等。

  3. 文件类型和权限:索引节点中存储的文件类型信息可以标识文件是普通文件、目录、符号链接等。同时,索引节点还记录了与文件或目录相关的权限信息,如读、写和执行权限。

  4. 数据块的指针/索引:索引节点中包含了指向文件数据块指针,用于快速定位和读取文件的实际内容指针的数量和类型取决于文件的大小

    a. 直接指针/索引:索引节点中通常包含一些(如N个)直接指向文件数据块的指针。例如,对于小文件,索引节点可能直接指向文件的数据块。N个直接索引指向的数据块的大小为N * BlockSize,如BlockSize=4K字节。

    b. 一级间接指针:对于较大的文件,索引节点可能包含一个一级间接指针,指向一个数据块,该数据块存储了更多的指针或索引,被称为一级间接索引块索引块的大小是操作系统指定的,通常与数据块的大小相同,如4K。一个间接所有指向的数据块的个数为4K/4Bye=1K个数据块,则指向的数据块的大小= 4K/4 *  4K = 1K * 4K = 4M, 即一个间接块使得数据块的大小扩展了1K倍数 =》4M字节。

    c. 二级间接指针:对于更大的文件,索引节点可能包含一个二级间接指针,指向一个二级索引块,该数据块存储了更多的一级间接指针,被称为二级间接索引块索引块的大小是操作系统指定的,通常与数据块的大小相同,如4K或1K。 一个二级块在一级块的基础之上又扩展了1K倍数,   每个二级间接指针代表的数据块的大小为:1K * 1K * 4K = 4G字节。

    d. 三级间接指针:对于非常大的文件,索引节点可能包含一个三级间接指针,指向一个数据块,该数据块存储了更多的二级间接指针索引块,被称为三级间接索引块索引块的大小是操作系统指定的,通常与数据块的大小相同,如4K。 一个三级块在二级块的基础之上又扩展了1K倍数,   每个二级间接指针代表的数据块的大小为:1K * 1K * 1K * 4K = 4T字节。

        通过索引节点表,文件系统可以按照层次结构组织和管理文件和目录的元数据信息。每个文件或目录对应一个索引节点,而索引节点中的指针链表(直接指针、间接指针和双重间接指针)指示了文件数据块的层次化结构。这种层次结构的设计提供了灵活性和效率,同时减少了索引节点表的大小和数据的存储开销,提高了文件系统的性能。

3.2.2 间接索引表的大小和表项个数

对于文件系统中的一级间接索引表(Single Indirect Index Table),它是一种用于扩展文件系统容量的指针结构。一级间接索引表存储了一级间接索引的指针,这些指针指向一级间接块。

一级间接索引表的内容可以描述为:

  1. 一级间接索引表条目:每个条目是一个指针,对应一个一级间接块。

  2. 一级间接块:一级间接索引表中的每个指针所指向的一级间接块是一个数据块,其中存储了多个指针。这些指针指向其他数据块,通常称为数据块指针。

  3. 数据块指针:一级间接块中的指针记录了文件分散存储在文件系统中的数据块的地址。通过这些指针,文件系统可以根据需要在存储介质上找到文件的相应数据块。

通过一级间接索引表的引入,文件系统可以处理比直接索引更大的文件,因为一级间接索引表存储了更多的指针,指向许多数据块。这进一步扩展了文件系统的存储容量和索引能力。

需要注意的是,一级间接索引表只是一种指针结构,其真正的内容是一级间接块。一级间接块中存储了数据块指针,这些指针才是实际用于查找和访问文件数据的关键。

总结而言,一级间接索引表在文件系统中用于扩展容量,存储了多个一级间接索引的指针。这些指针指向一级间接块,其中存储了数据块指针,提供了对大型文件的索引和访问能力。

一级间接块中的索引个数通常是由文件系统的设计和设置决定的。它取决于文件系统的块大小以及索引块中每个索引项所占用的空间大小。

在一个典型的文件系统中,一个数据块的大小是固定的,比如4KB或8KB。同时,每个索引项的大小也是确定的,通常是4字节或8字节,具体取决于文件系统的实现。以4KB索引块大小为例,每个索引项的大小为4直接,则索引项的个数为:4KB/4B = 1024 = 1K 个索引项。 

因此,计算一级间接块中索引的个数可以按照以下步骤进行:

  1. 确定每个索引项的大小:根据文件系统的实现,确定每个索引项所占用的空间大小。

  2. 确定一级间接块的大小:根据文件系统的块大小,确定一级间接块的大小。

  3. 计算索引的个数:一级间接块的大小除以每个索引项的大小,得到一级间接块中索引的个数。

需要注意的是,由于文件系统需要保留一些元数据信息,一级间接块中实际可用的索引项数量可能会略少于计算得到的索引个数。

文件系统设计人员在确定文件系统的块大小和索引项大小时,需要综合考虑文件系统的性能、存储效率和对大文件的支持能力等因素。大块和较大的索引项可以增加文件系统的容量和性能,但会带来存储空间的浪费;小块和较小的索引项可以提高存储空间利用率,但可能限制了文件系统的最大容量和大文件的支持能力。因此,文件系统设计者需要在权衡这些因素的基础上选择适当的块大小和索引项大小。

四、NFS文件系统

NFS(Network File System)文件系统的原理和数据结构主要涉及以下几个方面:

  1. 服务器和客户端交互:NFS采用客户端-服务器模型,其中NFS服务器存储文件和目录,并提供对这些文件和目录的远程访问。 客户端通过网络连接到NFS服务器,并通过特定的协议进行交互,如RPC(Remote Procedure Call)协议。

  2. 文件句柄(File Handle):在NFS中,文件和目录通过唯一的文件句柄进行标识。文件句柄是一个由服务器生成的固定大小的唯一标识符,用于识别特定的文件或目录。当客户端发送访问请求时,它将使用文件句柄来标识所需的文件或目录。

  3. NFS协议:NFS采用基于请求和响应的协议进行通信。客户端向服务器发送请求消息,包括操作类型(如读取、写入、创建、删除等),以及相关的参数,如文件句柄和偏移量等。服务器接收请求,并执行相应的操作,然后将结果封装为响应消息发送回客户端。

  4. 数据缓存:为了提高性能,NFS客户端采用了数据缓存机制。当客户端首次读取文件时,它会从服务器获取文件的内容,并将这些数据缓存在本地。这样,当下次需要访问相同的文件时,客户端可以直接从本地缓存中读取数据,而无需再次请求服务器。

  5. 权限和访问控制:NFS使用Unix/Linux样式的访问权限和安全机制来保护共享的文件和目录。服务器可以设置访问权限,例如所有权和权限位,以控制对文件的读写访问。客户端必须具有适当的权限才能执行访问操作。

  6. 锁定机制:NFS支持锁定(locking)机制,用于协调对同一文件的并发访问。为了避免并发冲突,客户端可以在读取或写入文件时,请求文件的锁定。服务器将根据锁定请求来协调访问,并确保文件的一致性和完整性。

  7. 挂载和导出:在NFS中,服务器上的文件和目录需要被导出(export),以便客户端可以挂载(mount)并访问它们。服务器上的导出定义了可以被哪些客户端挂载的共享资源以及响应的访问权限。

NFS的数据结构和实现涉及到文件句柄的生成和管理,客户端的缓存机制,服务器端的导出配置和请求处理等。这些机制和数据结构的设计旨在提供高效、可靠的文件共享体验,并确保共享操作的一致性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty全面了解, 使用,有这一篇就够了

目录 引言: 什么是Netty? Netty和Tomcat有什么区别? 为什么Netty受欢迎? Netty为什么并发高 Netty为什么传输快 为什么说Netty封装好? 使用示例: 步骤1: 添加Netty依赖 步骤2: 创建服务器启动类 步…

OpenResty安装-(基于Nginx的高性能Web平台,可在Nginx端编码业务)

文章目录 安装OpenResty1.安装1)安装开发库2)安装OpenResty仓库3)安装OpenResty4)安装opm工具5)目录结构6)配置nginx的环境变量 2.启动和运行3.备注 安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 …

风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

小程序中如何核销订单和优惠券

小程序已成为许多商家线上线下开展业务的重要渠道。客户在小程序中下单/领券后,可能需要商家现场扫码核销,例如超市购物、卖票、游乐园等线下场景。下面就介绍小程序中如何核销订单和优惠券。 一、订单核销 订单核销是指商家在小程序中确认顾客已经支付…

开环模块化多电平换流器仿真(MMC)N=6(Simulink仿真)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【Vue面试题六】为什么Vue中的 v-if 和 v-for 不建议一起用?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:v-if和v-for的优先级是什…

socket简介

套接字(Socket)实质上就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,为应用层进程利网络协议交换数据提供了相应机制。套接字出于承上启下的作用,向上连接应用进程&#xf…

Linux:TCP三握四挥简析

文章目录 1. 前言2. 背景3. TCP连接的建立和断开3.1 TCP协议状态机3.2 TCP的三握四挥3.2.1 TCP 连接建立的三次握手过程分析3.2.1.1 服务端和客户端套接字的创建3.2.1.2 服务端进入 LISTEN 状态3.2.1.3 服务端在 LISTEN 状态等待客户端的 SYN 请求3.2.1.4 客户端向服务端发送 S…

基于虚拟同步发电机控制的双机并联Simulink仿真模型

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

webserver项目

利用无锁工作队列的Web服务器设计 项目地址https://github.com/whitehat32/webserver_no_lock 基本流程与牛客版的一致,下面放一个牛客版的流程框图 引言 在Web服务器的设计与实现中,性能优化是永远不会过时的话题。一般来说,Web服务器需…

精确到区县级街道乡镇行政边界geojson格式矢量数据的获取拼接实现Echarts数据可视化大屏地理坐标信息地图的解决方案

在Echarts制作地理信息坐标地图时,最麻烦的就是街道乡镇级别的行政geojson的获取, 文件大小 788M 文件格式 .json格式,由于是大文件数据,无法直接使用记事本或者IDE编辑器打开,推荐Dadroit Viewer(国外…

基于粒子群优化算法、鲸鱼算法、改进的淘沙骆驼模型算法(PSO/SSA/tGSSA)的微电网优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

1.5 计算机网络的类别

思维导图: 1.5.1 计算机网络的定义 我的笔记: #### 精确定义: 计算机网络没有统一的精确定义,但一种较为接近的定义是:计算机网络主要由一些通用的、可编程的硬件互连而成,这些硬件并非专门用来实现某一特…

【Redis】数据过期策略和数据淘汰策略

数据过期策略和淘汰策略 过期策略 Redis所有的数据结构都可以设置过期时间,时间一到,就会自动删除。 问题:大家都知道,Redis是单线程的,如果同一时间太多key过期,Redis删除的时间也会占用线程的处理时间…

51单片机+EC11编码器实现可调参菜单+OLED屏幕显示

51单片机+EC11编码器实现可调参菜单+OLED屏幕显示 📍相关篇《stc单片机使用外部中断+EC11编码器实现计数功能》 🎈《STC单片机+EC11编码器实现调节PWM输出占空比》 🌼实际操作效果 🍁整个项目实现框架: 📓EC11接线原理图: 📓项目工程简介 📝仅凭借一个EC11编…

《Attention Is All You Need》论文笔记

下面是对《Attention Is All You Need》这篇论文的浅读。 参考文献: 李沐论文带读 HarvardNLP 《哈工大基于预训练模型的方法》 下面是对这篇论文的初步概览: 对Seq2Seq模型、Transformer的概括: 下面是蒟蒻在阅读完这篇论文后做的一…

slamplay:用C++实现的SLAM工具集

0. 项目简介 slamplay 是一个功能强大的工具集合,可用于开始使用 C 来玩和试验 SLAM。这是一项正在进行的工作。它在单个 cmake 框架中安装并提供一些最重要的功能 后端框架(g2o、gtsam、ceres、se-sync 等)、 前端工具(opencv、…

RK3568的CAN驱动适配

目录 背景: 1.内核驱动模块配置 2.设备树配置 3.功能测试 4.bug修复 背景: 某个项目上使用RK3568的芯片,需要用到4路CAN接口进行通信,经过方案评审后决定使用RK3568自带的3路CAN外加一路spi转的CAN实现功能,在这个…

SpringSecurity源码学习一:过滤器执行原理

目录 1. web过滤器Filter1.1 filter核心类1.2 GenericFilterBean1.3 DelegatingFilterProxy1.3.1 原理1.3.2 DelegatingFilterProxy源码 2. FilterChainProxy源码学习2.1 源码2.1.1 doFilterInternal方法源码2.1.1.1 getFilters()方法源码2.1.1.2 VirtualFilterChain方法源码 3…

Go复合类型之数组类型

Go复合类型之数组 文章目录 Go复合类型之数组一、数组(Array)介绍1.1 基本介绍1.2 数组的特点 二、数组的声明与初始化2.1 数组声明2.2 常见的数据类型声明方法2.3 数组的初始化方式一:使用初始值列表初始化数组方法二:根据初始值个数自动推断数组长度方…