欢迎 wx 重视 SH的全栈笔记

磁盘这玩意儿,即便不作为一个开发人员咱们也会常常跟它打交道。比方你家里的台式机,或许拿来工作的电脑,再比方你装个操作系统,会涉及到对磁盘进行分区。

而作为开发人员,天然更加需求重视磁盘。

平常你开发的代码会暂存在磁盘上;开发顶用的最多的数据库 MySQL,其数据是耐久化到磁盘中的;Redis 的耐久化数据是落到磁盘的;Zookeeper 内存中的数据、事务日志、快照会耐久化到磁盘;像 RocketMQ 这种音讯队列也会将收到的 Message 耐久化到磁盘,Kafka 当然也不例外;

能够说,磁盘和咱们的开发息息相关。但或许在平常的开发中,很多人会忽略掉磁盘的存在,由于尽管息息相关,但很惋惜,不是直接相关。由于上面说到的一切的和磁盘相关的内容,都现已由工具帮咱们做了,乃至包含你的代码。

这种感觉就好像,鱼(或许)不怎样留意水,咱们平常不太会留意氧气。

咱们或许听过,磁盘 IO 慢,为什么?咱们或许听过,磁盘次序 IO 会快些,为什么?咱们或许听过磁盘的次序 IO 乃至比内存随机 IO 要快,为什么?

或许这些问题,咱们都不一定能做个清晰的解说,这也是为什么我想聊聊磁盘。

磁盘分类

首要,按照原理来分,磁盘能够分为三类:

  • 机械硬盘(HDD)
  • 固态硬盘(SSD)
  • 混合硬盘(SSHD)

本篇文章的重点会放在 HDD 上。

场景切入

首要仍是通过一个很简略的场景来切入,如下:

磁盘原理简要分析

你在你的电脑上创建了个文件,然后写了点东西进去。然后你 N 天后打开电脑,看到这个文件还在(废话)。这实际上便是数据被耐久化进了磁盘,下次需求文件时再从磁盘中取出来。

这个存、取的过程其实对咱们完全无感知的,咱们就知道装机的时分安了一块硬盘,其他的啥也不知道。

磁盘结构

那磁盘里终究长啥样呢?它是怎样样把文件存储起来的?以什么样的方式存储的?带着这样的问题来看一个图:

磁盘原理简要分析

结合上面的结构图能够看出来,现代干流的磁盘规划便是在一个 Spindle(主轴)上,有一些 platter(盘片),然后盘片会绕着主轴旋转,然后读数据、写数据则由读写磁头来实现,读写磁头会安装在磁头臂上,磁头臂能够滚动,掩盖到盘片的一切的半径,再调配主轴的旋转,然后使磁头能够获取到盘片上任何一个扇区的数据。

那你或许会猎奇了,这个盘片到底要怎样做、怎样规划才能把上文说到的文件给存储下来呢?

要知道,现在的磁盘盘片大多都是由非磁性资料,通常是铝合金、玻璃或许陶瓷制成的,你的印象中,他们能够拿来存储文件吗(再次手动狗头)

已然说到了非磁性,那么答案肯定就跟磁性有点关系…

盘片构造

没错,盘片的两个面会被涂上一层薄薄的磁性资料,有多薄呢?大约是 10-20 纳米,然后外面给包了层碳来作为保护,这层薄薄的磁性资料便是存储数据的关键

磁盘原理简要分析

一个磁盘一般都会有多个盘片,而且刚刚说到的磁性资料盘片的两个面都有。换句话说,盘片的两个面都能用于存储、读取数据。

现在咱们知道了,数据其实是存在磁性资料上的,那这儿再考虑一个问题:「磁盘怎样知道,数据该存在哪块磁性资料上?读取的时分又该从哪块资料上读?读多少?

这个道理其实跟咱们的地图是相似的,举个比如,我国这么大,咱们要怎么清晰、准确的描述某一个当地呢?这个答案其实大家都知道,那便是分层分级

举个比如,网购让你填的收货地址便是这样,比方「四川省-成都市-xx区-xx大街-x栋x号-xxxx室」,这样的分层逻辑能够很直观的表示一个特定、详细的方位,而不用说大约那一块,先往我国西南走、走到城市之后继续往西走,大约走多久之后,再往南走,命运好的你就能找到那个地址了(再次手动狗头)。

盘片上也是做了相似的事情,先看个图:

磁盘原理简要分析

