磁盘的分区与文件系统的认识

磁盘的认识

了解磁盘的结构:

1、盘片
硬盘首先会有多个盘片构成,类似很多个独立的光盘合并在一起,每个盘片都有2个面,每个盘片都有一个对应的磁头,我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置,而我们的磁盘数据实际上就是在盘面上保存的。

2、扇区和磁道
每个盘片会分成若干个相同同心圆的磁道,磁道从外围开始编号,从0开始,每个磁道又会划分成若干个扇区,扇区是硬盘的最小存储单元,一般是存储512字节。

3、磁头和柱面

磁头用于读取盘面中磁道内的扇区中存储的数据。一个盘片有上下2个盘面对应2个磁头(盘面数 = 磁头数)。柱面是所有盘面中相同磁道的柱面,形成的是一个立体的柱体形状,磁盘的柱面数和磁道数是相等的。

 

 CHS定位法

早期可以通过柱面号(Cylinder)、磁头号(Head)和扇区号(Sector)来精确定位硬盘驱动器上的数据。柱面号用来指示在哪个柱面上进行读写操作,磁头号用来指示在哪个磁头对应的磁面上进行读写操作,而扇区号用来指示在某个磁头的某个磁道上的哪个扇区进行读写操作。

现代硬盘驱动器采用的是LBA(Logical Block Addressing,逻辑块寻址)定位方式,通过逻辑块号来寻址数据。

对磁盘结构的逻辑抽象

我们知道磁盘的盘面中存放数据的单元其实就是若干个扇区,而我们将这旋转着的一圈圈扇区都排成一排,此时的结构就像一个顺序表数组了:

以下是数据管理硬件的逻辑: 

如上所示,可以将每一个扇区就是最小单元,此时就可以对扇区进行软件层的数据结构处理,将每个扇区都编号,因此对每个扇区的访问就是对编号的访问。而一般磁盘有十面,而每个盘面的扇区一致,所以就可以将编号数除以每个盘面的扇区数得到的就是对应的盘面,而进而再将除下的数据再除以每个盘面的扇区数就是对应磁面的对应扇区。因此就是可以形成一一映射的关系,进而可以实现软硬件交互。

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

我们操作系统下的文件系统其实并不是以扇区为单位进行编号的,因为我们知道一个扇区基本上就是512字节,其实并不大,如果这样访问(IO)起来的话就会比较频繁。实际上文件系统大多数是以8个扇区为一个单元,也就是512byte*8=4kb。因此就是对这4kb的内存块编号。

而这每一个内存块的地址就是LBA(逻辑块地址)

 

 磁盘的区域划分

我们磁盘一般都是以GB为单位,甚至大一点的都是TB为单位。所以说我们对磁盘的管理会采用分区的方式,毕竟将每一区域的空间管理好,然后其他的区域直接套用该种管理方法就行了。就拿我们大多数的电脑来说,其实像C盘D盘就是一块磁盘分成的两个区。

其实将磁盘分成一个个区以后还是不够的,空间还是非常大的,所以我们还将对应的区划分成一个个组,因此,我们对分区的管理就可以转换成分组的管理。

假设我们磁盘有500GB的大小,分成5个区,然后每个区分成50个组:

以上就是对磁盘空间的抽象划分。所以具体我们就是对组的管理,而对这分区的100GB稍微具体化就是如下:

 BootBlock:启动块,一般会在编号为0的磁头所对应的盘面,的第一块扇区。负责计算机的启动。 

而其他部分就是我们的块组,而块组对应着以上的五六个小部分,其实其中存的就是文件的数据(内容+属性)信息和文件管理的数据信息。而我们最开始的块组就是需要先将管理数据写入到块组当中,管理数据其实就是管理块组中的空间使用信息以及文件对应的块空间等等,而这一操作其实就是格式化

分组后的细分

首先我们要认识一下文件的inode编号。

我们使用 ll -i 指令得到的信息中,最前面的一段数字码(1580394和1580395)就是文件的inode信息:一般都是一个文件对应着一个inode编号,每个文件都有其对应的inode编号,在整个分区具有唯一性,Linux中识别一个文件与文件名没有关系,只和inode编号有关而且磁盘中保存文件的属性数据是通过inode来保存的1所以说inode就相当于是一个结构体一样:

struct inode//大小固定sizeof(inode)=128字节
{
       //拥有者、所属组、ACM时间、大小权限、inode编号...

}

