简单聊聊硬盘(上)

前言

再过几个小时就 2021 了,趁着 2020 还有富余的几个小时,把这个月的博客给更新上。

最近一直在补计算机底层的知识,于是把今年最后一更交给硬盘了。

注:全文硬盘都是指机械硬盘,也就是 HDD 硬盘,磁盘也是指代硬盘。

结构

实物图

在这里插入图片描述

逻辑图

在这里插入图片描述

盘片、盘面和磁头

一张盘上下两面,每面都有一个磁头对应着。
在这里插入图片描述
上图显示四个磁头,对着两个盘片,每个盘片上下两面。

磁道、柱面和扇区、簇/块

磁盘上的数据都存放于磁道上。磁道就是磁盘上的一组同心圆,其宽度与磁头的宽度相同。为了避免减少干扰,磁道与磁道之间要保持一定的距离,最外层为 0 道。

具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。比如两个盘片,四个盘面,最外层的 0 磁道组合一起就是一个柱面(理解困难的,可以参照上面逻辑图的柱面 c 和下个章节计算磁盘容量的图例)。

在这里插入图片描述
上图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区。扇区是磁盘存储的最小单位,单位为 512 字节(现在新的硬盘扇区单位为 4096 字节,也就是 4K,为传统的 8 个扇区)。

为了对扇区进行查找和管理,需要对扇区进行编号,扇区的编号从 0 磁道开始,起始扇区为 1 扇区,其后为 2 扇区、3 扇区……,0 磁道的扇区编号结束后,1 磁道的起始扇区累计编号,直到最后一个磁道的最后一个扇区(n 扇区)。例如,某个硬盘有 1024 个磁道,每个磁道划分为 63 个扇区,则 0 磁道的扇区号为 1 ~ 63,1 磁道的起始扇区号为 64 最后一个磁道的最后一个扇区号为 64512。

注:磁道从 0 开始,扇区从 1 开始。

磁盘块/簇是个逻辑概念。 块是操作系统中最小的逻辑存储单位。操作系统与磁盘打交道的最小单位是磁盘块。

通俗的来讲,在 Windows 下如 NTFS 等文件系统中叫做簇;在 Linux 下如 Ext4 等文件系统中叫做块(block)。每个簇或者块可以包括 2、4、8、16、32、64… 2 的 n 次方个扇区。

为什么存在磁盘块/簇?

读取方便:由于扇区的数量比较小,数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作。

分离对底层的依赖:操作系统忽略对底层物理存储结构的设计。通过虚拟出来磁盘块的概念,在系统中认为块是最小的单位。

磁盘容量计算

那怎么计算磁盘容量呢?

存储容量 = n × t × s × b。

其中 n 为保存数据的总盘面数(磁头数,一个盘有正反两面,两个磁头,因此磁头数可视为盘面数,同时盘面从底层 0 编号开始,0-1、2-3);t 为每面磁道数;s 为每道的扇区数;b 为每个扇区存储的字节数。

注:盘面从底层 0 编号开始,0-1、2-3 一对对出现。

在这里插入图片描述

上图中磁盘是一个 3 个圆盘 6 个磁头,7 个柱面(每个盘片 7 个磁道)的磁盘,图中每条磁道有 12 个扇区,所以此磁盘的容量为: 6 * 7 * 12 * 512 = 258048。

CHS & LBA

有了扇区(sector),有了柱面(cylinder),有了磁头(head),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS(也称3D),对早期的磁盘非常有效,知道用哪个磁头,读取哪个柱面上的第几扇区就 OK 了。

但是 CHS 模式支持的硬盘容量有限,用 8bit 来存储磁头地址,用 10bit 来存储柱面地址,用 6bit 来存储扇区地址,而一个扇区共有 512Byte,这样使用 CHS 寻址一块硬盘最大容量为 256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按 1MB=1000000B 来算就是 8.4GB)。

注:早期硬盘之所以容量小,是因为扇区是等密度的,也就是最里层和最外层的密度是一样的,优点是方便定位,缺点是浪费严重。

磁头数最大为 255 (8 个二进制位存储)。从 0 开始编号。

柱面数最大为 1023 (10 个二进制位存储)。从 0 开始编号。

扇区数最大数 63 (6 个二进制位存储)。从 1 始编号。

