【Linux】C文件系统详解(四)——磁盘的物理和抽象结构

文章目录

  • 磁盘结构
    • 磁盘物理结构
    • 磁盘的具体物理结构
    • 磁盘结构的逻辑抽象
  • 文件系统
    • BootBlock
    • SuperBlock
    • GroupDescriptorTable
    • inode table
    • DataBlocks
    • inodeBitmap
    • blockBitmap
    • linux中的inode 和文件名
    • 如何理解文件的增删查改
    • 补充细节
      • 1.如果文件误删了,我们该怎么办?
      • 2.inode确定分组,inode number是在一个分区内有效,不能跨分区
      • 3.上面我们学到的分区,分组,填写系统属性->谁做的呢?什么时候做的呢
      • 4.我们如果inode只是单单地用数组和datablock的映射关系
      • 5.有没有可能一个分区,数据块没用完,inode没了,或者inode没用完,datablock用完了

磁盘结构

磁盘物理结构

磁盘是计算机上唯一的一个机械设备,同时还是外设->非常慢(相对于cpu/内存)
磁头和盘面是没有挨着的,但是距离依旧很近:好比波音747距离地面一米飞行

对数据做写入和读取:更改基本元素的南北磁极
![[基础IO 2023-11-17 10.43.58.excalidraw|900]]

![[Pasted image 20230325115202.png]]

向磁盘写入:N->S
删除磁盘数据:S->N
所以一旦摩擦生热,就会消磁,数据就会丢失了

磁盘的具体物理结构

尝试在硬件上,理解数据的一次读和写
![[基础IO 2023-11-17 11.03.04.excalidraw|900]]

磁盘中存储的基本单元:扇区,一般是512字节(4096个比特位),也有4kb字节的
一般磁盘,所有的扇区,都是512字节
半径相同的所有扇区,构成一圈"磁道"(多个面的相同磁道形成一个柱面)
在一面上,如何在硬件上定位一个扇区呢?
首先定位哪一个面:只需要确定用哪一个磁头读取,磁头的编号表示的就是哪一个面
然后:

  1. 先定位在哪一个磁道->由半径决定
  2. 再确定在该磁道的哪一个扇区->根据扇区的编号来定位一个扇区

磁头 head->柱面(磁道) cylinder->扇区 sector
CHS定位法

而一个普通文件(属性+数据) ->都是数据(0/1) -> 无非就是占用一个或者多个扇区,来进行自己的数据存储的.
我们既然能够用CHS定位任意一个扇区,我们就肯定能定位多个扇区,从而将文件从硬件角度,进行读取或者写入

磁盘结构的逻辑抽象

根据以上内容,如果OS能够得知任意一个CHS地址,就能访问任意一个扇区
但是OS内部不是直接使用的CHS地址
为什么?

  1. OS是软件,硬件定位一个地址是用得CHS,但是,如果OS直接用了这个地址,万一硬件变了,OS也要发生变化.OS要和硬件做好解耦工作
  2. 即便是扇区,512字节,单位IO的基本数据量也是很小的,硬件是按照512字节处理,OS实际进行IO,基本单位是4KB(可以调整->通过编译linux源代码),因此我们把磁盘叫做块设备. 所以OS需要一套新的地址来进行块级别的访问

我们将圆形的磁盘盘面想象为一个线性结构:
![[基础IO 2023-11-17 21.12.02.excalidraw|900]]

可是我们磁盘只认CHS
所以我们需要让LBA和CHS互相转换

通过简单的数学运算就可以做到:
伪代码:
假设两个面,每个面5000个扇区,每个磁道500扇区
LBA:6500
C:6500/1000 = 6 (6号磁道)
H:int n = 6500/5000 = 1 (所以在第二面)
S:6500%1000 = 500(第500扇区)
连续读取8个扇区,我们就能得到块了

OS要管理磁盘,就将磁盘看作一个大数组,所以对磁盘的管理,就变成了对数组的管理

先描述,再组织!!!

文件系统

![[基础IO 2023-11-17 21.40.52.excalidraw|900]]

接下来我们谈的都是一个分区:(分区就类似与win的"分盘: C盘,D盘…")
![[Pasted Image 20231117214219_277.png]]

文件 = 内容 + 属性

最终都要以块的形式,保存在磁盘的某个位置
Linux是将内容和属性分离的

BootBlock

与系统的开机有关

SuperBlock

文件系统的所有属性信息

  1. 文件系统的类型
  2. 整个分组的情况
    为什么每个分组都可能有SB,而且是统一更新的:

是为了防止SB区域坏掉,如果出现故障,整个分区就不可以被使用了,所以要做好备份
(多副本保证分区安全)

GroupDescriptorTable

GDT -> 组描述符–改组内的详细统计等属性信息

inode table

一般而言,一个文件内部所有属性的集合,我们称之为inode节点(128字节),一个文件,有一个inode
即便是一个分区,内部也会存在大量的inode节点
一个group需要有一个区域来专门保存该group内所有文件的inode节点–>inode table
分组内部可能会存在多个inode,所以需要将inode区分开来,每一个inode都会有自己的inode编号
inode编号也属于对应文件的属性id