inodeTable

inode表,就相当于是一个存放上面struct inode结构体的数组,而该数组的下标对应的就是inode编号。

Data blocks

数据区,将该组的空间划分成一个个文件块单元(每个文件块4KB大小),存放的就是整个块组里所有文件的内容数据。简略的抽象图如下:

而我们想要将inode对应文件所存储的信心对应起来该怎么做呢???我们的struct inode中还会为我们维持一个数组就个inode所对应文件的内存块,4KB不够则采用一对多的形式映射。

struct inode//大小固定sizeof(inode)=128字节
{
       //拥有者、所属组、ACM时间、大小权限、inode编号...
       int blocks[n]//n一般是15

}

1.我们的文件和数据块的映射也才15个,共15*4KB,那么如果文件不仅仅只有60KB呢???

其实我们的15个块并不是直接映射的,13号和14号下标会通过间接映射的方式,例如:13号块大小是4KB,会保存更多的块列表,也就是会指向其他的块儿编号,所以此时就会形成二次1映射,而14号块也同理,此时就会形成三级映射,此时的结构就有点像多叉树。 


2.如果该组的空间还不够,或者数据块已经用光了呢??? 

此时会进行跨组访问,将文件信息存到其他组的块儿中,此时只需要记录其他组的组好和对应的块号就可以。

inode Bitmap

我们知道bitmap就是表示位图,而位图最大的特点就是节省空间以及表示“是和否”的问题。

所以对于inode Bitmap标识的就是inode编号的使用情况,如果编号为n的比特位被使用了,那么就可以将编号为n对应的比特位设置为1,没使用的话就是原初始值0。

Block Bitmap

有inode bitmap表示这inode的使用情况,那么同理block bitmap标识的就是数据块Data blocks的使用情况。同样也是采用0和1来表示。


所以知道磁盘的空间的使用与否其实就是取决于数据块位图的标识符是为0还是为1,因此我们如果先要删除文件其实就是将位图为1改为0,此时并不需要将内存数据块的数据清空。如果需要使用该块,则会采用覆盖的形式进行。

Group Descriptor Table

简称GDT:块组描述符,描述块组属性信息。存放的一般是该块组的其实inode编号(inode编号在整个区是唯一的),组中inode总数,inode的使用数量,组中块组总数,块组使用数量……

Super Block

超级块(Super Block):存放文件系统本身的结构信息。Super Block并不是每个块组都存在,只在个别的块组中前面会存在Super Block(保存多份就是为了防止出错后整个分区故障,故障后可以借助其他的Super Block拷贝修复)。

记录的信息主要是整个分区的相关把信息:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载(确定分区根目录)的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个(分区)文件系统结构就被破坏了。

文件系统

我们的用户都是通过文件名进行访问的,而系统中只认识inode编号,所以说此时我们的文件名就会和inode编号构成映射关系。而我们的目录文件也不例外,也有自己的inode编号,但是目录的数据块内容并不是和普通文件一样存放的是一些代码或音频等信息,而目录文件中一般会创建有其他文件,所以目录文件的数据块中存放的是该目录下的文件与inode编号的映射关系。

我们的文件名一般相当于是键值对key-val中的key结构,所以说我们同一个目录下不能存放同名文件。而且我们Linux中文件名并不属于文件属性,文件名是用户创建的,而操作系统会为我们分配文件inode编号与文件名映射。

所以说对于文件的查找我们其实都是从根目录中开始查找的,然后通过inode编号与数据块映射,找到数据块信息,然后层层剥离,最终找到目标文件,就相当于是从多叉树的根节点开始找某个节点。

对于我们进程打开一个文件是通过该进程的CWD工作目录和打开的文件名来确定当前文件所在位置,而根据最起始的路径确定磁盘分区,然后通过文件inode确定具体的分组以及对应的数据块,然后将数据块的内容刷新出来就行。

软硬链接

软链接和硬链接是像unix操作系统中用于创建文件链接的两种方式。

软链接

软链接也被称为符号链接或者软连接。它是一个特殊类型的文件,其中包含了指向另一个文件或目录的路径。软链接类似于Windows中的快捷方式。它可以跨越文件系统边界和目录边界,指向其他文件或目录。软链接的删除不会影响原始文件,但是如果原始文件被删除,软链接就会失效

