Linux——磁盘文件

磁盘文件

通过前一篇文章Linux——系统文件I/O,我们知道了如何对加载在内存中的文件进行读写等操作,并了解了其内在的原理。同时我们也应该清楚,并不是所有的文件都会被加载入内存,而没有被加载入内存的文件,就被存放在磁盘中,称为磁盘文件。现在,就让我们一起来学习磁盘文件的相关知识

本片思维导图:
在这里插入图片描述注:本章思维导图对应的.xmind.png文件都已同步导入至资源,供免费查阅

1. 磁盘的物理结构

在这里插入图片描述

1.1 两个重要的结构

在这里插入图片描述

磁盘的两个重要的物理结构为盘面和磁头

盘面

  • 盘面用来存放数据
  • 盘面有正反两面,两面都可以存储数据;一个磁盘可能有多个盘面;每一个盘面都有唯一的编号

磁道

  • 每个盘面都可以被划分为多个同心圆,每个同心圆就叫做一个磁道。每个磁道都有唯一的编号
  • 相同半径的磁道组成的柱状结构就叫做柱面

扇区:

  • 每一个磁道可以被划分为多个扇形区域,这些区域叫做扇区。每个扇区都有唯一的编号
  • 扇区的一般大小为512字节
  • 扇区是磁盘IO的基本单位(例如,如果要改变磁盘中的一个字节,那么必须要将包含这个字节的整个扇区都读入内存,而不能只读入这个字节)

在这里插入图片描述

磁头

  • 每个盘面都有一个磁头,磁头悬浮在盘面的上方,并不会与盘面接触
  • 每个磁头都有唯一的编号
  • 所有磁头都固定在一个磁头臂上,可以共同向盘面的圆心前进后退,从而读取指定的柱面

在这里插入图片描述

1.2 CHS定位法

如何定位一个指定的扇区?我们可以通过这样的步骤:

首先,通过磁头的移动来找到扇区位于的柱面;之后,确定所在的盘面(磁头所指的盘面);最后确定确定盘面确定磁道上的扇区

即:确定柱面(磁道)(Cylinder)> 确定磁头(Head) -> 确定扇区(Sector)

这就是所谓的CHS定位法

既然文件存储在磁盘中,那么说到底它也就占用了数个扇区,因此我们就可以通过对文件占用的扇区进行记录,从而将对文件的查找转换为利用CHS定位法对文件所占用扇区进行查找

2. 磁盘的逻辑抽象

2.1 磁盘 -> 线性空间

在这里插入图片描述

我们可以来回忆一下以前听英语听力时用到的磁带,磁带盒里的磁带存储着数据,且是一个圆盘状,我们可以将其和磁盘的盘面类比。如果我们将磁带盒里的磁带都抽出来,那么它就成了数十米的条带。

类似的,我们也可以将磁盘作类似的抽象:将盘面的也像磁带一样展开,这样一个盘面也就成了一个线性的空间,而磁盘就是多个线性空间的组合,也就是一个巨大的线性空间,而这个空间的基本单位就是扇区

可以做出总结:磁盘实际上就是一个巨大的数组,数据的每个下标就是一个扇区

在这里插入图片描述

从而,我们对磁盘文件的管理就转换成了对数组的增删查改

既然扇区是这块线性空间的基本单位,那么空间的每个一下标就对应着一个扇区。我们在前面提到过用CHS定位法找到扇区对应物理结构的位置,同样,我们也需要通过一个扇区编号这种线性地址来确定扇区所在的位置:

我们可以来举一个例子:

假设一块磁盘有800GB,有4块盘面,那么每块盘面就有200GB,为了便于分析,同时假设每个盘面有100个磁道,且这些磁道有相同数量的扇区,则每块盘面就有419,430,400个扇区,每个磁道就有419,430,4个扇区:

在这里插入图片描述

现有一个扇区编号为index

那么,他所在的盘面index / 盘面有的扇区个数,同时可以得到他在这块盘面的偏移量为tmp = index % 盘面有的扇区个数

通过偏移量tmp,就可以得出他所在的磁道tmp / 磁道有的扇区个数,同时也就可以得到他在这个磁道上的偏移量tmp % 磁道有的扇区个数

从而也就得到了某个扇区在磁盘的具体位置

通过上面的方法,我们就可以将一个线性地址转换为CHS地址

2.2 数据块

在这里插入图片描述

上面我们提到,磁盘IO的基本单位为一个扇区,也就是514字节,但是文件系统认为,一次之和磁盘交互512字节效率过于低下,因此规定,文件系统IO的基本单位为4Kb,也就是8个扇区。这一基本单位被称为数据块

在这里插入图片描述

从而,文件系统访问磁盘中的文件就变成了对特定数据块的访问,而为了找到指定的数据块,就需要用到LBA地址

