【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://www.mzph.cn/diannao/50679.shtml

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

相关文章

凸优化笔记-基本概念

原文 文章目录 最小二乘问题 仿射affine hullaffine dimension 凸集锥集超平面和半空间单纯形整半定锥保凸性的操作透视函数 凸函数的条件1阶判定条件2阶判定条件 Epigraph 外图 m i n i m i z e f 0 ( x ) minimize\ \ \ f_0(x) minimize f0​(x) s u b j e c t t o f i ( …

Spring Boot入门指南:留言板

一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范: 1.写一个类MessageInfo对象,添加构造方法 虽然有快捷键,但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库,通过添加注…

Spring Boot 与 MongoDB 整合指南

MongoDB MongoDB 是一种基于文档的NoSQL数据库,以其高性能、高可用性和易扩展性而著称。它使用 BSON(类似 JSON 的二进制格式)来存储数据,提供了灵活的数据模型,使得开发者可以更轻松地存储和查询复杂的数据结构。将M…

2024年钉钉杯大数据竞赛A题超详细解题思路+python代码手把手保姆级运行讲解视频+问题一代码分享

初赛A:烟草营销案例数据分析 AB题综合难度不大,难度可以视作0.4个国赛,题量可以看作0.35个国赛题量。适合于国赛前队伍练手,队伍内磨合。竞赛获奖率50%,八月底出成绩,参赛人数3000队左右。本文将为大家进行…

七夕特献:用代码编织爱情的浪漫,程序员的专属爱情证书生成器

文章目录 1. 背景介绍2. **为什么是爱情证书生成器?**3. **功能亮点**4. **技术实现**5. **如何获取?**6. 总结 1. 背景介绍 在这个数字化的时代,程序员们用代码编织世界,创造无限可能。七夕将至,一个充满古老传说和浪…

ElasticSearch核心之DSL查询语句实战

什么是DSL? Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的,所以你必…

Dockerfile指令详解和Docker操作命令

1.容器的特点:1)自包含(包括应用程序及其运行环境);2)可移植;3)相互隔离;4)轻量级。 2.docker成为容器的事实标准在于:1)在运行环境上…

【区块链】如何发行自己的加密货币到以太坊测试网络,remixIDE发行自己的数字货币

如何发行自己的加密货币到以太坊测试网络 环境 reminx在线编辑器:https://remix.ethereum.org/安装有小狐狸钱包插件(MetaMask) 如何部署代币? 创建一个名字叫做HelloMyToken.sol的文件。编写好智能合约,这边我要发…

文件包含漏洞--pyload

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.PHP伪协议利用 php://协议 php://filter :用于在读取作用和写入文件时进行过滤和转换操作。 作用1:利用base64编码过滤器读取源码 通常利用文件包含执行php://filte…

Opencv学习项目4——手部跟踪

上一篇博客我们介绍了mediapipe库和对手部进行了检测,这次我们进行手部关键点的连线 代码实现 import cv2 import mediapipe as mpcap cv2.VideoCapture(1) mpHands mp.solutions.hands hands mpHands.Hands() mpDraw mp.solutions.drawing_utilswhile True:…

Flutter - 安卓一次打包不同包名的apk

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 有时为了方便测试,同一个app需要在一个手机上装两个,直接改包名的话比较麻烦,这时可以通过添加flavor进行多维度打包&#xff0c…

Flink入门(更新中)

目录 一、Flink 1.1 基本概念 1.1.1 flink简介 1.2 flink编程模版 1.3 常用概念 1.2.1 datastream 1.2.2 算子、Task 1.2.3 多流操作 1.2.6 时间语义 二、Flink编程实战(Java) 2.1 wordcount 一、Flink 1.1 基本概念 1.1.1 flink简介 1.图片介绍 性能&#xff1a…

OpenAI推出SearchGPT:革新搜索体验的新工具

引言 原文链接 在信息爆炸的时代,搜索引擎已经成为人们日常生活中不可或缺的工具。然而,传统的搜索引擎在理解复杂查询和提供准确答案方面仍有许多不足。为了解决这一问题,OpenAI与20240725推出了SearchGPT原型,将生成式AI与传统…

kafka源码阅读-ReplicaStateMachine(副本状态机)解析

概述 Kafka源码包含多个模块,每个模块负责不同的功能。以下是一些核心模块及其功能的概述: 服务端源码 :实现Kafka Broker的核心功能,包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…

Vue常用指令及其生命周期

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.常用指令 1.1 v-bind 1.2 v-model 注意事项 1.3 v-on 注意事项 1.4 v-if / v-else-if / v-else 1.5 v-show 1.6 v-for 无索引 有索引 生命周期 定义 流程 1.常用指令 Vue当中的指令…

远程项目调试-informer2020

informer2020 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting(原文)Informer 是一个基于Transformer的模型,是为了应对长依赖关系而开发的。本文的主要主题是序列预测。序列预测可以在任何具有不断变化的数据的地方…

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 (一)、用户的概念 (二)、组的概念 补充组 主要组 二、获取超级用户访问权限 (一)、su 命令和su -命令 ( 二)、sudo命令 三、管理本地用户账户 &…

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 目录 ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/61780…

Transformer自然语言处理实战pdf阅读

一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前,NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环,允许信息从一步传播到另一 步,使其成为对文本等序列数据进行建模的理想选择。如…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么? Q-Former是一种新型的神经网络架构,专注于通过查询(Query)机制来改进信息检索和表示学习。在这篇博客中,我们将详细探讨Q-Former的工作原理、应用场景,并在必要时通过…