文件系统实现

news2024/11/24 8:01:46

文件系统实现

    • 🏞️1. 整体组织
    • 🌁2. 文件组织:inode
    • 🌠3. 多级索引
      • 📖3.1 间接指针
      • 📖3.2 多重间接指针
      • 📖3.3 基于范围的方法
    • 🌌4. 目录组织
    • ⛺5. 空闲空间管理
    • 🌿6. 读取和写入文件
      • 📖6.1 读取文件
      • 📖6.2 写入文件
    • 🍁7. 缓冲和缓存
    • 🏜️8. 理解静态划分与动态划分

🏞️1. 整体组织

我们想要了解文件系统在磁盘上的数据结构的整体组织,首先需要将磁盘分成块(block). 简单的文件系统只使用一种块大小,我们选择常用的4KB.

因此,我们对构建文件系统的磁盘分区看法很简单:一系列块,每块大小为4KB,在大小为N个4KB块的分区中,这些块的地址为0~N-1,假设我们有一个非常小的磁盘,只有64块:

image-20221205125249224

那么我们需要在这些块中存储什么呢?

首先需要存储用户数据,任何文件系统大多数的空间都是用户数据,我们将用于存放用户数据的块称为数据区域,所以我们将上述磁盘中的56个块用来存放用户数据:

image-20221205125654176

文件系统还必须记录每个文件的信息,该信息是元数据的关键部分,记录着诸如文件中包含哪些数据块、文件的大小、其所有者和访问权限、访问和修改时间以及其他类似信息的事情. 为了存储这些信息,文件系统通常有一个名为inode的结构.

为了存放inode,我们还需要在磁盘上留出一些空间,我们将这部分的磁盘称为inode表. 它保存了一个磁盘上inode的数组,现在,我们将磁盘区域中的5块用于inode

image-20221205130413798

inode通常没有那么大,假设每个inode大小为256字节,一个4KB的块可以容纳16个inode,所以我们上面的文件系统包含了80个inode.

我们还需要某种方法来记录inode或数据块是空闲还是已分配,因此,我们选择一种简单而流行的结构:位图. 一种用于数据区域(data bitmap),另一种用于inode表(inode bitmap).

位图中的每个位用于指示相应的对象/块是空闲还是正在使用,因此新的磁盘布局如下,包含inode位图(i)和数据位图(d):

image-20221205131127058

