【Linux】文件系统|CHS寻址|LBA逻辑块|文件索引|inode|Date block|inodeBitmap|blockBitmap

前言 

一个进程通过文件描述符标识一个打开的文件,进程拿着文件描述符可以在内核中找到目标文件进行读写等操作。这是打开的文件,而没有被打开的文件存储在磁盘中,是如何管理的?操作系统在偌大的磁盘中如何找到想要的文件并打开的?

磁盘

磁盘是计算机的主要存储介质,可以存储大量的二进制文件

 

磁盘的构造

  • 磁盘由多个盘片组成,每个盘片有两面,称为盘面;
  • 磁臂带动磁头读取盘面上的信息;
  • 每个盘面有个专门负责读取数据的磁头;

磁盘的存储结构

每个盘面由一组磁道组成的同心圆组成;

  • 扇区:将盘片分为多个扇形,每个扇形和每个磁道相交产生的区域就被叫做扇区。一个盘面上每个磁道所包含的扇区个数是相同的,同样给每个扇区编号。
  • 磁盘的基本读写单位是扇区,扇区大小一般是 512字节(512byte) 

 

扇区是磁盘的最小存储单元。但是如果以扇区来读取数据效率太慢了;

所以文件系统把多个扇区组成一个块(逻辑块)每个块占4kb的字节大小(包含八个扇区)。

每次读写就是按块来读写,提高了整体的读写效率。
注:扇区是磁盘的最小存储单位而不是读取数据的最小单位; 块才是。

CHS寻址

通过 柱面Cylinder —— 磁头Head —— 扇区Sector 进行寻址;

  1. 找到目标扇区所在的盘面。
  2. 找到目标扇区所在的磁道。
  3. 在磁道中确定哪一个扇区。

每个扇区的大小是512K字节,所以内磁道的扇区密度高,外磁道的扇区密度低。

磁盘的抽象存储结构

1:将磁盘想象成一个线性的连续数组,每个元素对应着一个盘面 ;

2:再将某一盘面划分成诺干个大小相同的磁道,于是整个数组的最小元素就变成了磁道;

3:再将每个磁道划分为诺干个大小相同的扇区,于是整个数组的最小元素就变成了一个扇区。

现在整个数组就是磁盘中所有扇区的集合

每个元素都对应着一个扇区的地址,每一个扇区都有唯一的一个下标映射。

我们想要找某一个扇区,只需要用它在数组中的下标就能找到该扇区的CHS。具体计算方法如下:

        假设每个磁道上有100个扇区,每个盘面有100个磁道。现在想找到下标index=50505对应的扇区的CHS地址:

  • 根据假设信息,一个盘面有100*100=10000个扇区。
  • 盘面位置(H)=index/10000=5,即该扇区在第五盘面。
  • 磁道位置( C)=(index%10000)/100=5,即该扇区在第五盘面的第五磁道上。扇区位置(S)=index%100=5,
  • 所以该扇区位置在第五盘面的第五磁道的第五个扇区的位置。

LBA地址 

上面说了,依靠扇区来读取数据太慢了,有了块之后按照刚刚的抽象方式将磁盘按块划分得到的数组每个元素表示4KB(八个扇区);

每个块的起始地址成为LBA(Logical Block Address)逻辑块地址;其实也就是每个块的第一个扇区地址;

 

文件系统 

一个磁盘几百G,如果按照4KB方式管理也太多了;

采用分治思想,将磁盘划分成一个个区域,每个区域又划分成组来管理

 

启动块Boot Block存放的是操作系统的核心数据,每当计算机开机都需要先从Boot Block读取数据才能正常启动。 

每个Block group里都存着以下信息:

  • Super Block(超级块):存放文件系统本身的结构信息。可以说整个文件系统结构就被破坏了。多个组都有 ,但不一定是每个组都有。是为了防止磁盘被刮伤而找不到文件属性。
  • GDT,Group Descriptor Table(块组描述符):记录该分组中inode和数据块的使用率
  • Block Bitmap(块位图):记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用(用0,1表示)。
  • inode Bitmap:每个bit表示一个inode是否空闲可用。
  • inode Table:存放文件属性 如 文件大小,所有者,最近修改时间等
  • Data blocks 数据区:存放文件内容;

文件的属性就放在一个叫inode的结构体中,文件的内容就放在数据块中。 

struct inode
{int id;mode_t mode;size;.......int inode_number; // 唯一的inode编号 与文件的映射关系//存储了当前文件使用的数据块int dateblock[15];
}

 