DataBlocks

一个文件的内容是变化的,我们是用数据块来进行文件内容的保存的,所以一个有效文件,要保存内容,就需要[1,n]个数据块
如果有多个文件,就需要更多的数据块,DataBlocks
Linux查找一个文件,首先是要根据inode编号,来进行文件查找,包括读取内容

struct inode
{int number;//...int blocks[NUM];//先简单理解,对应的就是该文件对应的数据块的编号
}

所以一个inode对应一个文件,该文件inode属性和该文件blocks内容(数据块->4kb)是有映射关系的

inodeBitmap

inode bitmap的每一个bit表示inode是否空闲可用
4kb(一个块):4096*8 = 32768(比特位)
1表示inode正常工作,0表示inode不正常工作

blockBitmap

block bitmap的每一个bit表示datablock是否空闲可用

ls -il//显示文件的inode编号

linux中的inode 和文件名

linux系统只认inode号,inode属性中文件,并不存在文件名!
文件名是给用户用的
->重新认识目录:

  1. 目录是文件吗–是
  2. 目录有inode以及内容吗–有
  3. 任何一个文件,一定是在一个目录内部,所以目录的内容是什么呢?数据块,目录的数据块里面保存的是该目录下文件名和文件inode编号对应的映射关系,在目录内,文件名和inode互为key值
  4. 当我们访问一个文件的时候,我们是在特定目录下访问的,基本流程是:
    1. cat log.txt 先要在当前目录下,找到对应的inode编号
    2. 一个目录也是一个文件,一定隶属于一个分区,结合inode,在该分区中找到分组,在该分组中inodetable中找到inode
    3. 通过inode和对应的datablock关系找到对应的数据块,并加载到OS,并显示到显示器

如何理解文件的增删查改

常识:删除数据比拷贝数据快多了
做法:

  1. 根据文件名->inode number
  2. inode number -> inode属性中的映射关系,设置block bitmap 对应的比特位置0
  3. inode number 设置inode bitmap 对应的比特位为0
    删文件只需要修改位图即可

补充细节

1.如果文件误删了,我们该怎么办?

正确的做法:什么都不要干,使用某种软件找到这个文件的inode编号,首先在分组中对应的inodebitmap对应位置置为1,再查找inode表对应的数据块bitmap置为1,然后查找数据块,就能恢复出来了

2.inode确定分组,inode number是在一个分区内有效,不能跨分区

举个例子,一个分区内,有100个分组,每个分组有100个inode编号,当inode是250号的时候,我们就能推算出他是在第三组的

3.上面我们学到的分区,分组,填写系统属性->谁做的呢?什么时候做的呢

是操作系统做的,是在分区完成之后,后面要让分区能够正常使用,我们要用格式化
格式化的过程,其实是OS向分区写入文件系统的管理属性信息

冷门知识:
大型公司更换磁盘,其中的磁盘不能随意流向市场,必须被销毁

4.我们如果inode只是单单地用数组和datablock的映射关系

假设inode里的数组大小是15*4kb,是不是意味着一个文件内容最多放入60kb呢

struct inode
{int inode number;int ref_count;mode_t mode;int uid;int gid;int size;data;//...block datablock[NUM];
}

![[基础IO 2023-03-25 17.15.44.excalidraw|900]]

5.有没有可能一个分区,数据块没用完,inode没了,或者inode没用完,datablock用完了

有可能
这样确实可能会存在资源浪费,但是没什么大影响

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

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

相关文章

服务器端请求伪造(SSRF)

概念 SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造形成的由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要攻击目标网站的内部系统。(因为内部系统无法从外网访问,所以要把目标网站当做中间人来…

reset函数的使用

在C中,"reset"函数用于智能指针和一些类的成员函数,作用是重新设置对象的状态,释放原有资源并可能分配新的资源。下面分别是从智能指针和一般的类成员函数两个方面解释: 智能指针的 reset 函数: 在 C 中&a…

Thinkphp6实现定时任务功能

本文主要介绍命令启动定时任务的功能,按照CRMEB标准版的程序为大家详细的进行实现过程的介绍 首先创建安装Worker,执行composer require topthink/think-worker 安装在config/console.php中定义指令 timer > \crmeb\command\Timer::class 3. 对应图1…

C++ Qt 学习(八):Qt 绘图技术与图形视图

1. 常见 18 种 Qt 绘图技术 1.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <memory> #include <QTreeView> #include "CPaintWidget.h"using namespace std;class Widget : public QWidget {Q_OBJECTpublic:Widget…

使用Python实现3D曲线拟合

曲线拟合是数据分析和数学建模领域中广泛使用的技术。它涉及到寻找最接近一组数据点的数学函数的过程。在3D曲线拟合中&#xff0c;该过程被扩展到三维空间&#xff0c;其中的目标是找到最好地表示一组3D数据点的函数。 Python是一种用于科学计算的流行编程语言&#xff0c;它…

暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

RPA暖阳脚本 近日&#xff0c;来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation&#xff08;APA&#xff09;&#xff0c;结合大模型智能体帮助人类进行工作流构建&#x…

QT下使用QChart绘制曲线

目录 头文件内容构造函数AddSeries方法UpdateSeries方法AppendSeriesData方法SetLegendVisiableSetRubberBandCPP内容测试函数 需要用到的头文件&#xff1a; #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QValueAxis> #…

广西南宁新能源汽车电机定子三维扫描3D尺寸测量检测-CASAIM中科广电

一、背景介绍 电机定子压圈是一种用于电机上对电机定子的两端进行固定的辅助装置&#xff0c;在电机制造业中&#xff0c;电机定子制造的工艺水平往往能够直接决定电机制造的性能质量。而传统电机定子检测主要通过三坐标测量以及人工卡尺测量两种测量方式&#xff0c;三坐标每…

在服务器上部署MVC 6应用程序

在服务器上成功部署MVC 6应用程序&#xff08;现在更为称为ASP.NET Core MVC&#xff09;涉及一系列步骤。以下是一般的指导步骤&#xff1a; 1. 准备服务器环境&#xff1a; - 确保服务器上安装了.NET Core Runtime和.NET Core SDK。可以从[.NET下载页面](https://dotnet.mi…

在Vue3中使用Element-Plus分页(Pagination )组件

开发过程中数据展示会经常使用到&#xff0c;同时分页功能也会添加到页面中。 记&#xff1a;在Vue3中使用Element-Plus分页组件与表格数据实现分页交互。 开始实现 引入表格和分页组件的H5标签。 <strong>Element-Plus分页组件使用</strong> <div><el-t…

【LeetCode刷题】--9.回文数

9.回文数 class Solution {public boolean isPalindrome(int x) {if(x < 0){return false;}int tmp x, sum 0;boolean flag false;while(x ! 0){sum sum * 10 x % 10;x / 10;}if(sum tmp){flag true;}return flag;} }

Ubuntu端口用法介绍

一、端口概述 端口是用于网络通讯中标识应用程序的通信机制。在Ubuntu系统中&#xff0c;共有65536个端口。 其中&#xff0c;0号端口保留&#xff0c;1-1023为系统端口&#xff0c;一般被系统进程或服务占用。1024-49151为注册端口&#xff0c;可以被用户进程或服务使用。49…

nvm的下载与使用

1.如果已经安装nodejs , 先卸载nodejs; 从控制面板中 卸载程序 卸载nodejs win r打开cmd ,管理员运行 where node 查看是否删除干净nodejs 2.下载nvm 从github 下载nvm , 下载nvm 3.nvm 和node安装路径最好写在同一个路径下 &#xff0c;如D盘 ,D\a\nvm , D\a\nodejs 4.…

算法之路(二)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 算法小能手 &#x1f606;今日分享 : 你知道北极熊的皮肤是什么颜色的吗&#xff1f;&#xff08;文章结尾有答案哦&#xff01;&#xff09; 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路&#xff1a…

力扣:172. 阶乘后的零(Python3)

题目&#xff1a; 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…

单链表相关面试题--3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

/* 解题思路&#xff1a; 通过快慢指针找到中间节点&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff0c;当快指针走到结尾的时候&#xff0c;慢指针正好走到中间位置 */ typedef struct ListNode Node; struct ListNode* middleNode(struct ListNode* head)…

后端接口测试,令牌校验住,获取tocken 接口的方式

post : http://127.0.0.1:端口号/login { "username":"admin", "password":"admin123", "code":"3", "uuid":"966c34e409434f15942ec29a284da0a6" } headers tocken false

Vue3-provide 和 inject 跨组件传递数据

Vue3-provide 和 inject 跨组件传递数据 功能&#xff1a;将数据从App组件跨过一个组件传递到B组件中provide&#xff1a;提供数据inject&#xff1a;接收数据 // App.vue <template><h2>我是App组件&#xff08;{{num}}&#xff09;</h2><A></A&g…

软件测试/测试开发/人工智能丨视觉与图像识别自动化测试

视觉与图像识别在软件自动化测试领域中的应用是越来越重要的一项技术&#xff0c;它使得测试可以更全面、准确地模拟用户对图形用户界面&#xff08;GUI&#xff09;的交互。以下是视觉与图像识别在软件自动化测试中的主要应用&#xff1a; 1. 自动化 GUI 测试 视觉与图像识别…

服务器IPMI管理操作

简介&#xff1a;智能平台管理界面&#xff08;IPMI&#xff0c;Intelligent Platform Management Interface)是管理基于 Intel 结构的企业系统中所使用的外围设备采用的一种工业标准&#xff0c;用户可以利用IPMI监视服务器的物理健康特征&#xff0c;如温度、电压、风扇工作状…