在这个简单的磁盘结构设计中,还有一块,我们将它留给超级块(superblock,用S表示,超级块包含关于该特定文件系统的信息,例如文件系统中有多少个inode和数据块,inode表的起始位置等等.image-20221205131455892

在挂载文件系统时,操作系统首先将读取超级块,初始化各种参数.

🌁2. 文件组织:inode

文件系统最重要的磁盘结构之一是inode,几乎所有的文件系统都有类似的结构. 名称inodeindex inode.

每个inode都有一个数字隐式引用(number),我们称之为文件的低级名称. 在一个文件系统中,给定一个number,能够直接计算磁盘上相应节点的位置.

例如,上述文件系统的inode表:大小为20KB(5个4KB块),因此由80个inode(每个256字节)组成,假设inode区域从12KB开始(即超级块从0KB开始,inode位图在4KB地址,数据位图在8KB),inode表紧随其后,因此,我们为文件系统分区的开头提供了以下布局:

image-20221205144406886

要读取inode号32,文件系统首先会计算inode区域的偏移量(32 * inode的大小),再将它加上磁盘的起始地址(12KB),从而得到inode块的地址:20KB.

但磁盘不是按字节寻址的,而是由大量的可寻址扇区组成,通常为512字节,因此为了获取包含索引节点32的索引节点块,inode块的扇区地址可计算如下:

sector = inumber * sizeof(inode_t) + BaseAddr / sectorSize

在每个inode中,实际上是所有关于文件的信息:文件类型(普通文件、目录等)、大小、分配给它的块数、保护信息(谁拥有文件以及谁可以访问它)、一些时间信息(包括文件创建、修改或上次访问的时间)、以及有关其数据块驻留在磁盘上的位置信息,我们将所有关于文件的信息称为元数据.

在设计inode时,最重要的是它如何引用数据块的位置,一种简单的方法是在inode中有一个或多个直接指针(磁盘地址). 每个指针指向属于该文件的一个磁盘块.

下表所示的是ext2inode的例子:

image-20221205151814222

🌠3. 多级索引

📖3.1 间接指针

为了支持更大的文件,文件系统必须在inode中引入不同的结构,一个常见的思路是加入一个称为间接指针的特殊指针. 它不是指向包含用户数据的块,而是指向包含更多指针的块,每个指针指向用户数据. 因此,inode有一些固定数量的直接指针和一个间接指针.

如果文件变得足够大,则会在磁盘的数据块区域分配一个间接块,并将inode的间接指针指向它.

假设一个块为4KB,磁盘地址是4字节,所以就增加了1024个指针,文件的大小可以为(12 + 1024)* 4KB,即4144KB.

📖3.2 多重间接指针

如果我们希望支持更大的文件呢?

只需要添加另一个指向inode的指针:双重间接指针,该指针指向的是一个包含间接块指针的块,每个间接块都包含指向数据块的指针.

image-20221206084420440

这种不平衡树被称为指向文件块的多级索引方法,我们来看一个例子:它有12个直接指针,以及一个间接指针和一个双重间接指针,假设块大小为4KB,并且指针为4字节,则该结构可以容纳一个刚好超过4GB的文件,即(12 + 1024 + 1024^2)* 4KB.

📖3.3 基于范围的方法

另一种方法是使用范围而不是指针,范围就是一个磁盘指针加一个长度(以块为单位),因此,不需要指向文件的每个块的指针,只需要指针和长度来指定文件的磁盘位置. 只有一个范围是有局限的,因为分配文件时可能无法找到连续的磁盘可用空间块. 所以,基于范围的文件系统通常允许多个范围,从而在文件分配期间给予文件系统更多的自由.

🌌4. 目录组织

目录的组织很简单,一个目录基本上只包含一个二元组(条目名称,inode号)的列表,对于给定目录中的每个目录或文件,目录的数据块中都有一个字符串和一个数字.

例如,假设目录dirinode号是5)中有个文件(foo、barfoobar),它们的inode号分别为12、1324dir在磁盘上的数据可能如下:

image-20221206092405221

删除一个文件(例如调用unlink())会在目录中间留下一段空白空间,因此应该有一些方法来标记它(用一个保留的inode号,比如0),这种删除是我们需要记录长度的一个原因:

新的条目可能会重复使用旧的、更大的条目,从而在其中留有额外的空间.

⛺5. 空闲空间管理

文件系统还必须记录哪些inode和数据块是空闲的,这样在分配新文件或目录时,就可以为它找到空间,因此,空闲空间管理对于所有文件系统都很重要,我们使用两个简单的位图来完成这个任务:

例如,当我们创建一个文件时,我们必须为该文件分配一个inode,文件系统将通过位图搜索一个空闲的内容,并将其分配给该文件,并将inode标记为已使用,接着更新磁盘上的位图.

🌿6. 读取和写入文件

📖6.1 读取文件

当你发出一个open("/foo/bar", O_RDONLY)调用时,文件系统首先需要找到文件barinode,从而获取关于该文件的一些基本信息(权限信息、文件大小等),因此,文件系统必须找到inode,通过遍历路径名,从而找到所需的inode.

image-20221206100406037

📖6.2 写入文件

与读取不同,写入文件可能会分配一个块,当写入一个新文件时,每次写入操作不仅需要将数据写入磁盘,还必须首先决定将哪个块分配给文件,从而相应的更新磁盘的其他结构(例如数据位图和inode),因此,每次写入文件在逻辑上会导致IO:读取数据位图,写入位图,写入inode,最后写入数据块.

image-20221206101927428

🍁7. 缓冲和缓存

读取和写入文件是非常昂贵的,会导致磁盘的许多IO,这会对性能造成较大影响,所以大多数文件系统使用系统内存(DRAM)来缓存重要的块.

现代系统采用动态划分方法,将虚拟内存页面和文件系统页面集成到统一页面缓存中,可以在虚拟内存和文件系统之间更灵活的分配内存,具体取决于给定时间哪个对内存的需求量更大.

但是这种缓存对写入操作并没有优化,因为写入操作必须最终写入磁盘,所以需要用写缓冲解决

