
首先,学习内存与磁盘之间的关系,要知道一个前提
程序要先存储在存储器中,然后才被依次读取执行
那么这种方式为 存储程序方式
这里可以先简单理解为:程序运行时,主要会涉及 内存 和 磁盘 这两类存储位置
有个矛盾:
这个矛盾到现在也没有彻底解决,只是被巧妙地分开了,分成了 内存 和 硬盘
存储在磁盘中的程序需要先加载到内存才能运行,不能在磁盘上直接运行

举个例子:
可以看出 CPU 永远只和 内存 直接打交道,而磁盘上的东西,要先搬运到 内存,才能被处理
对比一下它们之间的优缺点
它们的第一个联系就是 磁盘缓存
磁盘缓存:这里可以先把它理解成一块用于缓存磁盘数据的内存区域。它会临时存放从磁盘读取出来的数据,下次如果还要读取相同数据,就不一定需要再次实际访问磁盘了,这样可以提高磁盘数据的访问速度

它的应用场景:浏览器通过网络从远程Web服务器上获取数据并显示,每次都请求相同的图片数据的话,会很浪费时间,但存储到磁盘缓存中,这个问题就解决了
先思考一个场景,假如你的内存剩余空间 50MB,但你能打开运行 100MB 的程序,这是为什么?
虚拟内存来了,它会在操作系统的管理下,把 磁盘空间 的一部分当作 内存的后备区域 来使用,但程序本身还是必须运行在内存里的,那么就诞生了一种思路,交换

图中可以看出,虚拟内存中存储多个页面,当真正执行 页面3的时候
那当开的程序过多时,为什么页面会卡死
还有一种极端情况 抖动
大概意思就是:系统大部分时间都在"搬家",真正干活的时间几乎为零
内存满了 -> A搬到硬盘,给B搬到内存 -> B 进来之后,又需要A ->给 B 搬回去,给 A 搬回来 -> 又需要 B ....
缺页中断:简单来说,就是 CPU 要访问的数据页当前不在内存里,于是触发异常,然后交给 OS 去硬盘里把对应页面搬回来
OS:操作系统,负责响应缺页中断,把页面从硬盘搬到内存
了解 OS 之后,我们先看一个难题:页面置换算法
假设:内存中包含 A、B、C、D 四个页面,现在又来个 E 页面,必须要去掉一个才能容下 E,换掉谁?
内存里现在有: A B C D
新来的页面是: E
问题是: 要把谁换出去,才能把 E 放进来?
理想算法 OPT:赶走“未来最长时间内不会被用到”的那个
未来访问顺序:E → B → A → C → E → D
D 最晚被用,换掉他
但这不可能实现,你怎么可能知道未来 CPU 会访问哪些页面
FIFO(先进先出):谁在内存里住得最久,赶走谁
最先进入内存的先被换掉
例如:先换掉 A, 再换掉后面最早进入的页面
这显然不合理,一个经常使用的页面,怎么能够因为“来得早”就先被去除?
LRU(最近最少使用):谁用的最久没被使用,换掉谁
A -> 很久之前用过
B -> 刚才用过
C -> 昨天用过
D -> 几小时之前用过
去掉 A
那如何知道 A 很久之前用过?这就是 LRU 的代价
乍一看没有问题,但是内存访问频率几乎每秒数亿次,这是一个不小的开销,所以后来又推出了一个 LRU 的近似版本
时钟算法(Clock Algorithm)用一个循环队列和一个访问位来近似模拟 LRU 的效果,但开销极小。
再看到 LRU,有些东西,它平时使用次数不多,但在特殊场景下又必须存在,比如雨伞,平时不用,下雨天就用上了
解决办法就是:引入强制豁免机制
核心概念:某些关键页面可以被设定为暂时不参与置换,即使它们很久没用,也不优先换掉
补个知识点,为什么内存断电信息丢失,而硬盘不会?
这里主要说的是常见的 DRAM。内存(RAM):用电容存储数据。每一比特,由一个电容来存储,由晶体管来控制读写
那么问题来了,电容会漏电
所以正常供电的时候,约 64毫秒 给所有电容重新充电,那断电了,电容没电了,所有数据自然而然就丢失了
就像:漏水的桶,你必须一直装水,才能保持水位
这里说的硬盘主要指 **机械硬盘(HDD)**。硬盘(HDD):用磁场存储数据。每一个比特,对应一个极小的磁性区域(磁畴)
N S N N S S N S N N S S
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
每个箭头 = 一个磁畴的方向
特点:磁畴一旦磁化定向,不需要任何能量来维持这个方向
就像:指南针 不需要电,就能一直指向北方
这一篇让我更清楚地理解了 内存 和 硬盘 的分工: 内存 负责让 CPU 快速读取和执行数据, 硬盘 负责长期保存数据。程序之所以不能直接在硬盘上运行,本质上就是因为硬盘太慢,而内存更适合作为运行时的工作区。
另外,我也开始明白 虚拟内存 的意义。它并不是把硬盘真的变成了内存,而是在内存不够的时候,借助硬盘作为后备区域来缓解空间压力。代价就是,一旦频繁发生页面交换,系统就会明显变慢,甚至出现抖动。
所以从整体上看,内存和硬盘不是互相替代的关系,而是分工协作的关系: 一个追求速度,一个追求容量和持久性,操作系统则负责在它们之间做调度和平衡。