文件在磁盘中的存储方式

为了谈论上面的内容,需要从物理的存储结构(外存)入手。

曾经讲过冯诺依曼系统中cpu只会和存储器进行交互,这个存储器值代表的是内存。在一些任务处理时,外存作为输入设备,输入指令、数据......,接着,经过内存、cpu处理完之后,外存有作为输出设备。

硬件:

磁盘、服务器、机柜、机房

  • 机械键盘是计算机中唯一一个机械设备
  • 磁盘 ------外设
  • 拷贝速度满
  • 容量大、价格便宜

那这些设备具体是如何存储信息的?

首先我们知道,任何的信息在计算机中都是以二进制的形式来进行存储,所以在某一个结构中能够表达两种状态、数量大就可以用来进行存储!

传统的机械磁盘中是通过微小磁针的N/S朝向来表示二进制中的0和1,一个磁盘可以看成由多个同心圆环绕形成的,如下图1,而一个同心圆有可以看成由无数个有间隔的小圆弧形成的,这个圆弧就是磁盘的最小存储单元,称之为扇区。一个扇区可以存储大小为512byte的信息。每一个扇区的容量是相同的。

此时可能有人会问:你这不是放屁吗?随着圆的半径增大,对应的圆弧越长(可以看第二张图片),按照道理来说存储的信息应该更大,这样岂不是浪费?带着这个问题我们来看图三。

还有一点值得一提的是,一张磁盘的是双面可用的,意思是,一张磁盘有两个磁面。

不妨设想,当你的文件信息存储在这个硬件上的某一个特定位置,你想要读取你存取的信息,是不是要锁定到特定的扇区,然后进行读取,这个查找过程就是上面问题的答案。在不同的同心圆进行查找到特定的同心圆,有需要在该同心圆中找到特定的扇区,这也就导致了为什么大小都要设为一样的,便于查找。

但是说实话,这个规定是不合理的,造成了资源的浪费,最主要的是这种浪费是可以通过方法来进行规避的。所以最主要的原因是,当时就磁盘本身制造上就有误差,这个机械臂杆也有误差,精度非常低,在当代,这个问题已经被解决了,但是本质内容是不变的,所以学习机械磁盘也能理解原因且便于学习(形象)

从上图可以看到所有的磁盘的圆心都是在同一条直线上的,用来读取数据的硬件称之为读写磁头,移动读写磁头的结构是磁臂和机械臂杆,因此所有的读写磁头是(同进同退的),也就因此存储时会将关联信息存储在同一个平面上,便于查找。

只要确定了目标文件在哪一个磁道上,接着确定在哪一个扇区上就可以查找到对应的信息。

基于上面的理解,我们回到数据是以怎样的结构进行存储的?

从上面我们知道了对于磁盘最小存储单位是扇区,及跟着的是磁道、磁盘......,想象一下,将所有磁道从一个方向剪断就会形成酷似二维数组的结构,这个我们称之为逻辑结构,话句话说,只要知道了这个信息在逻辑结构上的位置就能查找到相应在硬件上的位置。

再将这些数组进行拼接,可以看待成一个 " 一维数组 " ,数组下标就是称之为 LBA,逻辑到物理的映射就是通过LBA搭起桥梁

对于一个硬件,按照一个一个扇区来进行读取效率太低,因此操作系统读取硬盘数据是8个扇区来进行读取的,称之为 " 块 " ,一个块就是(4KB)

利用stat 文件来进行查看文件的基本信息

所以我们现在要知道的是在物理磁盘上的最小存储单元是扇区,但是在操作系统看来最小的存储单元是块。

但是即使最小的存储单元分为块,这个数量还是十分巨大的,不便于管理,因此,对于一块磁盘,操作系统会进行 " 分区 ",将一个大的结构拆成多个较大的(通过逻辑结构下标来进行分区),最小的分区单位是一个在同一个柱面上的磁道,这里每一个分区可以认为相互之间几乎没有联系,几乎相互独立,接着对每一个分区进行分组管理。只要实现了分组的管理就可以完成对于整块磁盘的管理。

disk:包括了MBR 和partition ,其中MBR里面的信息可以理解为划分了每一个partition;partition 就是一个分区

block group :包括了 super block 、GDT、block bitmap 、inode bitmap、inode table、data block

super block:

存放文件系统本身的结构信息,描述整个分区的文件系统信息。记录的信息主要有:block 和inode 的总量,未使用的block 和inode的数量,一个block 和inode 的大小,最近一个挂载时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。super block的信息被破坏,可以说整个文件系统结构就被破坏了

(super block在一个分区下不是所有的组都有,而是仅有一些组会有,但是第一个组一定有。目的是,super block 被破坏之后能够恢复)

GDT(group descriptor table):

快组描述符,描述快组属性信息,整个分区分为多个块组就有多少个GDT。每个块组描述符存储一个块组的描述信息,如这个块组中从哪里开始时inode table,从哪里时data blocks,空闲的inode和数据块还有多少......