通过延迟写入,文件系统可以将一些更新编成一批,放入一组IO中,例如,在创建一个文件时,inode位图被更新,稍后在创建另一个文件时又被更新,则文件系统会在第一次更新后延迟写入,从而节省一次IO,通过将一些写入缓冲在内存中,系统可以调度后续的IO,从而提高性能.

还有一些写入甚至可以使用延迟来完全避免,例如,如果应用程序创建文件并将其删除,则将文件创建延迟写入磁盘,可以完全避免写入.

🏜️8. 理解静态划分与动态划分

在不同 客户端/用户 之间划分资源时,可以使用静态划分或动态划分.

静态方法简单的将资源一次分成固定的比例. 例如,如果有两个可能的内存用户,则可以给一个用户固定的内存部分,其余的则分配给另一个用户.

动态方法更灵活,随着时间的推移提供不同数量的资源. 例如:一个用户可能会在一段时间内获得更高的磁盘带宽百分比,之后,系统可能会切换,决定为不同的用户提供更大比例的可用磁盘带宽.

每种方法都有其各自的优点:

静态方法优点:静态划分可确保每个用户共享一些资源,通常提供更可预测的性能,也更易实现.

动态方法优点:动态划分可以实现更好的利用率(让资源匮乏的用户占用其他空闲资源),但实现起来可能会更复杂,并且可能导致空闲资源被其他用户占用,然后在需要时花费很长时间收回,从而导致这些用户性能变差.

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

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

相关文章

Vue 官方文档2.x教程学习笔记 1 基础 1.7 条件渲染

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.7 条件渲染1.7.1 v-if1.7.2 在\<template> 元素上使用 v-if条件渲染分组1.7.3 v-else1.7.4 v-else-if1.7.5 用 key 管理可复用的元素1.7.6 v-show1.7.7 v-if vs v-show1.7.8 v-if 与 v-for 一起…

小网SIM卡QMI拨号无法获取IPv6地址问题的分析

背景 客户反馈设备插小网卡驻网并加载qmi_wwan驱动后,使用多路拨号工具进行两路拨号,第一路无法获取IPv6地址,但是插现网卡测试是没有问题的。具体测试方法如下图: Check后只有第二路有PDN驻网请求,如下图,建议排查QMI拨号工具 分析流程 首先根据客户提供的方法对问…

day6_redis学习

文章目录关注和取关查看其他用户界面及共同关注关注推送关注和取关 因为关注用户的时候可能涉及到共同关注的对象&#xff0c;所以需要利用到交集&#xff0c;而在Redis中可以使用交集的&#xff0c;是Set以及ZSet数据结构&#xff0c;但是显然这里并不需要排序&#xff0c;所…

Java学习之多态二

