磁盘在操作系统的维度看,就是一个“超大的Byte数组”。
那么操作系统是如何对这块“超大的Byte数组”做管理的呢?
我们知道在逻辑上,上帝说是用“文件”的概念来进行管理的。于是,便有了“文件系统”。那么,文件系统底层又是怎么设计的呢?下面我来说两句。
首先,我直接给一张架构图。
对磁盘进行管理,抽象上,是分为两步。
一、分区
将磁盘划分分区,其实就是把一个物理的硬盘划分为逻辑上几个虚拟的硬盘,称为分区。
每个分区上可以装有自己的文件系统。基本装电脑大家都不会陌生。这里可以理解为就是把那个“超大的byte数据分为一段一段分开管理”。
二、装文件系统
将其中的一段byte数组,按结构化格式为一个文件系统的数据存储结构。
从上面图中可以看到,他们把这段byte数组大体上分为4小段,每段提供一些作用,存储一些信息,目的就是可以利用这些存储空间来对磁盘自身来做管理。重点看i节点表
和数据块
。
每个文件对应i节点表
中的一条记录,文件的内容被碎片化的存储到数据块
中。碎片化,举一个具体的例子,比如说1KB的文件,分为两个小的数据块,一个512B,分别存储到数据块
区域的两个不连续的位置。
那么最重点的实现,就是这个i节点表
中的i节点
的实现。因为这个实现决定了文件真正在磁盘中的样子。
在每个i节点
里,又被分为了15个小段,其中
- 第1段存储了文件一些基本信息。
- 第2段到第12段,存了指针。这个指针指向上述说的
数据块
区域里面的一个数据块,这些就是文件的内容 - 第12段,存了指针。这个指针指向上述说的
数据块
区域里面的一个数据块,注意,这个数据块中记录的还是指针,而数据块中的这些指针还是指向数据块
区域里面的数据块,我们称为间接指针
,通过这样的方式,我们可以记录的文件内容可以翻256倍(原来只能指向一个数据块,现在可以指向256个)。 - 第13段,存了指针。但是是
二重间接指针
。原理同上,不说。 - 第14段,
三重间接指针
优雅的数据结构,具备了几个优点
- 碎片化的存储文件数据
- i节点结构固定,但是可以支持任意大小的文件
- 可支持文件空洞。即文件中间几个数据块不存在数据
- 最大支持4TB文件
综上,我们整体知道了操作系统大致是如何管理磁盘的,不得不说一个好的数据结构的伟大。
不仅如此,这个思想我认为还可以借鉴到我们实际的开发中,即对一个超大byte数组存储的管理,如Go中的对象数据管理等等,值得好好回味把玩。