就像我们电脑上下载好的软件其实就是以一个文件夹的形式下载好,其中会有配置文件、日志文件、可执行文件……而我们的可执行程序(也就是双击进入的软件)就是在可执行文件中,此时需要进入可执行文件再双击可执行程序才可以运行该进程。所以我们就会在外层桌面文件中建立软链接的形式直接创建快捷方式。

软链接的创建使用ln -s命令:

ln -s <原始文件路径> <链接文件名>

    

 创建好的软链接与原来的文件inode是不一样的,因此软链接是独立的文件。但是当我们向test文件还是test.soft.link链接文件的其中一方写入数据的话,最终在另一方中也是会被写入(硬链接也一样):

硬链接

硬链接是指两个或多个文件共享相同的iNode,它们指向同一份数据块。它是文件系统内部的文件系统链接,没有独立的文件实体。硬链接只能在同一个文件系统中创建,不能跨越文件系统边界。当原始文件被删除时,硬链接仍然可以继续访问原始文件的内容。因为硬链接中会指向同一个inode而此时会通过引用计数的方式来将inode和文件名构成一对多的映射关系

硬链接的创建使用ln命令:

ln <原始文件路径> <链接文件名>

 我们知道文件inode和文件名是会构成一对多的映射关系的,采用引用计数的方式,而且对于一个inode有没有与文件名映射,以及映射数目也会存在struct inode的结构体当中:

struct inode//大小固定sizeof(inode)=128字节
{
       //拥有者、所属组、ACM时间、大小权限、inode编号...
       int blocks[n]//n一般是15
       int ref_count;//引用计数
}

而且我们ll指令显示出的文件属性也是会将映射的数目情况展示出来:

删除文件应用计数--;创建硬链接,引用计数++; 而且对于目录文件都会有两个默认文件...

所以在创建目录文件时一般引用计数就为2:


软链接和硬链接的使用目的和特性不同。软链接通常用于创建快捷方式或跨越目录的链接,而硬链接则通常用于创建多个文件名指向同一个文件的链接。另外,软链接可以指向目录,而硬链接只能指向文件。 其实硬链接不能指向目录的原因就是因为如果指向某个目录的话,那么在查找文件时就会造成死循环(因为此时目录文件inode相同)但是也有例外,ll -a 目录文件时就会有...文件,也是硬链接的。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的教师工作量管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

最简单解决:error: reference to ‘***‘ is ambiguous

目录 错误 错误原因 解决办法 错误 6_38.cpp: In function void TowerofHanoi(int, int, int, int): 6_38.cpp:17:9: error: reference to count is ambiguous count; ^ 6_38.cpp:3:5: note: candidates are: int count int count 0; ^ 错误原因…

HCIA——24FTP 的工作原理、功能、TFTP、控制连接、数据连接

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

SpringBoot进阶

SpringBoot解析 SpringBoot起步依赖 SpringBoot在配置上相比Spring要简单许多&#xff0c;其核心在于starter起步依赖。在使用SpringBoot来搭建一个项目时&#xff0c;只需要引入官方提供的starter起步依赖就可以直接使用&#xff0c;免去了各种配置。因为起步依赖可以引入某…

