文件系统 ---在硬盘中的文件

news2024/9/24 9:20:34

序言

 在前两章的内容中,我们主要是介绍了一个文件被调度时,在内存中的存在形式以及相关的内核结构。在这一章中,我们主要介绍一磁盘是如何管理并存储文件的以及文件在磁盘上的存在形式。
 大部分电脑采用硬盘驱动器(HDD)或固态硬盘(SSD)来存储文件信息,在这篇文章中我们主要介绍前者的读写文件的结构。


1. 磁盘物理结构

 该磁盘采用磁性存储技术,通过磁头在旋转的磁性硬盘表面上读写数据来存储和检索信息。
在这里插入图片描述
 一个磁盘有多个磁片,一个磁片通常正反两个盘面都具有存储功能,一个盘面通过第三个结构图我们可以看出有很多圆环,一个圆环就叫做磁道,一个磁道又被分成了很多个扇区,而扇区是硬盘数据存储的基本单位,一个扇区的大小通常是 512字节

但是操作系统认为,一次只与磁盘交互一个扇区的数据量太小,这会导致大量的 I/O 操作,所以在 Linux 操作系统中以数据块为单位进行 I/O 操作,一个数据块 Block 的大小通常是 8 个连续的扇区(4KB)。

1. 如何定位一个扇区