现代的磁盘人们改用等密度结构生产硬盘,也就是说,外圈磁道的扇区比内圈磁道多。这种磁盘里扇区是线性编号的,即从 0 到某个最大值方式排列,并连成一条线。这种寻址模式叫做 LBA,全称为 Logic Block Address(即扇区的逻辑块地址)。磁盘内部是自己会通过磁盘控制器来完成 CHS 到 LBA 的转换,进而定位到具体的物理扇区。

LBA 下的编号,扇区编号是从 0 开始。

逻辑扇区号 LBA 的公式:

LBA(逻辑扇区号) = 磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 – 1

例如:CHS = 0/0/1,则根据公式 LBA = 255 × 63 × 0 + 63 × 0 + 1 – 1= 0

也就是说 物理 0 柱面 0 磁头 1 扇区,是逻辑 0 扇区。

也就是说 LBA 就是扇区的编号, 按照磁道、柱面和磁头从小到大的顺序编号。

磁盘读取响应时间

先来介绍三个名词:寻道时间、旋转时间和数据传输时间。

寻道时间:磁头从开始移动到数据所在磁道所需要的时间,寻道时间越短,I/O 操作越快,目前磁盘的平均寻道时间一般在 3-15ms,一般都在 10ms 左右。

旋转时间:盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间,旋转延迟取决于磁盘转速。普通硬盘一般都是 7200 转,慢的 5400 转。

注:上面的 7200、5400,就是磁盘的盘片一分钟转 7200、5400 圈,也可以用 RPM(即每分钟的旋转圈数,Rotations Per Minute) 表示。

数据传输时间:完成传输所请求的数据所需要的时间。

从上面的指标来看、其实最重要的、或者说、我们最关心的应该只有两个:寻道时间;旋转延迟。

读写一次磁盘信息所需的时间可分解为:寻道时间、旋转时间、传输时间。为提高磁盘传输效率,软件应着重考虑减少寻道时间和旋转时间。

IOPS

IOPS(Input/Output Operations Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。

我们进行一次硬盘上的随机访问,需要的时间由两个部分组成。

先寻道,再旋转,这个过程中,寻道是最花费时间的。一般情况下,我们现在用的硬盘的平均寻道时间一般在 4-10ms;而寻道时间,随机情况下,平均找到一个几何扇区,我们需要旋转半圈盘面。上面 7200 转的硬盘,那么一秒里面,就可以旋转 240 个半圈。那么,这个平均延时就是 1s / 240 = 4.17ms。

注:7200 转是一分钟的转数,那具体到一秒钟那就是 7200/60=120,也就是 240 个半圈。

这样,就能够算出来,如果随机在整个硬盘上找一个数据,需要 8-14 ms。硬盘是机械结构的,只有一个电机转轴,也只有一个悬臂,所以没有办法并行地去定位或者读取数据。那一块 7200 转的硬盘,一秒钟随机的 IO 访问次数,也就是 1s / 8 ms = 125 IOPS 或者 1s / 14ms = 70 IOPS。

IOPS = 1000 ms/ (寻道时间 + 旋转延迟)。可以忽略数据传输时间。

7200 rpm 的磁盘 IOPS = 1000 / (9 + 4.17) = 76 IOPS。

10000 rpm 的磁盘 IOPS = 1000 / (6+ 3) = 111 IOPS。

15000 rpm 的磁盘 IOPS = 1000 / (4 + 2) = 166 IOPS。

前面提到过,为提高磁盘传输效率,软件应着重考虑减少寻道时间和旋转时间。

如果把寻道时间缩短为 0 呢,是不是速度立马就上提升了。也就是如果把数据存放到最外层的 0 磁道上,那么寻道时间就是 0 了,就剩下寻找时间了。大家电脑的 C 盘的数据就是在外层磁道上的,为的就是加快开机速度。

更近一步,如果把数据只用 1/2 或者 1/4 的磁道,也就是最外面 1/4 或者 1/2 的磁道。这样,我们硬盘可以使用的容量可能变成了 1/2 或者 1/4。但是呢,我们的寻道时间,也变成了 1/4 或者 1/2,因为悬臂需要移动的“行程”也变成了原来的 1/2 或者 1/4,我们的 IOPS 就能够大幅度提升了。

比如上面 7200 转的只用其中 1/4 的磁道,那么,它的 IOPS 就变成了 1s / (4.17ms + 9ms/4) = 155.8 IOPS,立马就接近 15000 转的磁盘了。

参考

硬盘基本知识(磁头、磁道、扇区、柱面)

带你一起学习硬盘的物理结构与磁盘分区原理

硬盘LBA 和CHS的关系

深入浅出计算机组成原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值