LBA地址是用来标识数据块位置的,每个LBA地址都表示一个数据块

LBA地址可以通过磁盘控制器转换为CHS地址,从而找到特定的扇区,从而文件系统对磁盘文件进行读取时就避免了CHS地址这种三维的读取方式,转而使用LBA地址这种一维的方式,进而大大提高了读取效率

2.3 分区与分组

上面我们将磁盘空间分割成了基本单位为4Kb的线性空间,但是由于磁盘大小往往有几百甚至上千GB,数据块的数量太过庞大

因此操作系统对磁盘空间进行管理时需要采用分治策略:

  • 将磁盘空间划分为数个区域(这些区域的大小可以相等也可以不相等),例如常见的电脑C盘、D盘:

在这里插入图片描述

  • 继续将每一个分区进行分组
  • 最后,只要操作系统将每个组管理好了,就可以将每个分区管理好,静儿就可以将整个磁盘空间管理好了

2.3.1 分区的格式化

在这里插入图片描述

我们用鼠标右击电脑中的磁盘文件,可以看到“格式化”这一选项:

在这里插入图片描述

实际上,通常来说磁盘在出厂时就已经被格式化好了。但是如果我们要对这个磁盘进行分区管理(例如将D盘分200G给E盘),我们就要对分区进行格式化操作:

  • 格式化磁盘分区是分区使用前的必要步骤
  • 被格式化后的分区就是一个文件系统
  • 格式化会清空分区原有的数据,因此要注意重要数据的备份

2.3.1 组(group)的管理

在这里插入图片描述

一个组(group)的内容通常由下面这些内容组成:

在这里插入图片描述

为了方便理解这些内容,我们先来回顾一下文件这一概念:

大家都知道,文件 = 内容 + 属性

  • 文件的属性是由一系列有限的变量来描述的,例如文件大小、文件的创建时间、修改时间等,由于这些变量的大小一定,因此文件属性的大小也是确定的

    • 需要注意,文件名不属于文件的属性,因为文件名是一个字符串,其大小会跟着文件名的改变而改变
  • 文件的内容显然会随着文件存放的数据而改变,因此文件内容的大小是不确定的

  • 文件的内容和属性时分开存放的

inode Table && inode Bitmap

在这里插入图片描述

何为inode:

  • 文件的所有属性实际上都存放在一个名为inode的结构体中,通常inode结构体的大小为128字节
  • 每一个文件都有一个唯一的inode 编号,可以用命令ll -i来查看一个文件的inode编号:

在这里插入图片描述

inode Table:

inode Table是用来存放文件inode的区域

inode Bitmap:

inode Bitmap是一个位图,比特位的位置表示inode Table中inode的某一编号,比特位的内容表示这一编号的inode是否被使用

关于inode 编号

  • 系统用来识别一个文件时,直接使用的不是文件名,而是inode编号

  • 实际上,对于每个分组,他都有一个起始的indoe编号。例如,如果一个分组有1000个inode:
    在这里插入图片描述

  • 对于每一个inode编号,我们可以通过这样的方式来确定他具体所在的位置:编号 / 1000就可以求得这个inode在哪个组,编号 % 1000就可以得到他在这个分组中inode Table的具体位置

  • 反过来,我们也可以通过类似的方式来求得一个特定inode的inode编号:inode编号 = 所在分组的起始inode编号 + 偏移量

Data Blocks && Block Bitmap

Data Blocks:

Data Blocks用于存放文件的内容

Block Bitmap:

Block Bitmap是一个位图,比特位的位置表示数据块的编号,比特位的内容表示这个数据块是否被占用

文件内容和属性的联系:

既然文件的内容和属性时分开存储的,但系统读取文件是通过inode 编号,那么怎么通过文件的inode 编号来找到文件的内容?

  • 实际上,用于描述文件属性的inode结构体中有一个数组int block[15]
  • 对于下标[0, 11]的空间,其存储着这个文件内容使用的数据块的编号
  • 对于下标[12, 13],其不直接存储数据块的编号,而是指向一个数据块,但这个数据块并不存储文件的内容,而是继续存放着数据块的编号,这样就成了一个二级索引
  • 对于下标[14],和下标[12, 13]类似,只不过这是一个三级索引
  • 通过上面的方式一个较小空间的数组block就可以映射到大量的数据块,从而可以通过文件的inode 编号找到文件的内容

Group Descriptor Table:

  • 存放着描述这个组(group)的各种信息,例如inode 起始编号,该组有多少个inode,多少个数据块等
  • Group Descriptor Table管理着整个组(group),因此如果其发生错误,整个组(group)便无法使用

Super Block

  • 存放着所在分区的各种信息,例如组(group)的个数、组的大小等
  • 不是每个组都有Super Block
  • Super Block管理着整个分区,因此如果其发生错误,整个分区便无法使用
  • 为了提高文件系统的容错性,除了第一个组有Super Block外,每隔一段距离的分组也会包含相同的Super Block,这样的备份就大大提高了分区的容错性

