mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
536 字
2 分钟
为什么 CPU 访问硬盘很慢
2023-10-08

CPU 的运算速度极快,但访问硬盘却需要毫秒级延迟。为什么 CPU 访问硬盘这么慢?从存储层次说起。

一、存储层次结构#

1.1 存储金字塔#

flowchart TB subgraph 速度最快,容量最小 CPU1[CPU 寄存器] Cache1[L1 Cache] Cache2[L2 Cache] Cache3[L3 Cache] end subgraph 速度中等,容量中等 M[主内存<br/>DDR RAM] end subgraph 速度慢,容量大 SSD[SSD] end subgraph 速度最慢,容量最大 HDD[机械硬盘] end CPU1 --> Cache1 --> Cache2 --> Cache3 --> M --> SSD --> HDD CPU1 -.-|~1 ns| CPU1 Cache1 -.-|~1 ns| Cache1 M -.-|~100 ns| M SSD -.-|~100 μs| SSD HDD -.-|~10 ms| HDD style CPU1 fill:#f96 style Cache1 fill:#ff9 style Cache2 fill:#ff9 style Cache3 fill:#ff9 style M fill:#9f9 style SSD fill:#9f9 style HDD fill:#f66

1.2 访问延迟对比#

存储类型访问延迟相对速度
CPU 寄存器0.3 ns1x
L1 Cache1 ns3x
L2 Cache3 ns10x
L3 Cache10 ns30x
主内存 (RAM)100 ns300x
NVMe SSD10 μs30,000x
SATA SSD100 μs300,000x
机械硬盘10 ms30,000,000x

10ms vs 0.3ns = 3300 万倍!

二、为什么硬盘这么慢?#

2.1 机械硬盘的工作原理#

flowchart LR subgraph 机械硬盘内部 P[盘片<br/>旋转中] A[机械臂] H[磁头] end P -->|旋转 7200 RPM| R[7200 转/分] A -->|移动| S[寻道] H -->|读写| D[磁盘表面] Note over R: 盘片旋转延迟 Note over S: 磁头寻道延迟

机械硬盘延迟的来源

| 延迟来源 | 典型值 | | ------------ | ------------------ | -------- | | 旋转延迟 | 盘片旋转到正确位置 | ~4-8 ms | | 寻道延迟 | 磁头移动到磁道 | ~3-10 ms | | 传输延迟 | 数据读写 | ~0.5 ms |

2.2 SSD 为什么更快#

flowchart LR subgraph SSD 内部 F[Flash 控制器] N[NAND Flash 芯片] end F -->|并行读写| N Note: SSD 没有机械运动<br/>只有电子操作
SSD 延迟典型值
读取延迟0.1-0.2 ms
写入延迟0.1-0.5 ms

三、CPU 与硬盘的通信#

3.1 DMA 机制#

sequenceDiagram participant CPU as CPU participant DMA as DMA 控制器 participant DISK as 硬盘 CPU->>DMA: 设置传输参数 DMA->>DISK: 发起读取请求 DISK->>DMA: 传输数据到内存 DMA->>CPU: 传输完成中断 Note over CPU: 可以继续做其他事

3.2 为什么不能直接访问硬盘#

CPU 不能直接"读取"硬盘数据,原因:
1. CPU 只能访问内存地址空间
2. 硬盘数据必须先加载到内存
3. 这个过程涉及 I/O 总线和 DMA

四、延迟的可视化#

4.1 如果 CPU 等硬盘#

# 如果 CPU 等待硬盘会怎样?
cpu_cycle = 0.3 # ns
hdd_latency = 10_000_000 # ns
# CPU 在等待期间可以执行
cycles_wasted = hdd_latency / cpu_cycle
print(f"CPU 白白等待期间可以执行 {cycles_wasted:,} 个周期")
# 33,333,333 个周期!
# 相当于
# 1 GHz CPU 可以执行 10^9 周期/秒
# 等待 10ms = 等待 10,000,000 个周期
# 在 1 GHz CPU 上 = 10 毫秒

4.2 延迟等效换算#

硬盘延迟等效 CPU 等待
10 ms一个人等 7 个月
100 ms一个人等 6 年
1 s一个人等 60 年

五、如何隐藏硬盘延迟#

5.1 预读取(Prefetch)#

flowchart LR A[读取文件] --> B{预测未来读取} B -->|是| P[预读取到缓存] B -->|否| D[立即读取] P --> C[使用缓存] D --> C

5.2 异步 I/O#

# 异步 I/O 避免阻塞
import asyncio
async def read_file():
# 发起读取,不阻塞
data = await aiofiles.open('large_file', 'r')
return data
# CPU 可以在等待期间做其他工作

5.3 缓存#

# 多级缓存
memory_cache = {} # 内存缓存
def read_data(key):
if key in memory_cache:
return memory_cache[key] # 内存命中,~100ns
# 从 SSD 读取,~100μs
data = ssd_read(key)
memory_cache[key] = data
return data

六、总结#

6.1 硬盘延迟如此高的原因#

原因说明
机械运动磁盘旋转 + 磁头寻道
物理限制机械运动速度有上限
总线传输I/O 总线带宽有限

6.2 存储层次的意义#

层次作用
寄存器CPU 直接访问,零延迟
Cache缓存热点数据
内存主存储,运行数据
SSD快速持久存储
HDD大容量冷存储

核心观点:存储层次是性能和容量的平衡。越快的存储越贵、容量越小,因此需要通过缓存和预取等技术来隐藏延迟。

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

为什么 CPU 访问硬盘很慢
https://blog.souloss.com/posts/why-the-design/why-cpu-access-to-disk-is-slow/
作者
Souloss
发布于
2023-10-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时