&esmp; 那如何定位一个扇区在磁盘中的位置呢?我们一般采取 CHS 定址法:

  1. 先找到特定的磁头(Header
  2. 再找到特定的磁道(Cylinder
  3. 最后找到特定的扇区(Sector

这样说来可能不是那么易懂,那我们举个栗子吧:

现在规定一个盘面包含有 1000 个扇区,一个磁道包含有 100 个扇区,现在我需要知道第 5001 号扇区的物理位置。

  1. 确定盘面(找到特定的磁头):5001 / 1000 = 5,第 5 个盘面
  2. 确定在指定盘面上的第几号扇区:5001 % 1000 = 1,第 1 个扇区
  3. 确定磁道:1 / 100 = 0,第 0 个磁道
  4. 确定扇区:1 % 100 = 1,第 1 个扇区

结论:该扇区位于第 5 个盘面的 第 0 个 磁道的 第 1 个扇区。

2. 对磁盘的逻辑抽象结构

1. 逻辑结构

 我们在上面提到了 Linux 操作系统中以数据块 Block 为单位进行 I/O 操作,所以我们可以抽象地理解为我们的磁盘也被分成了一个一个以 Block 为单位的数据块:
在这里插入图片描述
LBA(Logical Block Address,逻辑块寻址) 就是每一个块的起始地址。在每一个块上的读写操作,通过对 LBA 使用 CHS 定址法就可以映射到磁盘上。

 现在我们对文件的读写就变成了对该逻辑结构的读写,这对任何磁盘硬件都是通用的,使我们无需关心硬件的具体实现细节,简化操作,抽象层隔离。

2. 空间管理的分治思想

 直接管理一块 800GB 大小的硬盘是比较困难的,所以我们需要对我们的磁盘进行分区:
在这里插入图片描述
注意:每个区域的大小可以不同,并且可以有不同的管理方式,如:C盘和其他盘的管理。

而一个分区操作系统又分成若干个组:
在这里插入图片描述
现在我们关注于对一个组的管理,对该组的管理可以适用于其他任何组。
思考一下,就拿一个小学举例子吧:一个小学的校长很难光凭自己管住所有的学生,但是我们分了年级的呀,一个年级又分成了若干个班级,校长想知道一个学生的信息就问年级主任,年级主任问班主任,这不就有了吗!

3. 一个组的结构

 在进入本节内容之前,先问大家一个问题:一个文件 = 文件的内容吗 ?如果我创建一个文件却没有向他里面写入任何的内容,那么文件的大小就是 0 吗?

 答案肯定不是的,文件 = 文件的内容 + 文件的属性 这个概念很重要!!!

 下图就是一个分组的详细结构:
在这里插入图片描述
在这里我们将逐个介绍每一块的内容:

1. 数据块 Data blocks

数据块主要是存储文件的内容,每一个块的大小为 4KB(八个连续的扇区),并且每一个块都有一个独立的块号。

2. 块位图 Block Bitmap

&esmp;这是一个位图,记录在数据块中哪些块被使用,哪些块是闲置的。大家可能会感到疑惑,是如何实现这个位图的呢?现在假设该块位图只是占了一个块,那一共就有:4 * 1024 * 8 = 32768 位,我们在前面说到了,在数据区中每一个块都有一个独立的块号,如果现在第 100 号块被使用了,那么在快位图中的第 100 位就置 1。

3. i 节点表 inode Table

 存放文件的属性,如文件的大小,所拥有者权限,创建时间,修改时间等。每个 inode 通常占用 128字节,咦?所有文件的都一样吗?那比如一个 1KB 的文件和一个 1GB 的文件没什么差别吗?是的大小都是一样的。因为他们都具有相同的文件属性,只是每个属性对应的值可能不同而已。
 该表有两个属性特别重要,我们单拎出来说:

  • 数据块位置:记录文件数据所在的 block 数据块的编号。文件内容存储在 block 中,inode 中记录了这些 block 的编号,以便快速找到文件内容。
  • inode_number,系统可以快速定位和访问文件或目录的 inode 信息,进而获取文件的元数据和内容。每个分区的 inode_number 是独立的,换句话来说,一个分区的 inode_number 绝不可能重复,但是不同区之间的 inode_number 可能会重复。

这里提出两个疑问:

  • 文件的属性怎么不包括 文件名
  • 系统根据 inode_number 定位一个文件的位置,这个东西和 文件名 的关系?
4. i 结点位图 inode Bitmap

 这个的功能和块位图一致,查询记录在 inode Table 中哪些块被使用,哪些块是闲置的。

5. 块组描述符 Group Descriptor Table

&esmp;这个主要是描述本组的情况,比如,本组一共的大小,少用了多少空间,还剩余多少空间等等。

6. 超级块 Super Block

 描述一个分区的情况,记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的 时间,最近一次检验磁盘的时间等其他文件系统的相关信息。
 我们之前说过,不同的分区可以使用不同的管理方式,所以每一个分区的 Super Block 就是描述该分区的文件系统结构,所以一个分区的 Super block 如果受损了,那么该分区就废掉了。为了避免这种情况,会在该分区的分组中间隔的存储 Super Block,那为什么不每个组都存一个呢?这样又方便又简单。系统也要考虑效率,每个组都存一个太浪费空间了,也不必要。


3. 特殊的文件 — 目录

 在大家眼中,目录算得上一个文件吗,如果是文件的话,那目录又存储些什么呢?首先,目录肯定是一个文件,我们前面说过,文件 = 文件的属性 + 文件的内容。我们从这个角度为切入点,来谈谈目录。

1. 目录的属性

&esmp;在 Linux 中,我们可以通过指令 stat File 来查看一个文件的详细属性,如:
在这里插入图片描述
现在我们也对一个目录使用该指令:
在这里插入图片描述
可以看到属性是一致的。所以目录也具有文件的属性,换句话说,目录就是文件。那目录存放的数据是什么呢?

2. 目录的内容

&esmp;我们直到,系统提供 inode_number 来寻找该文件在磁盘中的位置,而我们用户使用 文件名 来使用一个文件。所以,目录存储的是 文件名和 inode_number 的链接!使用指令 ls -i :
在这里插入图片描述
可以看到每一个 文件名 都对应一个 inode_number

 所以我们获取一个文件内容的步骤是:

  1. 目录根据文件名,得出该文件的 inode_number
  2. 系统根据文件所在的分区,查找 inode_number 对应的 inode_Table
  3. 再根据 inode_Table 获取文件内容所在数据块中的位置

现在大家可以解释我们的之前的疑问了吗?


4. 再次理解文件的增删

1. 创建一个文件

 创建一个文件:

  1. 查找该分区中哪个分组有合适的空间
  2. 查找该组中的 inode Bitmap,寻找空闲位置
  3. 将你的属性存入 inode Table,将你的数据存入数据块
  4. 将你的 文件名inode_number 建立映射关系存入文件

2. 删除一个文件

 删除一个文件,原来如此简单:

  1. 根据 文件名 找到 inode_number
  2. 根据 inode_number 找到对应的 inode Table
  3. 将该 inode Table 对应的位图置 0,再将数据块对应的位图置 0

删除一个文件不需要将该文件对应的属性和数据真正的格式化,只需要将占有的标志位从 1 变为 0 即可,代表这块空间是空闲的,可以被使用!


5. 总结

&esmp;这篇文章主要介绍了文件在磁盘中的存储方式,希望大家有所收获😊!

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

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

相关文章

AWS域名注册:AWS 是否可以注册HK域名?

AWS(Amazon Web Services)本身并不直接提供域名注册服务,但它通过其服务Amazon Route 53提供域名注册功能,九河云来和你详细说说域名注册的一些事项吧。通过Amazon Route 53,你可以注册各种顶级域名(TLD&am…

openai command not found (mac)

题意:mac 系统上无法识别 openai 的命令 问题背景: Im trying to follow the fine tuning guide for Openai here. 我正在尝试遵循 OpenAI 的微调指南 I ran: 我运行以下命令 pip install --upgrade openaiWhich install without any errors.…

本地安装Llama3.1与LobeChat可视化UI界面并实现远程访问大模型实战

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

著名数学教育家的精辟见解表明R有最小正数元

黄小宁 著名数学教育家余元希教授著《数的概念浅说》114页指出:数轴是连续的点集,它的元素是一个一个紧挨着的。这精辟见解说明R轴即x轴必有紧挨着原点x0的正数点xt,t显然是R的最小正数元,任何比t小的正数都是“更无理”的R外正数…

SD-WAN抢专线的饭碗?和传统WAN对比到底香在哪?

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 你们好,我的网工朋友。 广域网(WAN, Wide Area Network)是企业网络的核心组成部分之一,但是随着发…

测试GPT4o分析巴黎奥运会奖牌数据

使用GPT4o快速调用python代码,生成数据图表 测试GPT4o分析巴黎奥运会奖牌数据 测试GPT4o分析巴黎奥运会奖牌数据 1.首先我们让他给我们生成下当前奥运奖牌数 2.然后我们直接让GPT帮我们运行python代码,并生成奥运会奖牌图表 3.我们还可以让他帮我们…

初识云计算

随着科技的飞速发展,云计算作为一种新兴的信息技术架构,正在逐渐改变我们的工作方式和生活方式。 云计算是什么? 云计算是一种通过互联网提供计算资源和服务的计算模式。它通过互联网将计算和存储资源进行集中和共享,为用户提供…

mysql 各种锁归纳总结

文章目录 一、引言二、锁分类三、Mysql锁四、MyISAM表锁五、InnoDB锁六、间隙锁七、总结 一、引言 在现代应用程序中,数据库是不可或缺的组成部分之一。而MySQL作为一款开源的关系型数据库管理系统,广泛应用于各种规模的应用中。然而,在高并…

如何防止员工删除文件?10个操作让你随时找到重要文件

防止员工删除文件是确保企业数据安全的重要一环,有了这10个操作,让你不愁找不到重要的文件。 1.设置文件访问权限: 在文件服务器上或网络共享中,为不同用户或用户组设置适当的文件访问权限。确保员工只有必要的读、写权限&#…

polyglot,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - polyglot。 Github地址:https://github.com/aboSamoor/polyglot 在处理多语言文本时,解析和翻译不同语言的文本数据是一个常见…

sql注入11、17、24关

sql注入第11关 查看源码后发现注入点。 $sql"SELECT username, password FROM users WHERE username$uname and password$passwd LIMIT 0,1";$resultmysqli_query($con1, $sql);$row mysqli_fetch_array($result, MYSQLI_BOTH); 在User Name输入框中输入注入语句&…

未授权访问漏洞系列详解③!

Elasticsearch未授权访问漏洞 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引…

海运中的甩柜是怎么回事❓怎么才能避免❓

什么是甩柜? 甩柜又叫甩箱,是指集装箱船在起运离港时,船公司没有将此前计划装船的集装箱装运上船,导致部分货物滞留港口。多出现在海运旺季。 为什么会甩柜? 甩箱是集装箱物流中常见的事件,主要因为承运…

LLM大模型技术实战6:一文总结大模型微调方法

大模型会成为AI时代的一项基础设施。作为像水、电一样的基础设施,预训练大模型这样的艰巨任务,只会有少数技术实力强、财力雄厚的公司去做。绝大多数人,是水、电的应用者。对这部分人来说,掌握如何用好大模型的技术,更…

使用GenProtobuf插件生成java实体类

安装插件 配置 Tools 》Configure GenProtobuf 配置本地安装的protoc路径目标语言存放路径 生成Java实体类 在.proto文件上右键 quick gen protobuf rules,会按上面配置的规则执行命令,生成的java文件放到配置指定的文件夹下。 在.proto文件上右键…

正点原子imx6ull-mini-Linux驱动之Linux 多点电容触摸屏实验(24)

触摸屏的使用场合越来越多,从手机、平板到蜂巢取货的屏幕等,到处充斥着触摸屏。触 摸屏也从原来的电阻触摸屏发展到了很流行的电容触摸屏,我们在第二十八章裸机实验中已经 讲解了如何编写电容触摸屏驱动。本章我们就来学习一下如何在 linux 下…

MATLAB代码检查工具PolySpace

概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码,可以确定可能在哪里发生潜在的运行时错误,例如算术溢出,缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准,还免费,就让各大车企爱不释手。…

计算机二级MS office原题分析(40套)

本文档是一份详尽而深入的计算机二级考试原题分析,其内容由我本人亲自整理并精心编纂而成。在整理过程中,我细致研究了历年来的计算机二级考试真题,不仅涵盖了各个模块的经典题型,还深入剖析了题目考察要点以及解题技巧。 同时&a…

打印用“* ”组成的带空格直角三角形图案。

1.//KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“* ”组成的带空格直角三角形图案。 //输入描述: //多组输入,一个整数(2~20),表示直角三角形直角边的长度&#xff0…

【日记】这个人居然一个小时就学会了自行车……(2627 字)

正文 每次周末有事,都没时间写。 这周末跑斯那里去,只有一个目的:让他把自行车学会。而这个目的很快就达成了,让人非常意外。连我都没有想到,他居然一个小时就能学会。 周五晚上坐火车过去,他让我直接到超市…