机械硬盘(Hard Disk Drive、HDD)和固态硬盘(Solid State Drive、SSD)是两种最常见的硬盘,作为计算机的外部存储,CPU 想要访问它们存储的数据需要很长时间,如下表所示,在 SSD 中随机访问 4KB 数据所需要的时间是访问主存的 1,500 倍,机械磁盘的寻道时间是访问主存的 100,000 倍:WorkLatencyL1 cache reference0.5 ns

Branch mispredict5   ns

L2 cache reference7   ns

Mutex lock/unlock25   ns

Main memory reference100   ns

Compress 1K bytes with Zippy3,000   ns

Send 1K bytes over 1 Gbps network10,000   ns

Read 4K randomly from SSD*150,000   ns

Read 1 MB sequentially from memory250,000   ns

Round trip within same datacenter500,000   ns

Read 1 MB sequentially from SSD*1,000,000   ns

Disk seek10,000,000   ns

Read 1 MB sequentially from disk20,000,000   ns

Send packet CA->Netherlands->CA150,000,000   ns

表 1 - 2012 年延迟数字对比[^1]

虽然磁盘的寻道时间只需要 10ms,但是在 CPU 看来已经是非常长的时间了,当我们将上述的时间等比例放大后,就能直观地感受到它们的性能差异。如果 CPU 访问 L1 缓存需要 1 秒,那么访问主存需要 3 分钟、从 SSD 中随机读取数据需要 3.4 天、磁盘寻道需要 2 个月,网络传输可能需要 1 年多的时间。

在计算机体系结构中,硬盘属于一种常见的输入输出设备,操作系统在启动时不一定需要硬盘,它既可以通过硬盘启动,也可以通过网络设备或者外部设备启动,所以硬盘不是计算机运行的必要条件。von-neumann-architecture.svg

图 1 - 输入输出设备

作为一种外部的输入输出设备,与 CPU 缓存和内存相比,硬盘极慢的读取和写入速度就显得比较合理了,然而几千倍甚至几十万倍的速度差异也确实让人很难想象或者接受,在这篇文章中,我们会分析为什么 CPU 访问硬盘的速度非常慢:CPU 访问硬盘数据的过程比较复杂,它会先通过 I/O 操作将磁盘中的数据读入内存,再访问内存的数据;

机械硬盘在访问磁盘中的数据依赖的是机械结构,需要移动磁盘中的机械臂;

I/O 操作

CPU 想要访问磁盘中的数据一定要先通过 I/O 操作将磁盘中的数据读入到内存中,再访问存储在内存中的数据。计算机中包含三种比较常见的 I/O 操作[^2] — 编程 I/O(Programmed I/O)、中断驱动 I/O(Interrupt-driven I/O)和直接内存访问(Direct Memory Access),我们接下来将依次介绍上述的这几种操作[^3]:io-operation

图 2 - 常见 I/O 操作

执行 I/O 操作最简单的形式就是使用编程 I/O,使用编程 I/O 时,CPU 会负责全部的工作,如果我们想要在屏幕上输出 Hello World,CPU 每次都会向 I/O 设备中写入一个新字符,写入后会轮询设备的状态等待它完成工作后写入新的字符。这种方式虽然简单,但是它会占用全部的 CPU 资源,在某些复杂的系统中会造成计算资源的严重浪费。

中断驱动 I/O 是执行 I/O 操作的一种更高效方式,在编程 I/O 中,CPU 会主动获取设备的状态并等待设备闲置,但是如果使用了中断驱动 I/O,设备会在闲置时主动发起中断暂停当前进程并保存上下文,而操作系统会执行 I/O 设备的中断处理程序:如果当前不包含待打印的字符,停止中断处理程序并恢复暂停的进程;

如果当前包含待打印的字符,将下一个字符拷贝到设备中并恢复暂停的进程;

使用中断驱动 I/O 可以在设备繁忙时,让 CPU 能够处理其它任务,尽可能地提高 CPU 的利用率,不再浪费珍贵的计算资源。与编程 I/O 相比,中断驱动 I/O 将一部分工作交给了 I/O 设备,所以能够提高资源的利用率。

直接内存访问会利用 DMA 控制器来执行 I/O 操作,中断驱动 I/O 需要为每个字符触发操作系统中断,这会消耗一定的 CPU 时间。当我们使用 DMA 控制器时,CPU 会一次将缓冲区中的数据全部读到 DMA 控制器中,DMA 控制器会负责将数据按字符写入 I/O 设备:dma-controller

图 3 - DMA I/O

