首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >内存和硬盘是怎么配合工作的?

内存和硬盘是怎么配合工作的?

作者头像
Lihua奏
发布2026-06-23 20:33:46
发布2026-06-23 20:33:46
1800
举报

内存和硬盘是怎么配合工作的?

一个前提

首先,学习内存与磁盘之间的关系,要知道一个前提

程序要先存储在存储器中,然后才被依次读取执行

那么这种方式为 存储程序方式

这里可以先简单理解为:程序运行时,主要会涉及 内存磁盘 这两类存储位置

为什么要分出内存和硬盘

有个矛盾:

  1. "快"的存储:造价贵
  2. "慢"的存储:造价便宜

这个矛盾到现在也没有彻底解决,只是被巧妙地分开了,分成了 内存硬盘

存储在磁盘中的程序需要先加载到内存才能运行,不能在磁盘上直接运行

举个例子:

  • CPU:厨师的双手
  • 内存:旁边的操作台,负责切菜,炒菜
  • 磁盘:地下室,储存大量食品和餐具

可以看出 CPU 永远只和 内存 直接打交道,而磁盘上的东西,要先搬运到 内存,才能被处理

对比一下它们之间的优缺点

  • 内存:速度快,容量小,断电后数据消失,贵
  • 硬盘:速度慢,容量大,断电后数据保存,便宜

磁盘缓存

它们的第一个联系就是 磁盘缓存

磁盘缓存:这里可以先把它理解成一块用于缓存磁盘数据的内存区域。它会临时存放从磁盘读取出来的数据,下次如果还要读取相同数据,就不一定需要再次实际访问磁盘了,这样可以提高磁盘数据的访问速度

它的应用场景:浏览器通过网络从远程Web服务器上获取数据并显示,每次都请求相同的图片数据的话,会很浪费时间,但存储到磁盘缓存中,这个问题就解决了

虚拟内存

先思考一个场景,假如你的内存剩余空间 50MB,但你能打开运行 100MB 的程序,这是为什么?

虚拟内存来了,它会在操作系统的管理下,把 磁盘空间 的一部分当作 内存的后备区域 来使用,但程序本身还是必须运行在内存里的,那么就诞生了一种思路,交换

图中可以看出,虚拟内存中存储多个页面,当真正执行 页面3的时候

  • 把页面4换下来
  • 把页面3换上去

那当开的程序过多时,为什么页面会卡死

  1. 首先我们知道,CPU 只和 内存 打交道,而虚拟内存并不是真正的物理内存,它更像是操作系统管理出来的一套地址空间
  2. CPU 要访问的数据页当前不在物理内存里时,就会触发 缺页中断,这时 OS 会去硬盘里把对应的数据搬回到内存中
  3. 虚拟内存的后备区域本质还是磁盘,而磁盘的读取速度远慢于内存,所以 CPU 只能等到数据搬进内存之后,才能继续处理

还有一种极端情况 抖动

大概意思就是:系统大部分时间都在"搬家",真正干活的时间几乎为零

代码语言:javascript
复制
内存满了 -> A搬到硬盘,给B搬到内存 -> B 进来之后,又需要A ->给 B 搬回去,给 A 搬回来 -> 又需要 B ....

缺页中断 和 OS

缺页中断:简单来说,就是 CPU 要访问的数据页当前不在内存里,于是触发异常,然后交给 OS 去硬盘里把对应页面搬回来

OS:操作系统,负责响应缺页中断,把页面从硬盘搬到内存

了解 OS 之后,我们先看一个难题:页面置换算法

假设:内存中包含 A、B、C、D 四个页面,现在又来个 E 页面,必须要去掉一个才能容下 E,换掉谁?

代码语言:javascript
复制
内存里现在有: A B C D
新来的页面是: E

问题是: 要把谁换出去,才能把 E 放进来?

页面置换算法

1. 理想算法 OPT

理想算法 OPT:赶走“未来最长时间内不会被用到”的那个

代码语言:javascript
复制
未来访问顺序:E → B → A → C → E → D

D 最晚被用,换掉他

但这不可能实现,你怎么可能知道未来 CPU 会访问哪些页面

2. 先入先出(FIFO)

FIFO(先进先出):谁在内存里住得最久,赶走谁

代码语言:javascript
复制
最先进入内存的先被换掉
例如:先换掉 A, 再换掉后面最早进入的页面

这显然不合理,一个经常使用的页面,怎么能够因为“来得早”就先被去除?

3. LRU

LRU(最近最少使用):谁用的最久没被使用,换掉谁

代码语言:javascript
复制
A -> 很久之前用过
B -> 刚才用过
C -> 昨天用过
D -> 几小时之前用过

去掉 A

那如何知道 A 很久之前用过?这就是 LRU 的代价

  • 每次内存被访问,都要记录时间戳
  • 每次置换,都要找到时间戳最小的

乍一看没有问题,但是内存访问频率几乎每秒数亿次,这是一个不小的开销,所以后来又推出了一个 LRU 的近似版本

4. 时钟算法

时钟算法(Clock Algorithm)用一个循环队列和一个访问位来近似模拟 LRU 的效果,但开销极小。

再看到 LRU,有些东西,它平时使用次数不多,但在特殊场景下又必须存在,比如雨伞,平时不用,下雨天就用上了

解决办法就是:引入强制豁免机制

核心概念:某些关键页面可以被设定为暂时不参与置换,即使它们很久没用,也不优先换掉

为什么内存断电信息丢失,而硬盘不会

补个知识点,为什么内存断电信息丢失,而硬盘不会?

这里主要说的是常见的 DRAM。内存(RAM):用电容存储数据。每一比特,由一个电容来存储,由晶体管来控制读写

  • 有电荷 = 1
  • 无电荷 = 0

那么问题来了,电容会漏电

所以正常供电的时候,约 64毫秒 给所有电容重新充电,那断电了,电容没电了,所有数据自然而然就丢失了

就像:漏水的桶,你必须一直装水,才能保持水位

这里说的硬盘主要指 **机械硬盘(HDD)**。硬盘(HDD):用磁场存储数据。每一个比特,对应一个极小的磁性区域(磁畴)

代码语言:javascript
复制
N S N N S S N S N N S S
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
每个箭头 = 一个磁畴的方向

特点:磁畴一旦磁化定向,不需要任何能量来维持这个方向

就像:指南针 不需要电,就能一直指向北方

本章小结

这一篇让我更清楚地理解了 内存硬盘 的分工: 内存 负责让 CPU 快速读取和执行数据, 硬盘 负责长期保存数据。程序之所以不能直接在硬盘上运行,本质上就是因为硬盘太慢,而内存更适合作为运行时的工作区。

另外,我也开始明白 虚拟内存 的意义。它并不是把硬盘真的变成了内存,而是在内存不够的时候,借助硬盘作为后备区域来缓解空间压力。代价就是,一旦频繁发生页面交换,系统就会明显变慢,甚至出现抖动。

所以从整体上看,内存和硬盘不是互相替代的关系,而是分工协作的关系: 一个追求速度,一个追求容量和持久性,操作系统则负责在它们之间做调度和平衡。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 内存和硬盘是怎么配合工作的?
    • 一个前提
    • 为什么要分出内存和硬盘
    • 磁盘缓存
    • 虚拟内存
    • 缺页中断 和 OS
    • 页面置换算法
      • 1. 理想算法 OPT
      • 2. 先入先出(FIFO)
      • 3. LRU
      • 4. 时钟算法
    • 为什么内存断电信息丢失,而硬盘不会
    • 本章小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档