硬盘这东西想必我们都相当的熟悉,它存放了我们很多学习资料,还经常因为访问速度慢而被诸多文章拿出来“鞭挞”。
我找了个网站(文末贴链接),这个网站展示了从 1990 开始到 2020 不同介质数据访问的延迟时间。
我翻了一遍介质自身速度的数量级没有变化,内存访问延迟从 207ns 到 100ns,硬盘从 19ms 到了 2ms,但是介质之间的访问速度还是差了几个数量级。
不过上述我圈出来的是随机访问,顺序访问的话不会差这么多,想要知道为什么,那就需要了解下硬盘的构造。
当然,我今天提到的硬盘指的是机械硬盘,固态硬盘本文暂不涉及。
之所以写这篇文章是因为我之前一直对磁道、柱面、扇区等一些东西存在疑惑,比如:
所以今儿咱们来理一理,按照我的习惯我们还是先简单的看下历史。
1956 年 9 月 14 号,世界第一台磁盘存储设备 IBM 305 RAMAC 诞生,这个设备用盘片来存储数据,用磁头来读写数据,不过碍于当时的技术,这体积确实有点大,大约有两个冰箱那么大,来看下图就知道了。
中间的历史我看了看对我们没啥用,咱们就快进到 1973 年,那年 IBM 推出了一个代号称为 「温切斯特」的硬盘。
这种硬盘的特点就是磁头和磁片装在一个密闭空间里,当磁片高速自传之后磁头会因为空气动力而悬浮起来,然后磁头臂会操作磁头沿着盘片划圆弧状移动。
咱们现在的机械硬盘就是这样运行的,这么多年过去了,还是典型的「温切斯特」结构,也称为温盘。
至于为什么取这个代号,是因为当时研究出来的那个硬盘拥有两个 30MB 的存储单元,而「温切斯特来福枪」的口径和装药也刚好都是 30 ,所以代号就为 「温切斯特」。
历史咱们就了解到这一步差不多了,接下来看看硬盘的内部结构。
先来看看硬盘的真实样子,我就标注了一些重点部位。
我先简述一下硬盘是怎么运行的。
通电之后主轴带动盘片开始旋转,到达一定转速之后磁头就会悬浮在盘片上方,然后磁头臂就可以控制磁头做圆弧形的移动,通过盘片的旋转和磁头的移动就可能访问到盘片上任意地方的数据。
这里可能有人就会有疑问,为什么要让磁头浮起来?
首先磁头和盘片触碰的话就会有摩擦,摩擦久了之后肯定会有磨损,磨损了之后数据不就没了?
其次有摩擦力之后转速肯定就慢了,那磁盘的访问速度也就慢了。
所以悬浮很关键,而磁头悬浮的高度比头发丝还细,约 0.1微米,如果有灰尘进去可能会导致磁头和盘片磨损,这也是硬盘需要密封的原因。
那刚启动的时候磁头不是和盘片接触的吗?
是的,你说的没错,所以人们就想了个法子,也就是磁头停靠点,也就是上面图中画的地方。
当通电之后等达到一定转速磁头才会移动到盘片上,等断电之后靠着电容剩余的电量会把磁头移到停靠处,这样每次启动就不会磨损啦!
还有一种停靠方式是在盘片内圈搞了个不存数据的地方,材质都不一样,专门给磁头停靠。
为了在公众号插入视频,我还在腾讯视频上传了个视频,来自维基百科的硬盘运行视频,这个视频硬盘的停靠应该就是第二种方式。
大致清晰硬盘是如何运行之后,我们再来深入一下。
这里我本来想自己画图的,但是个人画画水平有限,人家画的太好了...所以就搬来了,哈哈哈。
先来看下盘面。
A 就是磁道,盘面就是由磁道这样的一组同心圆构成,注意是标红部位,是个环,有横截面的,有些参考书标记到线上去了....
B 是扇面,C 就是扇区,每个磁道都会被划分成一组扇区,每个扇区包含相等数量的数据位,一般为 512 字节,是硬盘存储数据最基本的单位。
D 是簇,即多个扇区组成的,像 DOS 就是以簇为单位为文件分配磁盘空间的。
从图中看,扇区好像是连续着的,其实不然,扇区之间其实有间隙,这些间隙是用来标识扇区的格式化位的,不会存储数据。
不知看到这大家是否有点疑惑,每个扇区包含相等的数据位,那明显距离圆心更近的同心圆扇区看起来能存的数据比最外围的扇区小很多,那岂不是外围的数据位要迁就最内部的?
是的。为了让每个磁道都有相等的扇区数,外圈磁道的扇区之间间隔很大,不过以前硬盘的数据存储密度很低,所以还能接受。
而随着硬盘存储密度的上升这样就造成了极大的浪费,因此就搞了个zoned-bit recording
技术,目的就是在外圈磁道上放置比内圈磁道更多的扇区,看下这个图就明白了。
具体怎么实现我就不展开了,这不重要。
重要的是解惑,并不是像有些书上说的,死板的按照最内圈的扇区数来确定所有磁道的扇区数。
硬盘通常由一个或者多个盘片组成。
例如下图就有三个盘片,每个盘片有上下两个盘面,对应的会有六个磁头。
磁头号从上到下以 0 开始计数,由磁头臂带领着磁头做圆弧形运动。每个盘面的磁道也由 0 开始计数,相同编号的磁道组成的区域称之为柱面,发挥下想象力应该可以 get 到,我再贴个图助力一下。
为什么要有柱面这一术语呢?
因为几个磁头其实都是依靠同一个磁头臂运动的,所以要转就一起转,并且都是一个角度。
因此想要数据读取的快,那么数据就应该在统一柱面上顺序存储。
比如最上面的盘面的第 1 个磁道上写不下了,那继续写到背部的第二个盘面上,这样磁头臂只要寻道一次即可,读数据的时候也只要寻道一次即可。
从这里我们也可以知道如果一个硬盘的盘片越多,速度就越快。
从上文我们已经知道硬盘是以扇区为基本单位的,所以硬盘的访问就是要找到对应的扇区。
盘片的表面是磁性的,盘片随着主轴旋转而转动,当要访问某个扇区的时候首先要转动磁头臂找到对应的磁道,这叫寻道时间。
这时盘片还是在旋转中的,磁头可以感知到下方数据位上的值,等旋转到目标扇区的时候就晓得该读/写数据了,这个时间称为旋转时间。
所以我们买硬盘的时候会看到 7200RPM、15000RPM 啥的,转的越快磁盘找到扇区的时间就越短。
最后就是读取数据的传送时间了。
所以硬盘数据访问延迟就是这三个时间相加,而最慢的就是寻道时间,我给下 CSAPP 提供的数据:
总延时=寻道时间+旋转时间+传送时间=9ms+4ms+0.02ms=13.02ms
当然不同的硬盘总延时肯定不一样,反正知道寻道时间最慢就行了。
从上述的物理结构我们已经知道需要找到盘面,再找到磁道,最后找到扇区才能读取数据,有点复杂。
没必要把这么不友好的访问姿势暴露给操作系统,所以就搞了个逻辑磁盘块,屏蔽了底层访问的细节,提供编号 0 、1、2.....n 这样的逻辑块序列来对应具体的物理块。
这样操作系统要访问磁盘就很舒服了,不过最终还是要找到对应的扇区的,而磁盘控制器就维护了逻辑块和实际物理扇区的映射关系。
磁盘控制器属于硬盘里面的一个硬件,它会将逻辑块翻译成:盘面、磁道、扇区这么一个三元组。
至此平时我们说的逻辑块与硬盘的物理访问也对应上了。
身为普通程序员我觉得对硬盘的了解到这个地步就差不多了,该知道的都知道了。
如果有什么纰漏指出欢迎指正!
https://colin-scott.github.io/personal_website/research/interactive_latency.html(各介质延迟的网站) https://en.wikipedia.org/wiki/Zone_bit_recording https://en.wikipedia.org/wiki/Hard_disk_drive https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98 《深入理解计算机系统》
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8