笔试面试题——二叉树进阶(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、二叉搜索树与双向链表1、题目讲解2、思路讲解递归展开图3、代码实现 二、从前序遍历和中序…

Flutter轮播图Banner

使用插件&#xff1a;flutter_swiper 实现轮播图 pubspec.yaml 增加 &#xff1a;flutter_swiper : ^lastest_version 在项目文件夹下打开命令行执行&#xff1a;flutter packages get 安装插件 home_page.dart中使用swiper 程序运行:先启动虚拟设备后&#xff0c;执行命令f…

【征服redis16】收官-redis缓存一致性问题解决方案

今天我们来写redis最后一篇&#xff1a;redis作为缓存时如何与数据库实现数据一致的问题。 最近看redis看得有点麻了&#xff0c;这篇就简单描述吧 目录 1.什么是缓存与数据库一致性问题 1.1 缓存一致性的概念 1.2 缓存不一致的场景 2.缓存不一致的解决思路 1.什么是缓存…

Pandas数据重采样

数据重采样 时间数据由一个频率转换到另一个频率 降采样&#xff08;如D到M&#xff09;升采样&#xff08;如M到D&#xff09; 方法&#xff1a;调用resample 降采样举例 import matplotlib.pyplot as plt import numpy as np import pandas as pd import datetime as dtrng…

git内部原理

git内部原理 介绍目录结构说明 介绍 项目的本地仓库中&#xff0c;包含一个隐藏的.git目录&#xff0c;其不同的文件产生都源于git的各种不同命令造成&#xff0c;文件目录如下所示&#xff1a; 目录结构说明 上面最核心重要的为object目录&#xff0c;目录最主要有三个对象…

【好用的AI工具】推荐测试人在用的Kimi Chat

一、功能介绍 发网址链接文章解析PDF文件分析&#xff0c;可以整理分析文章丢简历、给出面试问题聊天等 Kimi Chat 二、对于测试人带来的帮助 2.1 面试问题总结 问题一&#xff1a;Session和Cookie的区别 seeion 和 cookie 是两种不同的数据存储机制&#xff0c;它们在Web开…

C++ 并发编程 | 线程的状态

一、线程的状态 1、线程的状态 C线程有五种不同的状态&#xff1a;创建、就绪、运行、阻塞、终止。掌握线程状态可帮助我们跟踪程序的执行过程&#xff0c;并解决潜在的竞态条件和死锁问题&#xff0c;掌握它对于编写可靠和高效的多线程应用程序至关重要。下面分别介绍这几种状…

利用Intersection Observer实现图片懒加载性能优化

Intersection Observer是浏览器所提供的一个 Javascript API&#xff0c;用于异步的检测目标元素以及祖先或者是顶级的文档视窗的交叉状态 这句话的意思就是&#xff1a; 我们可以看的图片当中&#xff0c;绿色的 target element&#xff08;目标元素&#xff09;&#xff0c…

1.12马原总复习TOTAL

&#xff08;价值形式&#xff09;不变资本、可变资本 不变资本是以生产资料形态存在的资本&#xff0c;通过具体劳动转移到新产品中&#xff0c;价值量不会大于它原本的价值量&#xff1b; 可变资本是用来购买劳动力的资本&#xff0c;产生剩余价值 可变资本里&#xff0c;…

搭建一个简单的Spring Demo

要学习Spring 源码&#xff0c;一个是从Spring GitHub 上去down源码&#xff0c;然后倒入IDEA编译&#xff0c;但这种方法费时费力&#xff0c;如果你不需要对Spring 源码进行修改后&#xff0c;再编译的话&#xff0c;直接搭建一个Spring Demo 的Maven项目&#xff0c;引入Spr…

官宣首批 CESS 全球大使,更多席位邀您报名参与!

CESS&#xff08;Cumulus Encrypted Storage System&#xff09;很荣幸地向大家宣布「CESS 全球大使计划」的首批入选大使&#xff01; CESS 全球大使计划旨在汇聚全球对区块链技术充满热情、愿意为 CESS 生态做出贡献的建设者。该计划专注于提升社区知名度和影响力&#xff0c…

数据库复试—关系数据库标准语言SQL

数据库复试—关系数据库标准语言SQL SQL&#xff1a;结构化查询语言 以教材中的学生-课程数据库为例进行SQL基础语法的复习 数据库实验环境选择SQLServer 11 关系模式 学生表Student(Sno,Sname,Ssex,Sage,Sdept) 课程表Course(Cno,Cname,Cpno,Ccredit) 学生选课表SC&#xf…

2526. 随机数生成器(BSGS,推导)

题目路径&#xff1a; https://www.acwing.com/problem/content/2528/ 思路&#xff1a;

WPF 在DataGrid使用过程中,如果单击某一行理论就会选中哪一行,实际不能选中。DataGrid空白格不能选择行

wpf 在DataGrid使用过程中&#xff0c;如果单击某一行理论就会选中哪一行&#xff0c;但是单击的点刚好这列没有值、内容为空时&#xff0c;单击了也没有选中这一行。如果这列有值就容易选中这一行&#xff0c;这是为什么&#xff0c;如何解决&#xff1f; 确保列模板中即使没有…

Yolov8不废话!参考手册!

Yolov8使用 yolo taskdetect modetrain modelyolov8n.pt args...classify predict yolov8n-cls.yaml args...segment val yolov8n-seg.yaml args...export yolov8n.pt formatonnx args...使用Ultralytics YOLO进行模型训练 …

设置代码模板创建sql映射文件、Mybatis主配置文件

目录 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 2、Mybatis的主配置文件的介绍 3、通过代码模板创建Sql映射文件 4、通过代码模板创建Mybatis主配置文件 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 <?xml version"1.0" encod…