虽然 DMA 控制器可以解放 CPU 并减少中断次数,但是它的执行速度与 CPU 相比却很慢,如果 DMA 控制器不能快速驱动 I/O 设备,CPU 可能就会等待 DMA 控制器触发中断,在这种情况下,中断驱动 I/O 或者编程 I/O 可以提供更快的访问速度。

在默认情况下,我们都会使用 DMA 控制器来执行 I/O 任务,不过编程 I/O 和中断驱动 I/O 也不是不能接受的选项。当 CPU 经常需要等待 DMA 控制器执行 I/O 任务时,使用中断驱动 I/O 甚至轮询的编程 I/O 都可以得到更高的吞吐量,然而无论使用哪种方式,I/O 都是程序中比较耗时的复杂操作。

机械硬盘

机械硬盘(Hard Disk Drive、HDD)是一种基于电子的、非易失的机械数据存储设备,它使用磁性存储器存储并查找磁盘上的数据,在读取和写入数据的过程中,硬盘机械臂连接的磁头会读写磁盘表面的位[^8]。

正是因为磁盘具有比较复杂的机械结构,所以磁盘的读取和写入都要花费很多时间,数据库的读写性能也基本都依赖于磁盘的性能,如果我们在使用机械硬盘的数据库中随机查询一条数据,这可能会触发磁盘的随机 I/O,然而将数据从磁盘读取到内存中所需要的成本是非常大的,普通磁盘(非 SSD)加载数据需要经过队列、寻道、旋转以及传输的这些过程,大概要花费 10ms 左右的时间。disk-random-io

图 4 - 磁盘的随机 I/O

我们在估算数据库的查询时可以使用 10ms 这个数量级对随机 I/O 占用的时间进行估算,这里想要说的是随机 I/O 对于数据库的查询性能影响会非常大,而顺序读取磁盘中的数据时速度可以达到 40MB/s,这两者的性能差距有几个数量级,因此我们也应该尽量减少随机 I/O 的次数,这样才能提高性能。

固态硬盘(Solid State Drive、SSD)是一种以闪存作为持久存储器的电脑存储设备[^9]。与机械硬盘不同,固态硬盘中不包含任何的机械结构,我们使用它读取或者存储数据时不会使用到任何的机械结构,因为一切过程都是由电路完成的,所以 SSD 的读写速度比 HDD 快很多。hdd-ssd-price

图 5 - HDD 和 SSD 的价格

机械硬盘和 SSD 从诞生后价格都在不断降低,机械硬盘是今天数据中心使用的主要外部存储,大多数通用的商用服务器都会使用机械硬盘作为主要的外部存储,但是因为 SSD 的读写速度是机械硬盘的几十倍,所以越来越多的服务器,尤其是数据库都会使用 SSD 作为外部存储。不过作为具有机械结构的外部存储设备,它虽然结构非常成熟并且具有较大的容量,但是它在受到震动时很容易受到外界的干扰。

总结

硬盘是计算机上的外部存储设备,它可以持久存储大量数据,然而 CPU 无法直接访问硬盘中的数据,当计算机启动时操作系统会将硬盘中的数据加载到内存中以便 CPU 访问,但是如果 CPU 要访问的数据不在内存中,那么我们需要花费几千倍甚至几十万倍的时间来读取数据,这主要是由以下两个原因造成的:CPU 需要通过 I/O 操作访问外部存储中的数据,编程 I/O、中断驱动 I/O 和 DMA 几种方式都会带来额外开销并占用较多的 CPU 时间;

机械硬盘会通过机械结构访问其中存储的数据,每一次硬盘的随机 I/O 都需要执行队列、寻道、旋转和转移数据几个过程,大约需要消耗 10ms 的时间;

正如我们在文章中提到的,硬盘不是计算机运行的必要硬件设备,计算机可以从磁盘、光盘等任意外部存储设备中将启动所需要的数据加载到内存中并正常启动,不过硬盘已经是今天最为常见的外部存储设备了。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:写入到硬盘上的数据一定会被持久存储,不会丢失吗?

内存中的数据为什么在断电重启之后就会被清空?

