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

news2024/11/17 1:32:51

目录

前言:

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

二、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.coloradmin.cn/o/1066896.html

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

相关文章

微信小程序-2

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 一、app.js中的生命周期函数与globalData(全局变量) 指南 - - - 小程序框架 - - - 注册小程序 删除app.js里的东西,输入App回车,调用生命周期 选项 - - - 重新打开此项目…

【0225】RELSEG_SIZE、BLCKSZ 等变量值是多少?它们声明于何处?

1. RELSEG_SIZE、BLCKSZ等变量值 在讲解SMGR实现原理时,在md.c源文件中,经常会看到 BLCKSZ、RELSEG_SIZE等变量的出现,但是整个PG内核源码中又搜索不到此变量的定义处。如下: 那么有两个疑问: 为何源码中搜索不到此类变量的声明?它们的值又是多少?如果不知道这两个变量…

王杰C++day1

#include <iostream>using namespace std;int main() {cout << "输入一个字符串&#xff1a;" << endl;string str;int a 0,b 0,c 0,d 0,e 0;getline(cin,str);for(int i 0;i < (int)str.size();i){if(str[i] > A && str[i] &…

CTF 全讲解:[SWPUCTF 2021 新生赛]Do_you_know_http

文章目录 参考环境题目hello.php雾现User-Agent伪造 User-AgentHackBarHackBar 插件的获取修改请求头信息 雾散 a.php雾现本地回环地址与客户端 IP 相关的 HTTP 请求头X-Forwarded-For 雾散 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型…

蓄电池与超级电容混合储能并网逆变系统Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

微信小程序开发——自定义堆叠图

先看效果图 点击第一张图片实现折叠&#xff0c;再次点击实现展开 思路 图片容器绑定点击事件获取当前图片索引&#xff0c;触发onTap函数&#xff0c;根据索引判断当前点击的图片是否为第一张&#xff0c;并根据当前的折叠状态来更新每张图片的位置&#xff0c;注意图片向上…

android插件开发

写文件&#xff1a;二进制&#xff1a; 项目步骤&#xff1a;下载图片&#xff0c;转码。测试显示。 测试加的代码 写文件&#xff0c;二进制&#xff0c;Base64解码&#xff1a;

基于复旦微JFM7K325T FPGA的高性能PCIe总线数据预处理载板(100%国产化)

PCIE711是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用复旦微的JFM7K325T FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#x…

2023.10.07

#include <iostream>using namespace std;int main() {string str;cout << "请输入字符串&#xff1a;";getline(cin,str);int big0,little0,spac0,num0,sym0;int sizestr.size();for(int i0;i<size;i){if((int)str.at(i)<6526 && (int)st…

可怕,鸡的这些部位千万不能吃?多数人都不知道……

鸡肉深受大多数人的喜爱&#xff0c;但网上关于鸡肉的说法也是各式各样&#xff1a; 有人说“鸡头当中含有重金属物质&#xff0c;食用有危害”&#xff1b;有人说“鸡皮不能吃&#xff0c;不然会中毒”&#xff1b;甚至还有人说“鸡肉不能吃&#xff0c;否则会致癌”…… 网传…

VMware 虚拟机删除+重建

由于本人暴力地关闭虚拟机&#xff0c;导致虚拟机出现了一些问题&#xff0c;并且还没有给虚拟机拍快照&#xff0c;虽然还能用&#xff0c;但本人不想将就&#xff0c;于是乎打算重新新建一个虚拟机 一、删除 1.打开workstation,选择虚拟机&#xff0c;右键选择移除。 虽然虚…

x64内核实验7-线程

x64内核实验7-线程 TOC 线程是比较重要的内核结构&#xff0c;思考一下其实可以想到线程结构体在64位下的变化应该不会很大最多只是扩充了一些内容&#xff0c;因为从我们之前分析段页时候会发现cpu更新的这些内容大部分不影响xp时候的线程切换机制&#xff0c;下面我们来验证…

无法打开软件,因为计算机中找不到MSVCP140.dll的解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个动态链接库文件&#xff0c;它是Microsoft Visual Studio 2015的一部分。这个文件包含了许多用于运行C程序所需的运行时函数和数据。当计算机上安装了Visual Studio 2015或更高版本时&#xff0c;msvcp140.dll文件…

嵌入式Linux裸机开发(四)IMX6U主频和时钟配置

系列文章目录 文章目录 系列文章目录介绍时钟来源PLL时钟源内核时钟PFD时钟AHB、 IPG 和 PERCLK 根时钟设置 结语 介绍 默认配置下 I.MX6U 工作频率为 396MHz&#xff0c;但该系列标准工作频率事528MHz&#xff0c;有些型号甚至可以工作到696MHz。 默认情况下内部 boot rom 会…

阿里云服务器ECS经济型e实例租用价格表

阿里云服务器e系列优惠价格&#xff1a;2核2G配置182元一年、2核4G配置365元一年、2核8G配置522元一年&#xff0c;e系列即ECS经济型e实例&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;系统盘支持ESSD Entry云盘&#xff08;推荐&#xff09;、ESSD云盘、ES…

【SpringBoot】| Thymeleaf 模板引擎

目录 Thymeleaf 模板引擎 1. 第一个例子 2. 表达式 ①标准变量表达式 ②选择变量表达式&#xff08;星号变量表达式&#xff09; ③链接表达式&#xff08;URL表达式&#xff09; 3. Thymeleaf的属性 ①th:action ②th:method ③th:href ④th:src ⑤th:text ⑥th:…

【yolo系列:yolov7改进wise-iou】

yolo系列文章目录 学习视频&#xff1a; YOLOV7改进-Wise IoU_哔哩哔哩_bilibili 代码地址&#xff1a; objectdetection_script/yolov7-iou.py at master z1069614715/objectdetection_script (github.com) 文章目录 yolo系列文章目录一、在yolov7之上进行替换二、在loss.p…

双馈风力发电机-900V直流混合储能并网系统Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++默认参数(实参)

在本文中&#xff0c;您将学习什么是默认参数&#xff0c;如何使用它们以及使用它的必要声明。在C 编程中&#xff0c;您可以提供函数参数的默认值。默认参数背后的想法很简单。如果通过传递参数调用函数&#xff0c;则这些参数将由函数使用。但是&#xff0c;如果在调用函数时…

几道web题目

总结几道国庆写的web题目 [ACTF2020 新生赛]Include1 点进去发现就一个flag.php,源代码和抓包都没拿到好东西 结合题目猜是文件包含&#xff0c;构建payload ?filephp://filter/readconvert.base64-encode/resourceflag.php 得到base64编码过的flag&#xff0c;解码即可 此题…