目录 一、运用多态解决宠物喂食问题 原理分析 运行测试 运行结果 分析 增加宠物和食物种类 Pig类 Rice类 测试 运行结果 一、运用多态解决宠物喂食问题 改变Master类的feed方法的参数列表 package com.hspedu.poly_;public class Master {private String name;public…

基于机器学习之模型树短期负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

Python 中的 Raincloud 图绘制

Python 中的 Raincloud 图 提示&#xff1a;一种强大的数据可视化方法&#xff0c;由小提琴图、散点图和箱线图的组合组成 提示&#xff1a;目录 Python 中的 Raincloud 图绘制Python 中的 Raincloud 图前言一、什么是 Raincloud 图&#xff1f;二、使用步骤1.加载数据集2.读入…

S7协议抓包分析(附pcap数据包)

一、S7协议概述 1、S7协议简介 S7comm&#xff08;S7 通信&#xff09;是西门子专有协议&#xff0c;可在西门子 S7-300/400 系列的可编程逻辑控制器 (PLC) 之间运行。它用于 PLC 编程、PLC 之间的数据交换、从 SCADA&#xff08;监控和数据采集&#xff09;系统访问 PLC 数据…

刷爆力扣之最长连续递增序列

刷爆力扣之最长连续递增序列 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#…

代码随想录算法训练营第五十五天|392. 判断子序列、115. 不同的子序列

LeetCode 392. 判断子序列 链接&#xff1a;392. 判断子序列 双指针&#xff1a; 思路&#xff1a; 本题较容易&#xff0c;如果不用动态规划而是用双指针的办法思路会更加简单。首先两个指针fast&#xff0c;slow分别代表t&#xff0c;s的下标&#xff0c;快指针用于遍历长…

来浅谈一下:GraalVM下载、安装、特点、概括

文章目录前言一、GraaIVM是什么&#xff1f;二、GraaIVM优点三、安装GraaIVM1.GraaIVM Community版本简略2.下载3.解压4.配置变量4.1、JAVA_HOME改成graalvm的位置4.2、编辑path5、查看总结前言 GraaIVM High-performance runtime with new compiler optimizations to accele…

unity计算着色器

序 计算着色器&#xff0c;是什么&#xff1f;好像是并行计算的一个东西。 并行计算&#xff0c;挖矿&#xff1f;显卡&#xff1f; 那看来得先了解显卡&#xff0c;再了解计算着色器了。 认识显卡 显卡&#xff0c;小白&#xff0c;不懂。 显卡的印象&#xff0c;只是停…

批量修改文件名,图文教学,2分钟简单学会

​文件名称是文件的重要组成部分&#xff0c;在我们日常生活中&#xff0c;对文件进行命名&#xff0c;是经常使用到的一种功能。可是有时候需要重命名的文件实在是太多了咋办呢&#xff1f;有没有什么方法可以批量修改文件名&#xff1f; 本文将以图文教学的方式&#xff0c;…

为什么不建议在MySQL中使用 utf8?

MySQL 字符编码集中有两套 UTF-8 编码实现&#xff1a;utf8 和 utf8mb4。 如果使用 utf8 的话&#xff0c;存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。 为什么会这样呢&#xff1f;这篇文章可以从源头给你解答。 何为字符集&#xff1f; 字符是各种文字和符号的…

LPA-star算法(Lifelong Planning)及相关思考

一、LPA-star算法&#xff08;Lifelong Planning&#xff09;简介 LPA * ( Lifelong Planning 终身规划 A * )是一种基于A * 的增量启发式搜索算法&#xff0c;被用来处理动态环境下从给定起始点到给定目标点的最短路径问题&#xff0c;即起始点和目标点是固定的。 &#xff08…

图数据库知识点1:图数据库与关系型数据库区别

文章目录 前言一、图数据库区别于其他数据库的核心是什么&#xff1f;二、图数据库能解决哪些问题&#xff1f; 1.图的优势2.目前的图的实现方式及优劣3.图的技术趋势及优势小结总结前言 《图数据库知识点》系列有20讲&#xff0c;每一讲中会重点分享一个图数据库知识点&#…

什么是JVM?JVM的机制与JVM自动内存管理机制,如何进行优化

1. 什么是JVM&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…

彻底搞懂MySql的B+Tree

1.什么是索引 官方定义&#xff1a;一种能为mysql提高查询效率的数据结构&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。好比如&#xff0c;一本书&#xff0c;你想找到自己想看的章节内容&#xff0c;直接查询目录就行。这里的目录就类似索引…

华为路由器升级系统文件

欢迎关注微信公众号【厦门微思网络】。http://www.xmws.cn 组网图形 组网需求 RouterA的管理网口与用户侧主机HostA相连。要求通过BootROM菜单下载系统文件至RouterA完成系统升级。 操作步骤 1.在PC端启动FTP Server服务。 2.用串口线连接并通过Console口登录设备。 3.重启设…

Java内存模型与线程(3)

文章目录4. Java与线程4.1 线程的实现4.2 Java线程调度4.3 状态转换4. Java与线程 并发不一定要依赖多线程&#xff08;如PHP中很常见的多进程并发&#xff09;&#xff0c;但是在Jva里面谈论并发&#xff0c;大多数都与线程脱不开关系。既然我们这本书探讨的话题是Java虚拟机…

一个系列涨粉47w,小红书内容创意卷出新高度

前有双11&#xff0c;后有世界杯&#xff0c;11月注定是热闹的。图源新红_流量分析_趋势查询在此情况下&#xff0c; 小红书内又涌现出哪些黑马博主&#xff1f;有多少品牌打造出了爆品&#xff1f;什么样的种草玩法才能成功出圈&#xff1f;我们将全面分析11月榜单&#xff0c…