2.3.2 目录、文件名与inode

在这里插入图片描述

在Linux中,一切皆文件。因此我们知道目录也是一个文件,因此目录也有它的inodeinode 编号

在这里插入图片描述

而目录的内容,存放的就是目录里面文件名和文件对应inode 编号的映射关系

我们前面提到过,系统查找一个文件时,直接使用的不是文件名,而是该文件的inode 编号,具体过程应该是这样的:

  • 例如系统要访问一个文件/home/Test/test.s,仅仅提供文件名test.c是不够的,还需要找到这个文件所在的目录Test
  • 又由于目录Test也是一个文件,要找到这个文件,我们也需要找到其所在的目录home
  • 最后要找到目录文件home,就要回到根目录/

因此我们可以得出这样的结论:

  • 文件的增、删、查、改都是和文件所在的目录有关的
  • 查找一个文件,都要逆向回溯到根目录/,从根目录进行路径解析,从而得到文件的具体位置

有了对inode的理解,我们也可以重新回顾一下目录权限的概念:

目录的内容是包含的文件名与文件inode编号的映射关系

  • 如果目录没有r读权限:无法读取文件名与文件inode编号的映射关系,也就无法通过inode编号来找到文件的属性和内容,从而无法查看一个文件
  • 如果目录没有w写权限:没有写权限,也就无法在目录内新建文件,即无法建立文件名与文件inode编号的映射关系,即无法改变文件内容

2.3.3 重谈文件的新建与删除

新建文件:

  • 首先在inode Bitmap中查看空闲的inode编号,并将文件的属性写入到inode Table中空闲的位置,同时修改inode Bitmap特定比特位的内容
  • 类似的方法,将文件的内容写入到Data Block中空闲的位置,并建立内容和属性的映射关系同时修改Block Bitmap特定比特位的内容
  • 根据inode 编号 = 分组起始inode编号 + 偏移量求得inode编号
  • 最后将inode编号与新建文件的文件名建立映射关系

删除文件:

  • 根据文件的inode编号找到文件所在的分组以及其inode Bitmap的偏移量,将所在位置的比特位置零,即表示属性删除完毕
  • 同理,根据inode编号也可以找到文件的inode,从而找到文件内容占用数据块的编号,也就是Block Bitmap中的偏移量,将这些比特位置零,即表示内容删除完毕

注意:

  • 通过上面的描述可以发现,删除文件只需要修改内容和属性对应比特位的内容,表示对应编号的inode和数据块没被占用即可
  • 不需要删除inode Table以及Block Table中的内容(这些内容被新文件的属性和内容覆盖即可
  • 因此,这也就和现实对应了起来:删除文件的速度往往远快于下载文件的速度

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

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

相关文章

酷开科技智慧AI助力酷开系统千屏千面

每台智能电视都有一个专属的操作系统,而酷开系统作为一款基于人工智能技术的智能电视操作系统,深受大众喜爱,其最大的特点就是“千屏千面”。这意味着每一位消费者在使用酷开系统时,通过酷开科技的智慧AI,都能根据自己…

Prometheus监控Mysql数据库在Grafana展示

未安装prometheus和Grafana可以参考这个博客操作 Docker安装Prometheus监控-CSDN博客 Windows版本数据库 一、在数据库服务器安装mysqld-exporter 下载mysqld-exporter文件 Releases prometheus/mysqld_exporter GitHub 二、配置mysqld-exporter文件 1、解压进入mysqld…

docker+elasticsearch

一,环境准备:安装docker(往期文章) 二,elasticsearch简介: 用于储存数据 三,部署: 1),拉取镜像 使用本作者提供的java17镜像 2),…

ARM64汇编05 - MOV系列指令

MOV(wide immediate) MOV 可以将一个立即数移动到寄存器中。 .text:0000000000000834 80 46 82 D2 MOV X0, #0x1234 ; Keypatch modified this from:MOV X0, #0x1234 对应的汇编代码为:80 46 82 D2 看手册可知&#xf…

Unity制作马赛克效果

大家好,我是阿赵。   之前在玩怒之铁拳4里面,看到了马赛克场景转换的效果,觉得很有趣,于是也来做一下。 一、2D版本的马赛克转场效果 先看看视频效果: 马赛克转场 这里我是直接写shader实现的,我这里是把…

spring boot使用mybatisplus访问mysql的配置流程

网上教程大多教人新建一个带对应组件的项目,本文记录如何在一个已有springboot2.x项目中,配置使用mybatisplus来访问mysql。包括使用wrapper和自己写mapper.xml的自定义函数两种和数据库交互的方式。 关于项目的创建,参考创建springboot 2.x…

