上章讲的是 os 如果管理被打开的文件,那么没有被打开的文件(也就是在磁盘单中的文件)使用文件系统进行管理。了解完这一章,我们就可以理解我们如果想要打开一个文件的是如何找到整个文件,然后如何把它加载到内存中的,在这之前我们还会进行学习磁盘的物理结构,CHS和LBA地址,理解磁盘是如何进行分区的以及软硬连接的使用和途径!!!

目录

一、 理解磁盘的结构

   1.1 见一见

1.2 磁盘的名词 

1.3 磁盘逻辑结构

1.4 磁盘定位

  1.5 CHS && LBA地址

二、 文件系统

 2.1 “块” 的概念

2.2 分区

2.3 inode

三、Ext2 文件系统

 3.1 是什么

 3.2 有什么

3.3 与实际相关联

  3.3.1 目录与文件名

  3.3.2 路径解析 与 路径缓存

 3.3.3 挂载

四、软、硬链接

4.1 软链接

  4.1.1 是什么

   4.1.2 怎么用

4.2 硬链接

 4.2.1 是什么

 4.2.2 怎么用

五、总结


一、 理解磁盘的结构

   1.1 见一见

     可以看到这个磁盘面非常的光滑,可以认为这个这个光滑的此面是许多的磁性物质组  成,里面存放着我们的数据,然后还有一个磁头,通过磁头的指向,指向特定的区域然后得到想 要的文件

1.2 磁盘的名词 

  主要的名词需要记住的有:磁头,磁道,磁面,柱面,扇区。

    磁道:在磁盘上面可以分成一圈一圈的。虽然你肉眼看到的是一个光滑的平面,但是要是拿一个显微镜看的话也可以看到是一圈一圈的

    柱面:一块磁盘当我们从侧面看的时候是由许多片共同构成的所以,由磁道 + 多个磁面构成的结构立体图形就是柱面。

    磁头:用来进行定位的。每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头

    扇区:由磁头位置到一定长度的磁道位置组成的一个扇形(注意:里面由磁道组成的扇形由远到近,虽然大小不是相同的但是我们规定并且认为不论大小都是相同的)

    磁面:就是我们肉眼可以看到的那个区域。

    补充:扇区是磁盘进行文件储存的一个基本单位,512字节,是一个块设备。

                磁盘容量 = 磁头数 * 磁道数 * 每道扇区数 * 每扇区字节数。

                控制磁头的传送臂式共进退的。

1.3 磁盘逻辑结构

        前面理解了磁盘的物理结构,他是啥样的就是啥样的,但是我可以把它抽象成逻辑结构的方式来进行深入的理解,同时理解我们的文件系统它到底是如何进行工作的。

        小时侯我们都玩过录音带,我们可以看到它的结构是一圈一圈的是不是非常的像我们的磁盘,当我们把他的缠成一圈一圈的磁带将它展开,是不是就是一条长长的线,那我们就可以将它抽象为一个数组,所有我们的磁盘也可以简单的理解成是要给一维数组的方式进行存放数据的,也有的相应的逻辑寻址方式。

        在实际过程当中,因为我们的磁头是共进退的,所有当我以柱面的方式来看待磁盘的时候可以发现是由二维的数组形式来实现的。

1.4 磁盘定位

        当我们需要寻找要给扇区的时候,先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了 CHS 。

        因为我们是将磁盘的逻辑结构看为是一个线性数组,所以每一个扇区都有一地址叫做 LBA(Logical Block Address).

OS只需要使⽤LBA就可以了!!LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘⾃⼰来做!固件(硬件电路,伺服系统)

  1.5 CHS && LBA地址

  • CHS 变 LBA

        扇区数 = 磁头数 * 每磁道扇区的数量

        LBA = 柱面号C * 单个柱面的扇区总数 + 磁头号H*每磁道扇区数 + 扇区号S - 1
(扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的、柱⾯和磁道都是从0开始编号的)

一句话:我是第二个柱面就要加上前面一个柱面的所有扇区的数量,以及我是第几个磁头就要算上我是前面的 n - 1 个磁头对应的扇区的数量,最后在加上我前面的扇区数,以为是从 1 开始而数组的下标是从 0 开始的,所有要 - 1,而柱⾯和磁道都是从0开始编号的刚好可以计算。

  • LAB 变 CHS

         柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】

        磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数

        扇区号S = (LBA % 每磁道扇区数) + 1

         "//": 表⽰除取整

        其实这个转化的内容我们不需要特别熟练,我们需要知道的是磁盘就是一个数组,而数组的下标就是 LBA 地址, os 通过 LBA 这个数组就可以访问磁盘当中的扇区,就可以方式存放在磁盘当中的内容。