block bitmap :用来表述data block中数据块的使用情况

inode bitmap : 用来描述inode table 中inode的使用情况

inode table :当前分组所有inode属性的集合

data block :存放文件内容,也就是一个一个块

什么是inode?

总所周知,文件由属性+内容构成,所谓属性就是inode(不包括文件明,每一个inode的大小都是相同的)

所谓inode table 就是,inode是可以理解成编号的意思,同个分区的每一个inode都是唯一的,在分组的时候,每个分组都有对应的inode编号,比如组一的inode 编号是1-1000,组二的编号是1001-2000,这个信息存储在GDT中,这也就是说只要能够在特定的分区中找到inode,就能够获得对应的文件信息,以及指向data block的数据。

现在来思考一个问题?

下载,也就是数据的拷贝,但是为什么下载耗时长,但是删除耗时很短?

如果删除是将data block 的每一个二进制置为0/1,按照道理来说耗时是相同的。

带着这个问题我们来讲解bitmap

inode bitmap : 用位图来实现O(1)查找哪个inode没使用,这个没什么说的。

data bitmap : 用来描述哪些块没有使用,哪些使用了的。

所以,下载的时候,os会在inode table中用一个inode来生成对应的数据,接着在data block 中进行数据的拷贝,同时让inode的指针指向这个数据块,如果这个数据很大,会用二级,三级指针的方式来进行索引。

删除的时候,你需要把data block 中数据全部删除吗?其实不用,只需要将inode bitmap 和data bitmap 中对应位表示未使用的就行了!意味着什么?你删除之后本质上数据还是在你的磁盘上的,如果后续又拷贝任务,就会直接使用这些块(因为在bitmap中的状态是未使用)

所以所谓格式化也就是重置inode bitmap、data block、 super block 、 GDT。

为什么super block 和GDT也要重置?举个例子,电脑刚到手,磁盘上有且只有c盘,但是你自己分盘了,所以super block和GDT也要充值。

讲了这么多,介绍了物理上的磁盘结构,从而介绍了逻辑上的结构(os进行具体操作的结构),接着介绍了我们磁盘上文件系统及具体细节。

正如我们上面所说的找到特定的文件靠的是文件的inode,但是我们在日常使用的使用的时候,根本没了解过这个,都是通过文件明来进行查找的!

所有文件的存储方式都是上述的,对于普通文件很容易想象,但如果这个文件是目录文件呢?

和普通文件的区别是目录文件的data block不是具体的数据,而是当前目录下文件明和inode的映射关系!!!

所以我们现在知道了,为什么要路径了,本质上是通过一层一层的查找,上级目录找到下级目录的inode,最后找到目标文件的inode,接着通过该inode找到数据。

这里linux有一个优化查找的机制,你想,假设我都已经找到了一个文件,我都花费了时间去找,为什么不把这个保存下来,下次再找这个文件时就不用每个文件都去找!这个结构称之为dentry,本质上是一颗多叉树的节点结构体,由操作系统来进行维护,每一查找时,会先看dentry树上,有没有保存过这个,如果没有就没办法了,要去老老实实找,但是如果有,就可以快速找到。

验证 利用 find 【路径】 -name 【文件明】来查找一个较深的文件,执行两遍。

可以看到的是第二遍速度明显比第一遍块(如果很深),这是因为在第一遍查找完之后,内存中就增添了相应的节点,那dnetry中保存了什么?自然是inode和文件名

现在又出来一个问题,我在路径解析之后找到了对应的inode,如何确定在哪一个分区,因为分区之间是完全独立的,inode也完全独立。

这里引入挂载,所谓挂载是将存储设备和系统目录联系起来,和普通文件的使用方法一样,不挂载的话设备会以设备文件的形式存在,无妨访问。

所以我们可以看一下当前系统挂载的一些存储设备

可以看到的是区的名字本身就是路径的一部分,在执行路径解析的时候就会去检核和哪一个区的名字最接近,也就确定了分区

相关推荐
L1624761 小时前
OpenSSH 半自动升级方案(独立编译 + 手动迁移 + 重建 systemd 服务)
linux·服务器·ssh
半旧夜夏1 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
Wpa.wk1 小时前
win环境本地文件上传远程服务器(scp/远程连接工具)
运维·服务器
Soari2 小时前
SSH 主机密钥冲突
运维·网络·ssh
爱莉希雅&&&2 小时前
zabbix快速搭建和使用
android·linux·数据库·zabbix·监控
z200509302 小时前
【linux学习】深入理解linux文件I/O,从C标准库到内核态
linux·学习·操作系统
黑泽明Coding2 小时前
使用密钥登录ssh
运维·ssh
J2虾虾3 小时前
Spring AI Alibaba - Tools
服务器·人工智能·spring
weixin_307779133 小时前
面向高性能保密计算的定制 Linux 系统构建与自动部署方案
linux·安全·网络安全·性能优化·系统安全