磁盘文件
通过前一篇文章Linux——系统文件I/O,我们知道了如何对加载在内存中的文件进行读写等操作,并了解了其内在的原理。同时我们也应该清楚,并不是所有的文件都会被加载入内存,而没有被加载入内存的文件,就被存放在磁盘中,称为磁盘文件。现在,就让我们一起来学习磁盘文件的相关知识
本片思维导图:
注:本章思维导图对应的.xmind
和.png
文件都已同步导入至资源,供免费查阅
1. 磁盘的物理结构
1.1 两个重要的结构
磁盘的两个重要的物理结构为盘面和磁头:
盘面:
磁头:
1.2 CHS定位法
如何定位一个指定的扇区?我们可以通过这样的步骤:
既然文件存储在磁盘中,那么说到底它也就占用了数个扇区,因此我们就可以通过对文件占用的扇区进行记录,从而将对文件的查找转换为利用CHS定位法对文件所占用扇区进行查找
2. 磁盘的逻辑抽象
2.1 磁盘 -> 线性空间
我们可以来回忆一下以前听英语听力时用到的磁带,磁带盒里的磁带存储着数据,且是一个圆盘状,我们可以将其和磁盘的盘面类比。如果我们将磁带盒里的磁带都抽出来,那么它就成了数十米的条带。
类似的,我们也可以将磁盘作类似的抽象:将盘面的也像磁带一样展开,这样一个盘面也就成了一个线性的空间,而磁盘就是多个线性空间的组合,也就是一个巨大的线性空间,而这个空间的基本单位就是扇区
可以做出总结:磁盘实际上就是一个巨大的数组,数据的每个下标就是一个扇区
从而,我们对磁盘文件的管理就转换成了对数组的增删查改
既然扇区是这块线性空间的基本单位,那么空间的每个一下标就对应着一个扇区。我们在前面提到过用CHS定位法
找到扇区对应物理结构的位置,同样,我们也需要通过一个扇区编号这种线性地址来确定扇区所在的位置:
通过上面的方法,我们就可以将一个线性地址转换为CHS
地址
2.2 数据块
上面我们提到,磁盘IO的基本单位为一个扇区,也就是514字节,但是文件系统认为,一次之和磁盘交互512字节效率过于低下,因此规定,文件系统IO的基本单位为4Kb,也就是8个扇区。这一基本单位被称为数据块
从而,文件系统访问磁盘中的文件就变成了对特定数据块的访问,而为了找到指定的数据块,就需要用到LBA地址
2.3 分区与分组
上面我们将磁盘空间分割成了基本单位为4Kb
的线性空间,但是由于磁盘大小往往有几百甚至上千GB,数据块的数量太过庞大
因此操作系统对磁盘空间进行管理时需要采用分治策略:
2.3.1 分区的格式化
我们用鼠标右击电脑中的磁盘文件,可以看到“格式化”这一选项:
实际上,通常来说磁盘在出厂时就已经被格式化好了。但是如果我们要对这个磁盘进行分区管理(例如将D盘分200G给E盘),我们就要对分区进行格式化操作:
- 格式化磁盘分区是分区使用前的必要步骤
- 被格式化后的分区就是一个文件系统
- 格式化会清空分区原有的数据,因此要注意重要数据的备份
2.3.1 组(group)的管理
一个组(group)的内容通常由下面这些内容组成:
为了方便理解这些内容,我们先来回顾一下文件这一概念:
inode Table && inode Bitmap:
Data Blocks && Block Bitmap:
文件内容和属性的联系:
Group Descriptor Table:
Super Block
2.3.2 目录、文件名与inode
在Linux中,一切皆文件。因此我们知道目录也是一个文件,因此目录也有它的inode
与inode 编号
:
而目录的内容,存放的就是目录里面文件名和文件对应inode 编号
的映射关系
我们前面提到过,系统查找一个文件时,直接使用的不是文件名,而是该文件的inode 编号
,具体过程应该是这样的:
因此我们可以得出这样的结论:
- 文件的增、删、查、改都是和文件所在的目录有关的
- 查找一个文件,都要逆向回溯到根目录
/
,从根目录进行路径解析,从而得到文件的具体位置
有了对inode的理解,我们也可以重新回顾一下目录权限的概念:
2.3.3 重谈文件的新建与删除
新建文件:
删除文件:
注意: