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

news2024/11/15 12:09:23

前言 

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

磁盘

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

 

磁盘的构造

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

磁盘的存储结构

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

  • 扇区:将盘片分为多个扇形,每个扇形和每个磁道相交产生的区域就被叫做扇区。一个盘面上每个磁道所包含的扇区个数是相同的,同样给每个扇区编号。
  • 磁盘的基本读写单位是扇区,扇区大小一般是 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.coloradmin.cn/o/1950983.html

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

相关文章

数据传输安全--SSL VPN

目录 IPSEC在Client to LAN场景下比较吃力的表现 SSL VPV SSL VPN优势 SSL协议 SSL所在层次 SSL工作原理 SSL握手协议、SSL密码变化协议、SSL警告协议三个协议作用 工作过程 1、进行TCP三次握手、建立网络连接会话 2、客户端先发送Client HELLO包,下图是包…

目标检测 | YOLO v4、YOLO v5、YOLO v6理论讲解

☀️教程:霹雳吧啦Wz ☀️https://space.bilibili.com/18161609/channel/seriesdetail?sid244160 一、YOLO v4 YOLO v4在2020年的4月发布,YOLO v4结合了大量的前人研究技术加以组合,实现了速度和精度的平衡,该论文包含大量的tric…

二叉树 N0=N2+1

N0 叶子节点,度为 0 的节点; N1 度为 1 的节点; N2 度为 2 的节点 度为 0 的节点为:H、I、J、K、G 度为 1 的节点:E、F 度为 2 的节点:A、B、D、C N0 N2 1,即:度为 0 的叶子节点 …

C++STL详解(一)——string类的接口详解(下)

目录 一.string的大小和容量成员函数 1.1size()和length() 1.2capacity() 1.3resize() 1.4reserve() 1.5clear()和empty() ​编辑 二.string元素的访问 2.1operator[]和at() 2.2范围for 三.string中迭代器相关函数 3.1begin()和end() 3.2rbegin()和rend() 四.string…

Anaconda +Pytorch安装教程

Anaconda Pytorch安装教程 Anaconda安装 小土堆的安装教程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili Free Download | Anaconda 这里自己选一个文件夹安装即可 第一个红框表示添加图标到开始菜…

细说MCU用自带的波形发生器实现DAC输出的方法

目录 一、参考示例 二、配置参数 1.配置DAC 2.配置TIM3 三、代码修改 四、查看结果 DAC模块自带的硬件波形发生器只有三角波(Triangle wave)和 (Noise wave)两种。此外,如果配置了Trigger2参数,在波形发生模式中就出现(并且仅出现)锯齿波的选项(Sa…

Codeforces Round 874 (Div. 3)(A~D题)

A. Musical Puzzle 思路: 用最少的长度为2的字符串按一定规则拼出s。规则是&#xff1a;前一个字符串的尾与后一个字符串的首相同。统计s中长度为2的不同字符串数量。 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 20…

vue3前端开发-小兔鲜项目-登录功能的业务接口调用

vue3前端开发-小兔鲜项目-登录功能的业务接口调用!这次&#xff0c;正式调用远程服务器的登录接口了。大家要必须使用测试账号密码&#xff0c;才能验证我们的代码。 测试账号密码是&#xff1a;账号&#xff08;xiaotuxian001&#xff09;&#xff1b;密码是&#xff08;1234…

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn&#xff08;简称sklearn&#xff09;是一个非常流行的Python机器学习库&#xff0c;提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述&#xff1a; 1. 安装scikit-learn 首先&#xff0c;确保你已经安装了Python和…

什么是hdfs如何使用驱动程序访问hdfs

目录 什么是hdfs 主要特点包括&#xff1a; 架构组成&#xff1a; 应用场景&#xff1a; 如何使用驱动程序访问hdfs 准备工作环境&#xff1a; 启动 Hadoop 服务 可能遇到的问题&#xff1a; ssh验证失败 验证Hadoop服务 对hdfs进行文件操作 什么是hdfs HDFS&#x…

【数据结构】栈(基于数组、链表实现 + GIF图解 + 原码)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构 &#x1f4da;本系列文章为个人学…

Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)

目录 0.上篇文章 1.V1 版本 - echo server 1.1认识接口 1.2实现 V1 版本 - echo server&#xff08;细节&#xff09; 1.3添加的日志系统&#xff08;代码&#xff09; 1.4 解析网络地址 1.5 禁止拷贝逻辑&#xff08;基类&#xff09; 1.6 服务端逻辑 &#xff08;代码&…

Leetcode—769. 最多能完成排序的块【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—769. 最多能完成排序的块 实现代码 class Solution { public:int maxChunksToSorted(vector<int>& arr) {int ans 0;int mx INT_MIN;for(int i 0; i < arr.size(); i) {mx max(arr[i], mx);if(mx i) {a…

【C++】C++应用案例-旋转图像

旋转图像的需求&#xff0c;在图片处理的过程中非常常见。我们知道对于计算机而言&#xff0c;图像其实就是一组像素点的集合&#xff0c;所以图像旋转的问题&#xff0c;本质上就是一个二维数组的旋转问题。 我们可以给定一个二维数组&#xff0c;用来表示一个图像&#xff0c…

【C++】——红黑树(手撕红黑树,彻底弄懂红黑树)

目录 前言 一 红黑树简介 二 为什么需要红黑树 三 红黑树的特性 四 红黑树的操作 4.1 变色操作 4.2 旋转操作 4.3 插入操作 4.4 红黑树插入代码实现 4.5 红黑树的删除 五 红黑树迭代器实现 总结 前言 我们之前都学过ALV树&#xff0c;AVL树的本质就是一颗平…

Oracle对比两表数据的不一致

MINUS 基本语法如下 [SQL 语句 1] MINUS [SQL 语句 2];举个例子&#xff1a; select 1 from dual minus select 2 from dual--运行结果 1-------------------------------- select 2 from dual minus select 1 from dual--运行结果 2所以&#xff0c;如果想找所有不一致的&a…

软件测试---Linux

Linux命令使用&#xff1a;为了将来工作中与服务器设备进行交互而准备的技能&#xff08;远程连接/命令的使用&#xff09;数据库的使用&#xff1a;MySQL&#xff0c;除了查询动作需要重点掌握以外&#xff0c;其他操作了解即可什么是虚拟机 通过虚拟化技术&#xff0c;在电脑…

富芮坤FR800X系列之按键检测模块设计

FR800X系列按键检测模块 读者对象&#xff1a; 本文档主要适用以下工程师&#xff1a; 嵌入式系统工程师 单片机软件工程师 IOT固件工程师 BLE固件工程师 文章目录 1.概要2.用户如何设计按键检测模块2.1 GPIO初始化2.2按键模块初始化2.3设计中断函数&#xff1a;2.4循环…

【Python面试题收录】Python编程基础练习题①(数据类型+函数+文件操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题&#xff08;str&#xff09; 请编写一个Python程序&#xff0c;完成以下任务&#xff1a; 去除字符串开头和结尾的空格。使用逗号&#xff08;","&#…

【数据库】Quartz2.3 框架 数据库设计说明书

1、 Quartz表说明 2、 quartz 的触发时间的配置 1、 cron 方式&#xff1a;采用cronExpression表达式配置时间。 2、 simple 方式&#xff1a;和JavaTimer差不多&#xff0c;可以指定一个开始时间和结束时间外加一个循环时间。 3、 calendars 方式&#xff1a;可以和cron配合使…