中间的黑点便是主轴,以主轴为圆心划分了多个磁道(为了便利了解图中只给出了 3 个磁道),每个磁道上又划分出了多个区域,每个区域叫做扇区,而且每个扇区的巨细是固定的 512 字节。读取数据的时分,只需求通过这个划分就能够知道数据在哪个磁道、哪个扇区了。

但是通过上图仍是能看出一个问题:那便是不同的磁道扇区数是相同的,扇区地点的磁道半径约大,则扇区的面积就越大。但无论面积比靠内磁道的扇区大多少,按照规划、规则只能存储 512 字节的数据,这样一来会浪费大量的存储空间

为了优化这个问题,就有了 ZBR 技术方案。

ZBR,全称 Zone Bit Recording,用来处理传统盘片的磁道扇区存储空间浪费的问题。它是怎样做的呢?说起来也很简略,越靠外圈磁道的扇区由于面积会更大,所以 ZBR 会放置更多的扇区,然后将空间利用起来。

转换成图形或许便是这样:

磁盘原理简要分析

不同的磁道扇区数量不同了,外圈磁道上面的扇区会更多些,然后充沛的利用空间,提高磁盘的总容量。

存储原理

好,继续深化问题盘片存储相关的问题。

咱们知道从微观上来看,计算机并不会管你是谁,到它这都是 0101010101。那么当读取文件的时分,它是怎么从这层磁性资料中辨认出来 0101010101,然后还原成咱们能看懂的文件的?

前面咱们知道盘片上划分了磁道、扇区,相应的磁性资料也同理。现代磁盘便是通过磁化盘片两面的磁性资料来记录数据的,磁性资料序列的改动则代表了对应的二进制 0、1。

磁盘原理简要分析

能够看到,两个磁性 Region 的序列方向不同,则标记为 R(Reverse),相同则标记为 N(No Reverse),当读取的时分,如果探测到序列是 RR,则对应 1,而如果是 NR,则对应 0(或许这便是为什么它叫磁盘吧,再再次手动狗头)

所以,咱们常说的写磁盘并不是说读写磁头在盘片上刻东西,而是改动磁性资料的序列,而且读写磁头和盘片没有直接触摸,他们有个大约 10 nm 的间隔。

而且,从上述现状咱们能够简略推导,已然读写磁盘都是靠读取盘片上的磁性序列,而且盘片的两个面都能用于存储数据,那么必然盘片的每个面都有磁头

磁盘功能

了解完一些简略的原理之后,咱们终于能够来了解磁盘功能相关的问题了,咱们会深化的分析为什么磁盘 IO 是个十分贵重的操作。

现在考虑一个问题,咱们要查询数据,底层会怎样做?是不是会:

  • 将磁头移动到方针文件地点的磁道
  • 此时盘片正被主轴带着旋转,磁头需求等候对应的扇区旋转到磁头这才能读取数据
  • 对应扇区到了之后,就需求等候读取数据&传输

总结一下,磁盘的 IO 请求耗时主要由三部分组成:

  • 磁头寻道时刻:这个推迟一般在 3-15 ms
  • 盘片旋转推迟:这个取决于主轴旋转的速度,随着速度的不同大约在 2-4 ms
  • 数据传输时刻:这儿均匀只用 3 微秒,跟上面两个比起来这儿的耗时能够忽略不计

这儿说到了旋转的问题,在盘片旋转推迟这儿,盘片旋转越快,则对应扇区移动到磁头的速度也会越快。

现代磁盘的旋转速度在 5400 或许 7200 RPM(Revolutions Per Minute)不等,当然也有一些高功能的服务器转速会达到 15000 RPM。

盘片旋转推迟的确和转速相关,由于转速越快,对应扇区移动到磁头的方位就越快。但并不是转速越快越好,由于转速越高,发热约严峻,磁盘的寿命也就越短。

下面给个不同的转速下对应的旋转推迟的参考:

旋转速度(单位 RPM) 均匀旋转推迟(单位毫秒)
4800 6.25
5400 5.55
7200 4.16
10000 3
15000 2

(以上数据来自 wikipedia)

或许你看到几毫秒觉得还好,并不是那么慢,但是跟内存的速度一对比你就能立马明白。内存的随机读大约在几百纳秒,假定内存的速度是 200 ns、磁盘的速度是 2ms(按上表中转速最高的推迟来算),差了 10000 倍,也便是 4 个数量级

到这儿,我想咱们也能了解为什么磁盘的次序读写能够与内存随机读一战了。由于磁盘次序读写几乎把前两个最耗时的操作给干掉了,磁头现已移动到了对应的磁道, 也找到了对应的扇区,直接写就完事了。

好了, 关于磁盘的原理就简略介绍到这儿。