一个文件的所有属性都在inode中,但是没有文件名。

原因:

        文件名长度不确定,不利于用一个统一空间的角度看待inode。如果每个文件的inode大小都不一样,不利于读取inode信息

查找一个文件的时候,统一使用的是:inode编号。

目录

目录的data blocks中存放的是:它所包含文件的文件名和对应的inode

  • 一个目录中,可以包含多个文件,但是这些文件的名字不能重。
  • 目录也是文件,它也有自己的inode,也有自己的数据块。

总结:

文件名不属于文件的属性,也不存在于inode中! 

        文件名存在于目录中,而不存在于文件本身。我们通过目录来访问文件名,本质是去目录文件中,通过文件名找到对应的inode编号,然后再访问到文件。

比如说现在通过路径/usr/bin/ls来访问一个文件,其过程为:

  1. 先在根目录中找到文件名usr对应的inode编号
  2. 访问文件usr,在文件usr中找到文件名bin对应的inode编号
  3. 访问文件bin,在文件bin中找到文件名ls对应的inode编号
  4. 访问文件ls

 文件索引

 inode中用来记录数据块的地址是一个Date blocks数组,内部的元素个数是确定的,一般是15个。如果直接指向元素,显然是不够的;

Date blocks中并非所有元素都直接映射一个数据块,会根据实际情况建立二级索引,三级索引:

  • 二级索引:每一个元素对应着一张数据块表,表中的内容才是真正的数据块的位置;
  • 三级索引:指向的数据块1会指向别的数据块2,数据块2指向的才是存储文件内容;

 inode与文件的关系(增删查改)

创建文件

  • 创建文件会先在inode bitmap中找到第一个为0(未被使用)的i弄得,置为1;
  • 将文件的属性写入到inode bitmap中;
  • Date Block 会分配空间给文件,还会将文件名和inode映射关系写到上级目录的Date Block中,且将Block Bitmap中对应位置的0置为1;

删除文件

  • 根据文件名和inode的映射关系,找到对应的inode;
  • 根据inode找到数据块所对应的inode Bitmap,置0;
  • Block Bitmap中将对应的位置置0;

文件的删除并不会去清理磁盘上数据块中的内容,只是将对应的位图清0,后续再来的内容进行覆盖就可以。这也是为什么拷贝一个文件比较慢,但是删除一个文件很快的原因。

 查找文件

inode Table中查找到文件对应的struct inode ;

  • 通过inode中的dateblock数组找到文件的dateBlock进行访问文件内容
  • 通过inode的其它内容访问文件属性

向文件写入

  • 找到映射关系中文件所对应的inode;
  • 根据inodedateblock数组,找到存放内容的数据块进行数据写入,如果有发生数据块数量变化,应相应在Block Bitmap位图中相应改变;
  • 再修改inode中对应的属性信息

 

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

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

相关文章

【有哪些GPU算力租用平台值得推荐】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

开放式耳机会成为未来的主流吗?开放式耳机推荐指南

开放式耳机是否会成为未来的主流,是一个值得探讨的问题。 从目前的市场趋势和技术发展来看,有一些因素支持开放式耳机可能成为主流。 一方面,人们对于健康和舒适的关注度不断提高。长时间佩戴传统耳机可能导致耳部不适,而开放式…

java通过poi解析word入门

文章目录 介绍一、了解word docx文档的结构二、引入POI的依赖三、解析Word文档常用API加载Word文档获取文档整体结构获取文档中的段落获取文档中的表格获取文档中的脚注 四、解析Word中的段落示例五、读取Word文档并遍历图片六、解析Word中的图片示例 介绍 Apache POI 是一个处…

AI绘画入门实践|Midjourney:使用 --no 去除不想要的物体

在 Midjourney 中,--no 作为反向提示词,告诉 MJ 在生成图像时,不要包含什么。 使用格式:--no 对应物体提示词(多个物体之间使用","间隔) 使用演示 a web banner, summer holiday --v 6.0 a web b…

[MySQL][深入理解隔离性][下][Read View]详细讲解

目录 1.Read View1.是什么?2.理解3.整体流程 2.RR与RC的本质区别1.当前读和快照读在RR级别下的区别2.RR与RC的本质区别 1.Read View 1.是什么? Read View就是事务进行 快照读 操作的时候生产的 读视图(Read View),在该事务执行快照读的那一…

C语言 #指针数组 #数组指针 #数组参数、指针参数