二、 文件系统

 2.1 “块” 的概念

      磁盘是一个典型的“块”设备,可以随机读取。并且 os 是以块为一单位进行读取文件,提高os 的效率,我们最常见的块是 4 kb,即连续⼋个扇区组成⼀个 ”块”!

        这么做的目的就是为了提高 os 读取文件的效率。计算方法为 LBA / 8 就是哪个块区。

2.2 分区

        磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的⼀种格式化。

        在 Linux 是柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起始柱⾯和结束柱⾯号码。

        这样做的目的在于,我们管理好一个 500G 的空间,与分区管理好100G 的磁盘空间是一样的,同时这样的难度也大大降低,所以这就是分区!

        100G 的磁盘空间进行管理的还有有点困难,所以我们还需要进行分组,在进一步进行细分。还需要了解的是我们的 LIiux 对于文件的内容与属性是进行分开存放的。

2.3 inode

        前面我们提到了文件的内容与属性是分开的。我们使用 inode 用来表示 一个文件所有的属性。使用 stat 可以查看,在 Linux 是一个结构体。还有一个非常重要的概念就是每一个 inode 为了标识它和他的文件,回一个 inode_num 编号的方式存放在 inode 的这个属性里面。使用 -li 可以显示。

        值得注意的是我们的 inode  并没有包括文件名,这个原因我将会会在后面进行讲解。

三、Ext2 文件系统

 3.1 是什么

        前面我们提到了,使用分区的方式进行管理磁盘,那么分区就是文件系统的载体.只有经过分区,同时在分区的基础上再添加上文件系统,那么我们的文件才可以被真正的使用。

        其早期版本为 ext2,后来⼜发展出 ext3 和 ext4。ext3 和 ext4 虽然对 ext2 进行了增强,但是其核心设计并没有发⽣变化,我们仍是以较老的 ext2 作为演示对象。

        我一开也不是特别理解下面的那个图片是什么意思我简单的描述一下:1. 每个 partition 都是一个分区,再下面一层就是分组看,比方说我的分区大小为 300GB,那么分成 10 组,每个就是 30 GB,所以 File System 就是管理的分组。

 3.2 有什么

        接下来的专有名词的描述我将使用我的语言,我的理解进行解释,如果想要了解,完整官方的解释可以自行查找。

  •  Super Block

        超级块:进行存放一整个分区的相关信息,在每一个分组里面都具有这个 super,这是因为为了备份,如果丢失的话就代表着整个文件无法使用。

  • GDT

        块组描述符表:块组块组描述的是分区之后的组里面是有好多的4kb的块形成的这个组,所以叫做块组。描述符表就是表示后面的其他分分组的开始位置以及 inode 使用情况以及数据块的使用情况的表。是用来管理整个分组的一个区域。

  • Block Bitmap

        表示数据区的使用情况的位图,表示那些是已经被使用,那些没有被使用。如果想要删除一个文件的话,直接由 1 - 0 即可。

  • inode Bitmap

        表示 inode 使用的情况。

  • inode Table

        存放文件的属性的地方(这里解释一下为什么使用一个相同的 inode :因为虽然文件的属性具体的内容不相同,但是都具有这些类型,单个 inode 的大小为 128 字节,但是当内存进行加载的时候会加载 4 kb 的内容,所有只要是符合这个范围的都可以加载到磁盘上)

  • Data Blocks

        存放文件的内容的地方。

        还有需要注意的小点为:1. inode 和 数据块跨组编号,不能分区,同时也是唯一的标识不会进行重复。2. 对于不同的 inode 采用 bit 的时候可能很大不用担心无法存放的问题,因为可以%的方法进行存放。