cz73 读取速度慢_CPU 访问硬盘速度很慢的原因找到了相关推荐

  1. ssd硬盘 速度慢 linux,固态硬盘速度太慢 快不起来?你或许犯了这四个SSD使用错误 (全文)...

    好不容易省吃俭用买了一块SSD固态硬盘,心情激动的安装.重装系统.开机后却怎么都觉得速度不对?当你开始怀疑是不是CPU.内存等配件拖慢你SSD速度的时候,有没有考虑是自己犯了下面这些错,拖慢了固态硬盘 ...

  2. 计算机硬盘读取超慢,如何解决电脑硬盘速度慢

    如何解决硬盘速度慢 突然发现自己的电脑变得很慢了,鼠标有时也不听使唤.开始以为中毒,,杀毒也没有问题.但是看到硬盘指示灯一直闪的,就搞硬盘测试软件查看一下..HDTune..结果发现问题原因所在.如图 ...

  3. 提高计算机访问硬盘的速度慢,如何加快硬盘相应速度?6大方法提高-万兴恢复专家...

    硬盘对于计算机系统的正常工作至关重要.它提供了大量的空间来存储数据.现在每个现代计算机系统都有一个快速和大型的硬盘驱动器,有助于快速检索文件和程序.但是,如果积累太多杂乱,即使最快和最大的硬盘驱动器也 ...

  4. 固态硬盘开卡软件_有一种软件号称能让固态硬盘速度飞起,到底靠不靠谱?

    有这么一类"固态硬盘加速神器",开启后能让普通的SATA固态硬盘跑出比NVMe固态硬盘还要高的分数.它们到底是怎么变成黑科技的?又是否科学有效呢? 借内存补固态: 固态硬盘加速神器 ...

  5. 怎样让电脑速度变快_硬盘在电脑中起什么作用?

    计算机中的所有数据都保存在硬盘上, 很简单,硬盘的作用就是存储数据. 一.补充: 1.移动硬盘(Mobile Hard disk)顾名思义是以硬盘为存储介质,计算机之间交换大容量数据,强调便携性的存储 ...

  6. 服务器数据库带宽费开票项目,服务器带宽和访问数据库速度

    服务器带宽和访问数据库速度 内容精选 换一换 使用Memcached作为Web内存缓存服务器的场景.Memcached是一款自由开源的,高性能的分布式内存对象缓存系统,基于内存的key-value存储 ...

  7. 利用Windows内置工具winsat测试硬盘速度(SSD机械盘对比)

    利用Windows内置工具winsat测试硬盘速度(SSD&机械盘对比) 以下是红色内容是在命令行运行: C:\Users\Administrator>winsat disk Windo ...

  8. 计算机硬盘优化策略,如何让机械硬盘更快,几个优化提升机械硬盘速度!

    固态硬盘由于速度更快现在已经是装机的首选了,不过还有很多用户还在使用机械硬盘,毕竟机械硬盘容易更大,价格也更便宜,并且一些老机子可能不方便升级,那么在不换硬盘的前提下如何让机械硬盘速度更快呢?这里我小 ...

  9. linux机械硬盘提速,这几招提升机械硬盘速度的技巧连老师傅都不一定知道

    硬盘读/写速度直接影响计算机系统的运行速度.硬盘读/写速度较慢,系统运行速度较慢.这直接影响了我们计算机的办公效率.因此,我们必须解决这个问题.尽快解决问题.下面,我们一起学习一些解决方案. 方法1: ...

最新文章

  1. SAP PM入门系列28 - IW67 Display Tasks
  2. eclipse中Tomcat启动了 但看不到tomcat首页
  3. CodeForces - 1174D Ehab and the Expected XOR Problem(构造+思维+位运算)
  4. MAC下使用OpenSSL生成私钥和公钥
  5. python 函数进度条怎么_刷新你对进度条的认识,用python写出不一样的进度条
  6. oracle number +1,number number(1)
  7. Diamond programmer程序下载流程
  8. 最全面的 Spring 学习笔记
  9. 谎言,统计数据和供应商
  10. WireGuard 的使用与配置详解
  11. js:nodejs简单的Http服务器搭建
  12. Tika 1.16架构及核心模块
  13. 【037】PhotoMosh–艺术故障图片在线生成器
  14. mysql查男女比例百分比_sql server 计算男女比例 百分比
  15. 解读一个有趣的网站seo,论网站如何快速上词以及上量
  16. 【吐血整理】互联网大厂面试遇到的100道软件测试面试题+答案
  17. 原生小程序使用二维码扫码调用接口
  18. 培育企业安全基因 永信至诚召开2016年企业安全人才能力提升解决方案发布会...
  19. 关于机械臂的模仿学习
  20. 【JavaScript】ESModule(esm)

热门文章

  1. WPF教程(十二)资源
  2. ggplot作图显示中文
  3. 日记侠:你想开始写文章吗?(可以赚钱的)
  4. Solidjs 简介
  5. 人人都是产品经理 (一)——读后感
  6. 微信退还钱什么时候到账?
  7. 梦想照进现实|CSDN 实体奖牌 第六期
  8. 2、股权融资 - 打造企业上市系列文章
  9. 程序员的三十五岁危机
  10. 永恒之蓝ms17_010漏洞