文章目录 前言 一、指针数组 1、概念: 2、指针数组有什么用呢? 二、数组指针 1、数组指针的定义 2、数组名与 &数组名 的区别 3、数组指针如何初始化? 4、数组指针的用法 三、根据代码区分 指针数组 和 数组指针 四、数组参数、指针参数 …

VLAN通讯实验

目录 拓扑图 需求 需求分析 配置过程 1、手工配置 2、 使用DHCP获得IP地址信息 3、测试全网是否可达 拓扑图 需求 1、PC1、PC3属于VLAN 2 2、PC2、PC4属于VLAN 3 3、通过DHCP使得PC获取IP地址信息 4、全网可达 需求分析 1、先手工配置网段,VLAN 2为192.168.1…

在invidia jetpack4.5.1上运行c++版yolov8(tensorRT)

心路历程(可略过) 为了能在arm64上跑通yolov8,我试过很多很多代码,太多对库版本的要求太高了; 比如说有一个是需要依赖onnx库的,(https://github.com/UNeedCryDear/yolov8-opencv-onnxruntime-cpp) 运行成功了报错error: IOrtSessionOptionsAppendExecutionProvider C…

【网络安全的神秘世界】文件包含漏洞

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 一、概述 文件包含:重复使用的函数写在文件里,需要使用某个函数时直接调用此文件,而无需再…

使用代理IP进行本地SEO优化:如何吸引附近的客户?

在今天竞争激烈的互联网时代,如何利用代理IP进行本地SEO优化并吸引附近的客户已经成为许多企业和网站面临的关键挑战。本文将探讨使用代理IP的策略和技巧,以帮助公司提高在本地市场的可见性和吸引力,从而扩大本地客户群体。 1. 代理IP在本地…

打卡第24天------回溯算法

表达一下自己每天的刷题想法。希望我刷完代码随想录,自己的进步能有大幅度的提升。 一、复原IP地址 leetcode题目链接:93.复原IP地址 题目描述: 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 . 来形成。…

Blackbox AI-跨时代AI产物,你的私人编程助手

1. 引言 随着人工智能技术的飞速发展,我们的生活方式正在经历前所未有的变革。从智能家居到自动驾驶,AI已经渗透到我们生活的方方面面。而在这场科技革命中,Blackbox 网站凭借其先进的技术和全面的功能,成为了众多AI产品中的佼佼者…

ubuntu一些好用的开发工具及其配置

1 终端模糊搜索fzf https://github.com/junegunn/fzf 输入某命令,比如 conda ,按下ctrlR,会显示和该命令匹配的历史命令的列表 有了这个工具再也不用记忆太复杂的命令,只需要知道大概几个单词,输入即可搜索。 其搜索…

基于SVPWM的霍尔传感器FOC实现过程

FOC算法笔记 起源:使用ST WorkBench配置的HALL BLDC控制算法抖动严重。 ST的电机控制算法,代码非常高端大气,值得学习。 HAL库与LL库混用,效率很高。很多中断回调都直接重写了,没有使用HAL库那一套。 只是好多地方…

JavaScript关键词

JavaScript 关键词 JavaScript 语句常常通过某个关键词来标识需要执行的 JavaScript 动作。 下面的表格列出了一部分将在教程中学到的关键词: 关键词 描述 break 终止 switch 或循环。 continue 跳出循环并在顶端开始。 debugger 停止执行 JavaScript&…

matplotlib 画图函数,最常用的

并排显示2个图片 import os import numpy as np from PIL import Image import matplotlib.pyplot as pltimage1 Image.open(a.png) image2 Image.open(a2.png)# Create a figure with two subplots (1 row, 2 columns) fig, axes plt.subplots(1, 2, figsize(10, 5))# Di…

双非二本毕业生如何进入嵌入式系统领域?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 二本的话学历上会吃点亏…

docker Docs相关使用文档链接

Docker Docshttps://docs.docker.com/ docker compose | Docker Docshttps://docs.docker.com/reference/cli/docker/compose/docker | Docker Docshttps://docs.docker.com/reference/cli/docker/

axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个,一是设置全局config,比如请求的基础路径,超时时间等,第二点是在每次…

MySQL零散拾遗(四)--- 使用聚合函数时需要注意的点点滴滴

聚合函数 聚合函数作用于一组数据,并对一组数据返回一个值。 常见的聚合函数:SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用:计算指定字段在查询结果中出现的个数(不包含NULL值&#…