【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

访问任何一个文件,都要提供路径,这个路径要么是用户直接提供,要么由进程提供。

环境遍历PATH,cwd 都是记录了路径; 

 

 文件索引

 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://www.rhkb.cn/news/384720.html

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

相关文章

Redis从入门到超神-(十二)Redis监听Key的过期事件

前言 试想一个业务场景,订单超过30分钟未支付需要做自动关单处理,修改订单状态,库存回退等,你怎么实现?方案一:可以使用定时任务扫表,通过支付状态和下单时间来判断是否支付过期。但是这样的方案是非常消耗…

Modbus转BACnet/IP网关BA100-配硬件说明

在现代自动化系统中,不同设备和系统之间的通信至关重要,Modbus和BACnet/IP协议虽然各有优势,但它们之间的直接通信存在障碍。钡铼Modbus转BACnet/IP网关作为连接这两种协议的桥梁,允许不同系统之间的无缝数据交换。 一、Modbus转…

如何避免蓝屏?轻量部署,安全和业务连续性才能两不误

自19日起,因CrowdStrike软件更新的错误配置而导致的“微软全球蓝屏”,影响依然在持续。这场被称为“史上最大规模的IT故障”,由于所涉全球企业太多,专家估计“蓝屏”电脑全部恢复正常仍需时日。 尽管 CEO 乔治 库尔茨&#xff08…

C++自定义字典树结构

代码 #include <iostream> using namespace std;class TrieNode { public:char data;TrieNode* children[26];bool isTerminal;TrieNode(char ch){data ch;for (int i 0; i < 26; i){children[i] NULL;}isTerminal false;} }; class Trie { public:TrieNode* ro…

matlab仿真 模拟调制(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第五章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all ts0.001; t0:ts:10-ts; fs1/ts; dffs/length(t); msgrandi([-3 3],100,1); msg1msg*ones(1,fs/10); msg2reshape(ms…

for循环计算1~100之间3的倍数的数字之和

你要计算1~100之间的数字先得打印出来1~100之间的数字然后在判断是不是3的倍数然后在打印出数字&#xff0c;代码如下 #include<stdio.h> int main() {int i 0;for (i 1; i < 100; i){if (i % 3 0){printf("%d ", i);}}return 0; }

Java漏洞复现(ctfshow279-297)strust 漏洞复现及原理解释

Java漏洞复现 Strust原理 JavaEE--------Struts2框架-CSDN博客 Web279 struts2漏洞 S2-001是当用户提交表单数据且验证失败时&#xff0c;服务器使用OGNL表达式解析用户先前提交的参数值&#xff0c;%{value}并重新填充相应的表单数据。 这里的%{value}简单理解就是和flask的…

7月22日学习笔记 文件共享服务nfs,SAMBA文件共享与DNS域名服务

任务背景 由于业务驱动&#xff0c;为了提⾼⽤户的访问效率&#xff0c;现需要将原有web服务器上的静态资源 ⽂件分离出来&#xff0c;单独保存到⼀台⽂件服务器上。 任务要求 1. ⼀台应⽤服务器web-server部署apache&#xff0c;静态⽹⻚资源存放在另外⼀台NFS服 务器上 …

Vue3相比于Vue2进行了哪些更新

1、响应式原理 vue2 vue2中采用 defineProperty 来劫持整个对象&#xff0c;然后进行深度遍历所有属性&#xff0c;给每个属性添加getter和setter&#xff0c;结合发布订阅模式实现响应式。 存在的问题&#xff1a; 检测不到对象属性的添加和删除数组API方法无法监听到需要对…

监控Windows文件夹下面的文件(C#和C++实现)

最近在做虚拟打印机时&#xff0c;需要实时监控打印文件的到达&#xff0c;并移动文件到另外的位置。一开始我使用了线程&#xff0c;在线程里去检测新文件的到达。实际上Windows提供了一个文件监控接口函数ReadDIrectoryChangesW。这个函数可以对所有文件操作进行监控。 ReadD…

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

目标检测自顶向下入门

最近在学习Yolo和OpenCV这些计算机视觉的相关领域&#xff0c;把深度学习啃了个大概&#xff0c;准备着手学习一下Yolov5&#xff0c;趁着这个机会入门一下目标检测这个领域&#xff0c;也算是自顶向下地学习一遍吧。 目标检测 什么是目标检测 物体识别&#xff08;Object de…

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

X-AnyLabeling标注软件使用方法

第一步 下载 官方X-AnyLabeling下载地址 github&#xff1a;X-AnyLabeling 第二步 配置环境 使用conda创建新的虚拟环境 conda create -n xanylabel python3.8进入环境 conda activate xanylabel进入X-AnyLabeling文件夹内&#xff0c;运行下面内容 依赖文件系统环境运行环…

多多OJ评测系统 在前端脚手架Vue-Cli中设置页面路由

目录 设置页面路由 我们把菜单上的路由改成读取路由文件 设置成export 导出路由 在刚刚的原始路由 index.ts中导入就行了 在这边引入我们的路由文件 我们之后点击菜单 我们的路由文件是这样的 但是没有跳转 写一下事件 接下来要同步路由到菜单项 自己定义监听函数 …

Hadoop3.3.5的安装与单机/伪分布式配置

文章目录 一、安装须知二、安装jdk三、安装shh四、安装配置hadoop五、运行hadoop 一、安装须知 本次安装的Hadoop版本为hadoop3.3.5。 在这之前完成了VMware虚拟软件的安装&#xff0c;并安装了Ubuntu22.04&#xff0c;在这基础上进行相关配置。 二、安装jdk 在Ubuntu中使用…

MICA:面向复杂嵌入式系统的混合关键性部署框架

背景 在嵌入式场景中&#xff0c;虽然 Linux 已经得到了广泛应用&#xff0c;但并不能覆盖所有需求&#xff0c;例如高实时、高可靠、高安全的场合。这些场合往往是实时操作系统的用武之地。有些应用场景既需要 Linux 的管理能力、丰富的生态&#xff0c;又需要实时操作系统的高…

计科录取75人!常州大学计算机考研考情分析!

常州大学&#xff08;Changzhou University&#xff09;&#xff0c;简称“常大”&#xff0c;位于江苏省常州市&#xff0c;是江苏省人民政府与中国石油天然气集团有限公司、中国石油化工集团有限公司及中国海洋石油集团有限公司共建的省属全日制本科院校&#xff0c;为全国深…

SQL 语句中的字符串有单引号导致报错的解决

1.问题 SQL 语句执行对象中&#xff0c;本内容的字符串内含有单引号导致查询或插入数据库报错&#xff0c; 例如 str 关键字 AND 附近有语法错误 2.解决 字符串中的 ’ → 替换 ”&#xff0c;则查询语句成功&#xff0c;故程式中要备注替换 单引号。

【科研绘图】记录一次论文结果复现

复现原论文中的图片是科研的基本功之一&#xff0c;它不仅验证了研究结果的可靠性&#xff0c;确保了科学工作的准确性和可重复性&#xff0c;还深刻地评估了方法的有效性&#xff0c;体现了对原始研究的尊重和对科学过程的严谨态度。这个过程不仅提高了研究的透明度&#xff0…