Linux 基础IO (四)深入理解磁盘
目录一、共识原理二、认识理解硬件——磁盘物理结构三、磁盘的存储构成四、磁盘的逻辑结构CHS LBA地址转换关系CHS转成LBALBA转成CHS五、回归到硬件一、共识原理通过之前的学习我们知道文件分为打开的文件和没有被打开的文件打开的文件通常是内存级的文件没打开的文件则是磁盘上的文件这篇文章我们主要讲解磁盘上未被打开的文件如果文件没有被打开呢我们已经知道没有被打开的文件是在磁盘上进行存储那么我们又该如何研究磁盘上没有被打开的文件呢通过如下四点路径问题存储问题获取问题文件属性文件内容效率问题从本质上说文件由文件属性和文件内容组成。因此磁盘存储文件实际上就是存储这两部分信息。具体而言文件属性存储在inode中文件内容存储在数据块中 关于inode和数据块的详细说明将在后续内容中展开由此可见Linux系统中文件的磁盘存储采用的是属性与内容分离的存储方式。接下来让我们深入了解磁盘的相关知识。二、认识理解硬件——磁盘物理结构在正式讲解磁盘前我们先看一下光盘大多数人都使用过光盘通过影碟机去放映电影电视剧等上面是光盘的正反面示意图。光盘正面通常印有黑白或彩色图案来展示光盘的相关信息内容但这并非我们关注的重点。真正重要的是光盘的反面其光滑表面才是用于数据存储的部分。值得注意的是光盘通过影碟机播放影视内容影碟机本身不具备数据存储功能数据实际存储在光盘的反面正面印刷的图案区域无法存储任何数据 换言之只有光盘光滑的那一面才具有数据存储功能。而磁盘是计算机仅考虑台式计算机不考虑笔记本外设硬件中唯一的一个机械设备同时也是一个外设磁盘是永久性存储介质下面就是磁盘的一张图即磁盘的物理结构磁盘就是一块物理硬盘磁盘是一种类似于光盘的存储介质但两者在结构上存在差异。磁盘采用双面光滑设计通常由三张盘片组成每张盘片的两面都经过抛光处理因此一个标准磁盘共有六个光滑表面。每个表面都配有一个独立的磁头所以总共需要六个磁头进行数据读写。与内存相比磁盘具有明显的价格优势和更大的存储容量但同时也存在读写速度较慢的缺点。在磁盘结构中盘片中心设有主轴下方安装马达驱动装置。当主轴和马达运转时所有盘片会同步进行顺时针或逆时针旋转本文假设为顺时针方向。磁头通过磁力臂悬浮在盘片上方由磁力臂控制其左右移动六个磁头同步运动。值得注意的是虽然盘片表面看起来十分光滑但在放大镜下观察时实际能看到大量密集的微小突起结构。这些微观结构对数据存储起着关键作用。这些小突起实际上是磁性物质。既然磁盘与磁力相关而计算机底层只识别二进制序列且磁盘作为计算机外设需要实现数据输入输出那么它必须能够表征二进制序列。我们知道磁铁具有南北极S/N极因此可以通过设定盘片磁性物质的上表面初始状态全部为北极N表示二进制0需要时则通过磁头的电磁作用将其改为南极S表示二进制1。这样磁盘就能通过改变磁性物质的极性来存储二进制数据。为确保数据安全必须避免磁头与盘片接触。台式机因配备机械硬盘而不宜频繁移动——在移动或碰撞时磁头的左右移动与盘片的旋转可能在惯性作用下产生接触导致磁性物质被意外改变进而造成数据丢失。相比之下笔记本通常采用SSD固态硬盘没有机械部件抗震性能更好使用寿命也更长。值得注意的是机械硬盘在反复修改文件时需要磁头不断改变盘片磁性当改写次数达到极限就会失效。不过理论上其使用寿命可达3万小时约5-10年因此无需过度担忧。由于磁盘价格低廉且容量大企业机房通常采用磁盘阵列存储海量数据。这些磁盘会持续运行直至达到使用年限或出现故障。淘汰的磁盘必须进行专业销毁——不能简单转卖因为可能泄露用户数据。通常采用厂家提供的专业擦除技术来确保数据安全。三、磁盘的存储构成下面我们具体探索一下磁盘的存储构成如上图所示磁盘盘片由同心圆状的磁道组成。当多个盘面上半径相同的磁道在立体空间中形成柱面时每个磁道又被划分为若干扇区。标准扇区大小为512字节或4KB本文以512字节为例进行讨论。因此扇区是磁盘访问的最小单元。柱面 :每一面上相同半径的磁道逻辑上构成柱面 , 并且柱面上每个磁道的扇区个数是一样的 , 所以柱面数量上等于磁道数量 , 在第几个磁道上就等于在第几个柱面上 , 我们就可以理解为磁盘整体是由多个柱面构成的所以我们可以将磁盘视为由无数扇区组成的存储介质。要存储数据首先需要定位目标扇区这一过程分为三个步骤确定盘面位置通过选择对应的磁头确定磁道位置即确定柱面位置确定扇区位置这种定位方法称为CHS寻址CCylinder柱面(选择哪一磁道)HHeads磁头(选择哪一面)SSector扇区结合磁盘物理结构来看磁头左右移动用于定位磁道/柱面选择特定磁头用于定位盘面盘片旋转用于定位扇区这三个机械运动的组合就实现了CHS寻址方式。此时我们对磁盘机械运动有了新的认识数据存取时磁头定位扇区的机械运动次数直接影响效率。运动越频繁效率越低反之则越高。因此软件设计中通常会刻意将关联数据存储在相邻区域。这是因为当读取某个数据后紧接着访问其关联数据的概率很高比如按索引顺序连续访问的情况。四、磁盘的逻辑结构在认识磁盘的逻辑结构前先介绍一下盒式磁带:将盒式磁带放入录音机播放时磁带会从一个卷轴转移到另一个卷轴。磁带表面存储着音频数据录音机通过读取这些数据来播放声音。播放完毕后如需重复收听需要将磁带反面放入进行倒带操作。实际上磁带中的数据存储并不依赖于卷轴结构。我们可以将磁带完全展开成直线录音机依然能通过读取磁带上的磁信号来播放声音。这种展开状态更直观地展示了数据的线性存储方式。通过这个类比我想说明的是数据存储介质如磁带可以以展开的线性形式存在其上存储的信息同样能被读取设备识别和处理。回归到磁盘结构上。以上图为例磁盘的盘片由多个同心圆磁道组成每个盘面一个盘片有上下两个盘面可以视为无数个半径不同的环形磁道。类比盒式磁带的原理正如磁带可以拉直展开我们同样可以将盘面上的环形磁道抽象为一条直线。这样三个盘片共六个盘面的磁道就能拼接成一条更长的直线。如前所述磁盘是由无数扇区组成的存储介质多个扇区构成一个磁道。既然盘面磁道已被抽象为直线我们可以进一步细分按照扇区组成磁道的方式将这条直线划分为最基本的512字节扇区单元。此时在逻辑层面磁盘就呈现为一个基于扇区的线性数组结构。每个扇区就像等于是一个三维数组的下标柱面(磁道) --- 盘面(磁头) --- 扇区(数组下标)此时在逻辑层面磁盘就呈现为一个基于扇区的线性数组结构。所以每一个扇区都有一个下标我们叫做LBA(Logical Block Address)地址其实就是线性地址。通过这种抽象方法我们就可以这个三维数组逻辑转化为一个一维数组, 磁盘的物理结构就可以展开为线性逻辑结构如下图示。基于这种逻辑视图我们能够通过计算实现逻辑扇区地址LBA到物理地址CHS的转换。上图是磁盘LBA地址与CHS物理地址的转换讲解核心是把磁盘的逻辑扇区地址LBA转成实际的物理CHS地址磁道C、磁头H、扇区S磁盘LBA地址与CHS物理地址的转换核心是将逻辑扇区地址LBA对应到实际物理地址磁道C、磁头H、扇区S其基础设定为总扇区120000个、分6个盘面对应6个磁头盘面号磁头号且从0开始单个盘面扇区数20000个120000÷6、磁道数400个单个磁道扇区数50个20000÷400转换逻辑以LBA43999为例先通过LBA除以单盘面扇区数取商得到磁头号H243999÷200002再用LBA除以单盘面扇区数取余数得到该盘面内剩余扇区399943999%200003999接着用盘面内剩余扇区除以单磁道扇区数取商得到磁道号C793999÷5079最后用盘面内剩余扇区除以单磁道扇区数取余数再加1扇区从1开始得到扇区号S493999%5049最终LBA43999对应的CHS为C79磁道、H2磁头、S49扇区反向验证可通过公式LBA磁头号×单盘面扇区数磁道号×单磁道扇区数扇区号代入CHS2、79、49计算得2×2000079×504943999与原LBA一致整体就是将磁盘逻辑编号对应到实际物理位置盘面、磁道、扇区的方法。CHS LBA地址转换关系CHS转成LBA磁头数*每磁道扇区数 单个柱面的扇区总数LBA 柱面号C单个柱面的扇区总数 磁头号H每磁道扇区数 扇区号S - 1即LBA 柱面号C*(磁头数每磁道扇区数) 磁头号H每磁道扇区数 扇区号S - 1扇区号通常是从1开始的而在LBA中地址是从0开始的柱面,磁道,扇区都是从0开始编号的总柱面磁道个数扇区总数等信息在磁盘内部会自动维护上层开机的时候会获取到这些参数。LBA转成CHS柱面号C LBA // (磁头数*每磁道扇区数)【就是单个柱面的扇区总数】磁头号H (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数扇区号S (LBA % 每磁道扇区数) 1//表示取整所以从此以后在磁盘使用者看来根本就不关心CHS地址而是直接使用LBA地址磁盘内部自己转换。磁盘就是一个元素为扇区的一维数组数组的下标就是每一个扇区的LBA地址。OS使用磁盘就可以用一个数字访问磁盘扇区了。五、回归到硬件其实不仅仅CPU有寄存器其它设备外设也有磁盘也有例如控制寄存器数据寄存器地址寄存器状态寄存器等当CPU或操作系统需要与磁盘交互时首先会向磁盘发送控制指令。例如执行写入操作w时系统会将内存中待写入数据的起始地址存入磁盘的数据寄存器同时将逻辑扇区地址LBA存入地址寄存器。磁盘获取LBA地址后会通过转换算法将其转换为CHS地址柱面-磁头-扇区地址从而精确定位目标扇区位置。在数据写入过程中磁盘的状态寄存器会显示未就绪状态。操作系统通过持续检测状态寄存器发现该状态后会使当前进程进入阻塞等待状态。当磁盘完成数据写入后状态寄存器会变为就绪状态。操作系统检测到这一变化后会唤醒处于阻塞状态的进程使其恢复运行状态。至此数据成功写入到由LBA转换后的CHS地址所对应的磁盘扇区中。