【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距离地面一米飞行
对数据做写入和读取:更改基本元素的南北磁极
![![[Pasted image 20230325115202.png]]](https://img-blog.csdnimg.cn/928747a0b700444aa2b7633c9d208a92.png)
向磁盘写入:N->S
删除磁盘数据:S->N
所以一旦摩擦生热,就会消磁,数据就会丢失了
磁盘的具体物理结构
尝试在硬件上,理解数据的一次读和写
![![[基础IO 2023-11-17 11.03.04.excalidraw|900]]](https://img-blog.csdnimg.cn/572eed04109c43d880d4888d3b8f5aef.png)
磁盘中存储的基本单元:扇区,一般是512字节(4096个比特位),也有4kb字节的
一般磁盘,所有的扇区,都是512字节
半径相同的所有扇区,构成一圈"磁道"(多个面的相同磁道形成一个柱面)
在一面上,如何在硬件上定位一个扇区呢?
首先定位哪一个面:只需要确定用哪一个磁头读取,磁头的编号表示的就是哪一个面
然后:
- 先定位在哪一个磁道->由半径决定
- 再确定在该磁道的哪一个扇区->根据扇区的编号来定位一个扇区
磁头 head->柱面(磁道) cylinder->扇区 sector
CHS定位法
而一个普通文件(属性+数据) ->都是数据(0/1) -> 无非就是占用一个或者多个扇区,来进行自己的数据存储的.
我们既然能够用CHS定位任意一个扇区,我们就肯定能定位多个扇区,从而将文件从硬件角度,进行读取或者写入
磁盘结构的逻辑抽象
根据以上内容,如果OS能够得知任意一个CHS地址,就能访问任意一个扇区
但是OS内部不是直接使用的CHS地址
为什么?
- OS是软件,硬件定位一个地址是用得CHS,但是,如果OS直接用了这个地址,万一硬件变了,OS也要发生变化.OS要和硬件做好
解耦工作- 即便是扇区,512字节,单位IO的基本数据量也是很小的,硬件是按照512字节处理,OS实际进行IO,基本单位是4KB(可以调整->通过编译linux源代码),因此我们把磁盘叫做
块设备. 所以OS需要一套新的地址来进行块级别的访问
我们将圆形的磁盘盘面想象为一个线性结构:
![![[基础IO 2023-11-17 21.12.02.excalidraw|900]]](https://img-blog.csdnimg.cn/9035f1d69e2940a8b1cb7341ab9bb293.png)
可是我们磁盘只认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]]](https://img-blog.csdnimg.cn/d816891844984404aae73c44756fcaef.png)
接下来我们谈的都是一个分区:(分区就类似与win的"分盘: C盘,D盘…")
![![[Pasted Image 20231117214219_277.png]]](https://img-blog.csdnimg.cn/c8885eb1f8ae4f6b8af7f42c3e92bf63.png)
文件 = 内容 + 属性
最终都要以块的形式,保存在磁盘的某个位置
Linux是将内容和属性分离的
BootBlock
与系统的开机有关
SuperBlock
文件系统的所有属性信息
- 文件系统的类型
- 整个分组的情况
为什么每个分组都可能有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属性中文件,并不存在文件名!
文件名是给用户用的
->重新认识目录:
- 目录是文件吗–是
- 目录有inode以及内容吗–有
- 任何一个文件,一定是在一个目录内部,所以目录的内容是什么呢?数据块,目录的数据块里面保存的是该目录下文件名和文件inode编号对应的映射关系,在目录内,文件名和inode互为key值
- 当我们访问一个文件的时候,我们是在特定目录下访问的,基本流程是:
- cat log.txt 先要在当前目录下,找到对应的inode编号
- 一个目录也是一个文件,一定隶属于一个分区,结合inode,在该分区中找到分组,在该分组中inodetable中找到inode
- 通过inode和对应的datablock关系找到对应的数据块,并加载到OS,并显示到显示器
如何理解文件的增删查改
删
常识:删除数据比拷贝数据快多了
做法:
- 根据文件名->inode number
- inode number -> inode属性中的映射关系,设置block bitmap 对应的比特位置0
- 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]]](https://img-blog.csdnimg.cn/e04fe7ecc6b840ed9651d683f59262f2.png)
5.有没有可能一个分区,数据块没用完,inode没了,或者inode没用完,datablock用完了
有可能
这样确实可能会存在资源浪费,但是没什么大影响
相关文章:
【Linux】C文件系统详解(四)——磁盘的物理和抽象结构
文章目录 磁盘结构磁盘物理结构磁盘的具体物理结构磁盘结构的逻辑抽象 文件系统BootBlockSuperBlockGroupDescriptorTableinode tableDataBlocksinodeBitmapblockBitmaplinux中的inode 和文件名如何理解文件的增删查改删 补充细节1.如果文件误删了,我们该怎么办?2.inode确定分…...
论文-分布式-拜占庭将军问题
目录 0-前言 1-导引 2-不可能性 3将军(1叛徒)问题不存在解/不能达成共识 少于3m1个将军(有m个叛徒)不存在解/不能达成共识 精确一致性与近似一致性是同等困难的 3-使用口头消息的解 “口头消息”的含义 OM(m)算法的步骤 OM(m)算法的正确性推导 4-使用签名消息情况下…...
万字解析设计模式之 适配器模式
一、 适配器模式 1.1概述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。 适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结…...
Linux 安全 - 扩展属性xattr
文章目录 前言一、简介二、扩展属性命名空间2.1 简介2.2 security扩展属性2.3 System扩展属性2.4 Trusted扩展属性2.5 User扩展属性 三、用户空间使用3.1 setfattr/getfattr3.2 setxattr/getxattr/listxattr 参考资料 前言 一、简介 xattr - Extended attributes扩展属性是与…...
spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()或者AOP @Before
1.先说场景,在对mysql数据库表数据插入或者更新时都得记录时间和用户id 传统实现有点繁琐,这里还可以封装一下公共方法。 2.解决方法: 2.1:使用aop切面编程(记录一下,有时间再攻克)。 2.1.1&am…...
我的创作纪念日2048天
机缘 在这特殊的日子里,我要庆祝我的 CSDN 创作纪念日——已经坚持了整整2048天! 在这2048天里,我经历了很多成长和收获。作为一名技术写手,我投入了大量的时间和精力来分享我的知识和经验。我曾经写过关于数据库、数据同步、数…...
MatrixOne实战系列回顾 | 导入导出项目场景实践
本次分享主要介绍MatrixOne导入导出以及项目场景实践。将从四个方向为大家演示MatrixOne的功能,分别是数据的导入、导出、对接数据集成工具,以及Java连接实战。 数据导入会使用三种方式将数据导入至 MatrixOne中。分别是insert语句、load data语句还有s…...
Find My音箱|苹果Find My技术与音箱结合,智能防丢,全球定位
音箱市场规模正在不断扩大。随着人们生活品质的提高,对音乐体验的需求也在不断升级。消费者对于蓝牙音箱的需求,已经从单纯的音质扩展到了功能、设计和价格等多个方面。随着移动化、即时化的视听娱乐需求的增长,蓝牙音箱性能、质量、外观设计…...
51单片机应用
目录 编辑 1. C51的数据类型 1.1 C51中的基本数据类型 1.2 特殊功能寄存器类型 2. C51的变量 2.1 存储种类 1. C51的数据类型 C51是一种基于8051架构的单片机,它支持以下基本数据类型: 位(Bit):可以表…...
系列三、ThreadLocal vs synchronized
一、ThreadLocal vs synchronized 虽然ThreadLocal与synchronized关键字都能用于处理多线程并发访问变量的问题,但是两者处理问题的角度和思路是不一样的。区别如下: 小总结:虽然上一篇中的案例都实现了线程隔离,但是使用ThreadLo…...
封装Redis工具类
基于StringRedisTemplate封装一个缓存工具类,满足下列需求: 方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间 方法2:将任意Java对象序列化为json并存储在string类型的key中&…...
使用 millis() 函数作为延迟的替代方法(电位器控制延迟时间)
接线图: 代码: unsigned long currentMillis 0; unsigned long previousMillis_LED1 0; unsigned long LED1_delay0; unsigned long previousMillis_LED2 0; unsigned long LED2_delay0; #define LED1 3 #define LED2 9 #define P1 A2 …...
MySQL之BETWEEN AND包含范围查询总结
一、时间范围 查询参数格式与数据库类型相对应时,between and包含头尾,否则依情况 当数据库字段中存储的是yyyy-MM-dd格式,即date类型: 用between and查询, 参数yyyy-MM-dd格式时,包含头尾,相当…...
4.3、Linux进程(2)
个人主页:Lei宝啊 愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢? 为什么会出来三个打印呢? 就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct,还有代码和数据,他们…...
element-ui组件输入框之放大镜(搜索图标)
element-ui组件输入框之放大镜(搜索图标 前言一、解决suffix-icon"el-icon-search"绑定事件问题 前言 在使用element-ui组件时想给输入框组件中的放大镜图标也就是搜索图标绑定事件,可以进行如下操作: 一、解决suffix-icon"el-icon-sear…...
[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux
先跑起来 🥊 Python 什么是 Python? Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…...
吴恩达《机器学习》9-4-9-6:实现注意:展开参数、梯度检验、随机初始化
一、实现注意:展开参数 在上一个视频中,讨论了使用反向传播算法计算代价函数的导数。在本视频中,将简要介绍一个实现细节,即如何将参数从矩阵展开为向量。这样做是为了在高级最优化步骤中更方便地使用这些参数。 二、梯度检验 在神经网络中…...
软信天成:如何利用大数据提高客户体验?
当今社会,市场均势正在发生变化,消费者拥有更多的选择和更高的决定权,传统的市场营销技巧注重提高品牌认知度和吸引潜在客户,现在早已过时。经济不确定性弥漫,数字化转型仍是大多数企业的优先选择,新的竞争…...
Vue 路由缓存 防止路由切换数据丢失 路由的生命周期
在切换路由的时候,如果写好了一丢数据在去切换路由在回到写好的数据的路由去将会丢失,这时可以使用路由缓存技术进行保存,这样两个界面来回换数据也不会丢失 在 < router-view >展示的内容都不会被销毁,路由来回切换数据也…...
基于ubuntu20.04安装ros系统搭配使用工业相机
基于ubuntu20.04安装ros系统搭配使用工业相机 1. ROS系统安装部署1.1更新镜像源1.1.1 备份源文件1.1.2 更新阿里源1.1.3 更新软件源 1.2 ros系统安装1.2.1 添加ros软件源1.2.2 添加秘钥1.2.3 更新软件源1.2.4 配置及更换最佳软件源1.2.5 ROS安装1.2.6 初始化rosdep1.2.7 设置环…...
YOLO11涨点优化:Loss魔改 | Alpha-IoU 暴力替换CIoU,通过幂指数调节放大高IoU样本的梯度,提升定位精度
写在前面 做目标检测的朋友,想必都有过这样的经历:模型在COCO上mAP看着还不错,但在自己的业务数据集上定位精度就是上不去。换backbone、加注意力、调数据增强——一套操作下来,mAP涨了0.3个点,但边界框回归误差(L1/L2/GIoU metrics)几乎纹丝不动。 问题的根儿,往往出…...
【收藏级】2026年大模型入门指南:小白程序员必看,告别AI焦虑,轻松切入AI行业
这篇文章想聊清楚一个很现实的问题:在2026年AI热潮愈演愈烈的今天,小白和程序员到底该怎么低成本进入AI行业? 如果你最近也在焦虑、在内耗,刷到各种AI热点就心慌,不知道该学什么、不知道该怎么开始,甚至担心…...
微软RD-Agent:自动化数据驱动研发的自主智能体框架实战指南
1. 项目概述:一个面向数据驱动研发的自主智能体框架如果你是一名数据科学家、量化研究员或者机器学习工程师,每天的工作是不是都围绕着“找数据、提特征、建模型、调参数、看结果”这个循环?这个过程充满了创造性的探索,但也伴随着…...
手把手教你用FPGA实现“智能”以太网协议栈:自动应答ARP/ICMP,用户只需管UDP
FPGA以太网协议栈的智能封装:让UDP通信像串口一样简单 在物联网和边缘计算爆发的今天,FPGA作为硬件加速的重要载体,正越来越多地需要直接接入网络。但传统FPGA网络协议栈开发存在两大痛点:一是需要手动处理ARP、ICMP等底层协议&am…...
终极指南:如何让老款RTX显卡免费享受FSR3帧生成技术
终极指南:如何让老款RTX显卡免费享受FSR3帧生成技术 【免费下载链接】dlssg-to-fsr3 Adds AMD FSR 3 Frame Generation to games by replacing Nvidia DLSS Frame Generation (nvngx_dlssg). 项目地址: https://gitcode.com/gh_mirrors/dl/dlssg-to-fsr3 还在…...
UPD720201-K8-701 是瑞萨电子(Renesas Electronics)推出的 USB 3.0 主机控制器芯片,广泛用于需要高速数据传输和多端口扩展的设备中,支持 xHCI 1.0
UPD720201-K8-701 是瑞萨电子(Renesas Electronics)推出的 USB 3.0 主机控制器芯片,广泛用于需要高速数据传输和多端口扩展的设备中,支持 xHCI 1.0 与 PCIe Gen2 接口标准。 核心参数: 接口标准:US…...
R-KV分布式键值存储:基于Raft与Multi-Raft的架构设计与工程实践
1. 项目概述与核心价值最近在分布式存储和缓存领域,一个名为R-KV的项目引起了我的注意。这个项目由 Zefan-Cai 发起,定位为一个“基于 Raft 共识算法的分布式键值存储系统”。听起来是不是有点耳熟?没错,它瞄准的是类似 etcd、TiK…...
3分钟在Windows上安装安卓应用:APK-Installer终极完整指南
3分钟在Windows上安装安卓应用:APK-Installer终极完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行安卓应用,…...
PCB设计避坑指南:强电220V与弱电信号的安全间距到底留多少?(附FR4材料实测)
PCB设计避坑指南:强电220V与弱电信号的安全间距实战解析 在嵌入式硬件开发中,强弱电共板设计就像走钢丝——既要保证功能完整,又要确保安全可靠。去年我们团队就遇到过这样一个案例:某智能家居控制板在测试阶段突然冒烟࿰…...
AISMM评估结果总被质疑?用这6类动态交互图表让评审专家当场签字认可
更多请点击: https://intelliparadigm.com 第一章:AISMM模型评估数据可视化的核心价值与挑战 AISMM(Adaptive Intelligent Semantic Modeling and Monitoring)模型在工业智能诊断、金融风控建模及多模态语义理解等场景中日益关键…...

![![[基础IO 2023-11-17 10.43.58.excalidraw|900]]](https://img-blog.csdnimg.cn/519029e8e19b4003857557fa8c0f4006.png)