3.3 与实际相关联

  3.3.1 目录与文件名

        前面我们了解到了,我们可以根据 inode 编号找到对应的 inode 结构;再根据 inode 中的数据块指针,最终定位到磁盘上实际存放文件内容的 LBA 地址。前面这句话可能有点难以理解,简单说就是文系统把“物理位置”的复杂性封装起来,你通常只通过 inode 或路径就能访问文件;那么目录是一个什么鬼?我们说的都是文件,目录是个什么东西?以及我们使用的都是文件名,也没有使用 inode 编码呀!

        一说 inode 编号其实就可以联想到是不是目录里面存放的就是 inode 编号。没错:目录就是一个文件,当进入一个目录(工作目录)的时候,就是打开了目录这个文件的相关内容,然后根据文件名 与 inode 的映射关系,打开文件。 Linux 系统下一切皆文件。

  3.3.2 路径解析 与 路径缓存

        /home/djx/code/test/test/test.c 我们的 os 会解析这个路径从/也就是根目录下开始进行解析。知道找到了这个文件的 inode 编号,然后文件系统就回去对应的位置去查找相关的信息。这就就叫做路径的解析。

        明白了这个也就理解了,我们为什么需要路径 + 文件名 才可以打开这个文件了!        

        然而每一次我们的 os 都会从头开始进行寻找吗?不是的, os 会有一个 dentry 结构树,进行路径的缓存,如果是第一次打开在遍历完这个树之后没有找到相应的文件就会加载,但是如果是之前已经打开过的就不需要进行重新加载,直接在这个树结构当中寻找即可!这就是路径的缓存!是一个内存级的概念!

        这个路径缓存在 Linux 内核当中是叫做 dentry 树的一个结构。在这个 dentry 当中还有 hash 与 LRU 淘汰的算法。

 3.3.3 挂载

      一个问题在于我们的分区是相互独立的,不同的分区可能会具有不同的文件系统!那么操作系统是如何知道我的 inode 到底是哪个分区呢?

        这就是磁盘挂载的功能:即我们的文件路径的前缀会跟分区建立映射关系,知道前面的路径是啥,就可以知道到底是挂在到什么区域之中!

        这样的一张图就表示了打开一个文件的全过程:首先是一个进程创建一个 pcb 结构体,然后一个结构 fs 保存 root 与 pwd 的相关的系统信息, file_struct 文件结构体有 file 结构这个里面保存着路径结构体这个路径结构体有 dentry ,看看这个 dentry 有没有加载过这个文件,具体过程看前面缓存功能,根据dentry 就可以是inode 是哪个分区,哪个分组的,知道了 inode 的相关属性,也就是想要打开文件的属性,那么我们就可以将文件拿出来加载到内存中进行使用。

四、软、硬链接

4.1 软链接

  4.1.1 是什么

     就是创建一个快捷方式。

   4.1.2 怎么用

ln -s abc.s abc

        就建立了 abc.s 指向 abc 的软连接,这个连接是一个全新的文件,具有全新的 inode 编号。 

4.2 硬链接

 4.2.1 是什么

        对一个文件的备份。只能对于普通文件进行备份,不能对目录文件做备份,因为防止 os 进行路径加载的时候形成循环。

        . 与 .. 就是硬链接,以及还有硬连接数,只有这个数字变成 0 的时候这个文件才正真的被删除。 

 4.2.2 怎么用

ln abc def

        建立一个与 abc 相同的 def 文件进行了备份。

五、总结

        以上是对于文件系统的回顾。这个文章用于我的学习记录,如果是有其他的错误还请批评指正。如果对你有帮助还请给我点个赞👍👍👍。     

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

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

相关文章

iOS蓝牙使用及深入剖析高频高负载传输丢包解决方案(附源码)

最近开发了一套iOS原生的蓝牙SDK,总结了一些有价值的踩过的坑,分享出来给有需要的同学做个参考。 一、蓝牙的使用 iOS有一套封装好的完善的蓝牙API ,可以很便捷的实现与蓝牙的连接和通信,蓝牙通信的大体流程如下,先对基…

Python 正则表达式实战:用 Match 对象轻松解析拼接数据流

摘要 这篇文章围绕 Python 的正则表达式 Match 对象(特别是 endpos、lastindex、lastgroup 以及 group / groups 等方法/属性)做一个从浅入深、贴近日常开发场景的讲解。我们会给出一个真实又常见的使用场景:解析由设备/服务发来的“拼接式”…

基于Pygame的六边形战术推演系统深度剖析——从数据结构到3D渲染的完整实现(附完整代码)

1. 项目概述与技术选型 战术推演系统是军事训练和游戏开发中的重要组成部分,它能够模拟真实的战术场景,为用户提供策略思考的平台。本文将深入分析一套基于Python Pygame框架开发的城市巷战战术推演系统,该系统采用六边形网格布局,实现了恐怖分子与反恐精英的对抗模拟,具…

支持二次开发的代练App源码:订单管理、代练监控、安全护航功能齐全,一站式解决代练护航平台源码(PHP+ Uni-app)

一、技术架构:高性能与跨平台的核心支撑前端框架Uni-app:基于Vue.js的跨平台框架,支持编译至微信小程序、H5、iOS/Android App及PC端,代码复用率超80%,显著降低开发成本。实时通信:集成WebSocket实现订单状…

AI热点周报(8.31~9.6): Qwen3‑Max‑Preview上线、GLM-4.5提供一键迁移、Gemini for Home,AI风向何在?

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录一、3分钟速览版:一张表看懂本周AI大事二、国内:模型与生态的…

异步操作终止2

您提的这个问题非常棒,说明您思考得非常深入!您完全正确,我之前的示例中使用的 return; 会中断 handleDraw 函数中所有后续的逻辑,这在很多场景下并不是我们想要的。 我们的目标是只中断画图这一个特定的逻辑,而让函数…