Shell正则表达式

目录 正则表达式的分类 基本组成部分 POSIX字符类 元字符 正则表达式的分类 基本的正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs)扩展的正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs&#xf…

pytest生成allure的报告

首先要下载安装配置allure allure serve ./outputs/allure_report 可以生成html的文件自动在默认浏览器中打开

unity3d Animal Controller的动物组件使用明天继续

控制器介绍 动物脚本负责控制动物的所有运动逻辑.它管理所有的动画师和刚体参数,以及所有的状态和模式,动物可以做。 动物控制器 是一个动画框架控制器,根动或到位,为任何生物或人形。它利用刚体与物理世界的互动和动画师的玩动画。 States States 是不互相重叠的动画。例如…

牛角表情生成器微信小程序版

1.纯前端输出,无需后台,无需域名,速度杠杠快! 2.完美支持微信端和抖音端; 3.双端均支持配置开启流量主广告,包括:激励视频广告、插屏广告、banner广告、原生广告、封面广告等; 4.…

Codeforces Round 933 (Div. 3) A~D

比赛链接 : codeforces.com/contest/1941 A . Rudolf and the Ticket 直接暴力即可 ; #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \n #define lowbit(x) (x&(-x)) #define sz(a) (int)a.size() #define p…

最好用的流程编辑器bpmn-js系列之基本使用

BPMN&#xff08;Business Process Modeling Notation&#xff09;是由业务流程管理倡议组织BPMI&#xff08;The Business Process Management Initiative&#xff09;开发的一套标准的业务流程建模符号规范。其目的是为用户提供一套容易理解的标准符号&#xff0c;这些符号作…

数学建模理论与实践国防科大版

目录 1.数学建模概论 2.生活中的数学建模 2.1.行走步长问题 2.2.雨中行走问题 2.3.抽奖策略 2.4.《非诚勿扰》女生的“最优选择” 3.集体决策模型 3.1.简单多数规则 3.2.Borda数规则 3.3.群体决策模型公理和阿罗定理 1.数学建模概论 1.数学模型的概念 2.数学建模的概…

前端之用html做一个用户登陆界面

用户登陆界面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>用户注册页面</title></head> <body><form action"https://www.baidu.com" method"post">…

数据库系统概念(第二周 第一堂)

前言 本文的所有知识点、图片均来自《数据库系统概念》&#xff08;黑宝书&#xff09;、山东大学李晖老师PPT。不可用于商业用途转发。 回顾 上周最后一个知识点说到数据库三级模式结构&#xff0c;在这个结构里面我们设立了模式/内模式映像、内模式/外模式映像&#xff0c;主…

服务器被大流量攻击怎么办?如何防御攻击?

随着网络的发展&#xff0c;我们所遇到的安全挑战也越来越多。尤其是近年来&#xff0c;网络攻击频发&#xff0c;许多互联网企业深受其扰。为了不影响自身业务的稳定运行&#xff0c;许多企业都在想方设法的寻求解决方案&#xff0c;防止服务器被攻击而影响业务发展。下面我们…

云起云落:揭秘云计算基础内功心法

文章目录 云计算基本概念云计算发展历程云计算计算模式云计算商业模式云计算部署模式私有云部署公有云部署混合云部署 云计算虚拟化技术虚拟机模式虚拟化容器模式虚拟化容器VS虚拟机 常见虚拟化工具和技术虚拟化工具“轻量级”虚拟化工具 云计算供应商云计算三要点&#xff08;…

【Node.js相关问题】npm install报错后重装node版本及npm环境变量配置及npm run dev启动报错原因分析解决办法

一、问题描述 昨天在准备打开b站up主三更草堂的博客项目08-02.基础版本前端联调_哔哩哔哩_bilibili中的前端工程时&#xff0c;使用以下两个命令分别都出现了报错。 命令1&#xff1a; # install dependenciesnpm install 命令2&#xff1a; # serve with hot reload at loca…

服务器加密机的工作原理是什么

服务器加密机在现代信息社会中扮演着至关重要的角色。它是确保服务器数据安全、保障数据传输机密性&#xff0c;以及防范恶意攻击和网络窃取的关键技术手段。本文将对服务器加密机进行详细解读&#xff0c;分析其原理、应用以及在未来发展中的重要性。 服务器加密机是一种专门用…

跨境电商选品实战——Ownips静态ip代理+Python爬虫轻松搞定Lazada电商选品

文章目录 一、引言二、Lazada电商平台爬虫实战2.1、分析Lazada电商平台的商品列表接口2.2、定位商品列表计算逻辑2.3、封装IP代理2.4、运行爬虫 三、数据处理及选品分析四、Ownips——企业级全球静态IP代理 一、引言 互联网与外贸的结合&#xff0c;催生了蓬勃兴起的跨境电子商…