⚙️ 第五章 内存与磁盘的密切联系
📄 一句话概括

机械硬盘就是一套精密的唱机:盘片、磁头、磁道、扇区、柱面;慢的不是读,是找——而这一章所有办法都在减少找。

📝 本节和前面几节的关系

5.1~5.5 都在绕开磁盘的速度差,这一节回到它本身,看看它究竟慢在哪儿,也是本章的收口。

一、结构:一套精密的唱机

盘片——表面涂了磁性材料,数据就记在上面,正反两面都能用;一个硬盘里通常叠着好几片。 磁头——贴着盘片飞,负责读和写;离得极近,所以硬盘怕震动。 磁道——盘片上的一圈圈同心圆,每一圈叫一条磁道。 扇区——磁道再切成小段,读写就是以扇区为单位一块一块来的。 柱面——多片盘上半径相同的磁道合起来叫一个柱面,跨盘片换磁头比挪磁头快,所以数据常按柱面排。

二、读一次要经历什么

要读一块数据,得走三步: 一、寻道——把磁头移到目标磁道上去,纯机械移动,最贵的一步。 二、旋转等待——等盘片转到那个扇区下面。转速固定,平均要等半圈。 三、传输——真正把数据读出来。这一步其实是电信号,很快。 于是总时间 = 寻道 + 旋转延迟 + 传输——前两项都是机械动作,占了大头。

三、三个时间各是多少

以 7200 转/分的硬盘为例:每秒 120 圈,转一圈 8.33 毫秒,平均旋转延迟 4.17 毫秒。 寻道通常几毫秒,旋转等待几毫秒——加起来十毫秒上下。 而传输呢?连续读一磁道的数据只要不到一毫秒。 所以对比很清楚:找一次要十毫秒,读一大批才花一毫秒。

四、于是所有优化都指向同一个方向

既然找贵、读便宜,那么所有办法都在一句话里:别找,或者一次多读点。 顺序访问优于随机访问——顺着读最省找的时间。 连续存放优于分散存放——文件系统拼命让同一文件的数据挨着放。 缓存有用——找过的地方留一份,下次就不用找了(5.2)。 SSD 有用——干脆取消【找】这个动作(5.4)。 回过头看,这一章六节讲的其实是同一件事:怎么少让 CPU 等磁盘找数据。

五、动手 Demo:了解一下磁盘的物理结构

机械硬盘的内部就是一套非常精密的唱机:盘片、磁头、磁道、扇区、柱面。 读一次要经历:寻道 → 旋转等待 → 传输。

for rpm in (5400, 7200, 15000):
    rps = rpm / 60.0
    print("%d 转/分:每秒 %.0f 圈,转一圈 %.2f 毫秒,"
          "平均旋转延迟 %.2f 毫秒" % (rpm, rps, 1000.0 / rps, 500.0 / rps))

实跑输出:

--------------------------------------------------------------------
了解一下磁盘的物理结构
--------------------------------------------------------------------

机械硬盘的内部其实就是**一套非常精密的唱机**:

  部件     作用
  --------------------------------------------------------
  盘片     表面涂磁性材料,数据就记在上面,正反两面都能用
  磁头     贴着盘片飞,负责读和写;离得太近,所以怕震动
  磁道     盘片上的一圈圈同心圆,每一圈叫一条磁道
  扇区     磁道再切成小段,读写以一块一块为单位
  柱面     多个盘片上半径相同的磁道合起来叫一个柱面

  算一下容量,再看速度瓶颈在哪儿:

  参数              取值                        算出来
  ----------------------------------------------------------
  盘片数 × 面数     2 片 × 2 面 = 4 面          4 组读写面
  每面磁道数        100000 条
  每磁道扇区数      1000 个
  每扇区字节数      512 字节
  总容量            4 × 100000 × 1000 × 512     约 204.8 GB

  转速            每秒转几圈     转一圈         平均旋转延迟
  -----------------------------------------------------------
  5400 转/分      90 圈          11.11 毫秒     5.56 毫秒
  7200 转/分      120 圈         8.33 毫秒      4.17 毫秒
  15000 转/分     250 圈         4.00 毫秒      2.00 毫秒

  两条结论:
    **定位是毫秒级的,内存是纳秒级的**——两者差着上百万倍
    **磁盘慢的不是【读】,是【找】**——顺着一圈读下去其实不慢

7200 转的盘,转一圈 8.33 毫秒、平均等半圈 4.17 毫秒,再算上几毫秒的寻道——一次随机读就要十毫秒左右。 而连续读一磁道只要不到一毫秒:磁盘慢的不是读,是找。

30 秒实验

  1. 用 5400 转的转速算一遍旋转延迟,和 7200 转比差多少。
  2. 想想为什么播放一个大视频文件很流畅,而打开一堆小文件却很慢。

常见误区

  1. 以为硬盘慢在【读得慢】。慢在【找】,连续读其实不慢。
  2. 以为寻道和旋转延迟可以省掉。它们是机械动作,只能绕开不能加快。
自测三问(点开对答案) 1. 机械硬盘的几个主要部件是什么? —— 盘片、磁头、磁道、扇区、柱面。 2. 读一次数据要经历哪三步? —— 寻道(移动磁头)→ 旋转等待(等盘片转到位置)→ 传输数据。 3. 哪一步最贵,为什么? —— 寻道和旋转等待,都是机械动作、以毫秒计;传输是电信号,快得多。

相关笔记