《AI大模型应知应会100篇》第67篇 Web应用与大模型集成开发实践——1小时打造国产大模型智能客服系统

第67篇:Web应用与大模型集成开发实践——1小时打造国产大模型智能客服系统 一句话核心价值:无需翻墙!用Flask国产大模型API(通义/文心一言/讯飞)快速构建合规Web问答系统,电商客服人力成本直降70%&#xff…

python系列之综合项目:智能个人任务管理系统

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 python系列之文件操作:让程序拥有"记忆"的超能力!一、项目…

鸿蒙UI开发实战:解决布局错乱与响应异常

文章目录鸿蒙UI开发实战指南:解决ArkUI声明式布局错乱、组件不显示与事件响应异常引言ArkUI声明式开发的技术优势开发痛点与本文价值布局错乱问题常见原因固定像素单位使用不当布局嵌套层级过深Flex布局属性配置错误响应式布局缺失解决方案弹性单位适配:…

B.50.10.09-RPC核心原理与电商应用

RPC核心原理与电商应用实战 第1章:RPC核心概念与价值 1.1. 什么是 RPC? RPC (Remote Procedure Call),即远程过程调用,是一种允许一台计算机(客户端)上的程序,调用另一台计算机(服务…

【完整源码+数据集+部署教程】室内场景分割系统源码和数据集:改进yolo11-DWR

背景意义 研究背景与意义 随着智能家居和自动化技术的快速发展,室内场景理解在计算机视觉领域中变得愈发重要。室内场景分割不仅是计算机视觉的基础任务之一,也是实现智能家居、机器人导航、增强现实等应用的关键技术。传统的图像分割方法在处理复杂的室…

python入门常用知识

一、创建和快捷键 创建项目: New project创建模版:项目&代码的一种默认标记信息创建包(放代码的地方-方便整理分类更清晰) --- python package创建文本文件(配置文件):File创建文件夹(测试数据、测试报告、测试截图):Director…

原创未发表!POD-PINN本征正交分解结合物理信息神经网络多变量回归预测模型,Matlab实现

该代码实现了一个基于POD降维与物理信息神经网络(PINN)结合的回归预测模型,用于从高维数据中提取关键特征并进行物理约束下的数据驱动预测。一、主要功能 数据降维:使用POD(Proper Orthogonal Decomposition&#xff0…

对接gemini-2.5-flash-image-preview教程

对接gemini-2.5-flash-image-preview教程 一、前置准备 1. 明确模型要求 本次对接的gemini-2.5-flash-image-preview模型,继承Gemini系列多模态特性,支持文本生成图片、文本结合图片编辑等功能。需注意该模型不支持仅输出图片,必须配置["…

如何制造一个AI Agent:从“人工智障”到“人工智能”的奇幻漂流

开篇:什么是AI Agent?它和我的“人工智障”音箱有啥区别?🎤朋友们,先想象一下:你的智能音箱 🗣️ -> 🤖 -> ❓:“Hey Siri,帮我订一份披萨,…

别错过!一杯奶茶钱开启企业微信 Power BI 之旅

随着微软的Power BI在数据分析和商业智能领域的广泛应用,人们对于Power BI使用的便捷性和高效性提出了更高的要求。 为了满足这些需求,PBI Plus应运而生,它巧妙地将即时通讯软件的强大功能与Power BI的分析能力相结合。接下来,我们…

MotionSound-简单易用的文本转语音工具

本文转载自:MotionSound-简单易用的文本转语音工具 - Hello123工具导航 ** 一、🎯 MotionSound:一键让文字 “开口说话” 的 AI 配音神器 做视频没时间配音?PPT 演示想加逼真语音?试试MotionSound吧!它是…

Zynq设备与电脑相连方式

一、Zynq设备通过串口与电脑直接相连 “Zynq设备通过串口与电脑直接相连”是开发和调试Zynq系列SOC(如Zynq-7000或Zynq UltraScale+ MPSoC)时最基础、最重要的步骤。这个串口连接主要用于: 系统启动信息输出:查看Uboot、Linux内核的启动过程。 系统调试:输出调试信息(p…

python 逻辑运算练习题

图书馆入馆条件检查题目描述 编写程序判断一个人是否能进入图书馆。图书馆有以下入馆规则:年龄大于等于 18 岁,或者有家长陪同(无论年龄)输入示例图书馆入馆检查 请输入你的年龄:18 是否有家长陪同?(是/否)…

《Java Stream 流从入门到精通:一行代码搞定集合操作,效率提升 10 倍》

封面图上流动的「Stream」字样,正是 Java 8 以来最革命性的特性之一!你是否还在写冗长的 for 循环遍历集合?是否为过滤、排序、聚合数据写一堆重复代码?Stream 流的出现,以声明式编程风格将复杂的集合操作浓缩为一行代…