seegongsik
我的单词本
操作系统

比真的还大的记忆

我们说过,好多进程同时在跑(第2课)。 那些程序,各自都需要记东西的地方,内存。 可真内存(RAM)的量,是固定有限的。 要是都直接占真位置,很快就用光、还撞车。 所以操作系统,给每个一份「假装很大的内存」。

01

大家都想要内存

同时跑的程序,各自都要一个记东西的地方。
可真内存,是个有限的小空间。
要是都想直接占真位置,
位置很快就不够,彼此的地盘还撞上。
等于为了内存,吵起来了。

真内存

再加几个程序。真内存的条很快就满、溢出来。

光靠真内存,是应付不过来的。
可又不能叫程序「把内存让出来」。
每个都得能宽宽裕裕地用啊。
操作系统,在这儿耍了个聪明的把戏。

02

给每个一份「自己的大内存」

操作系统,给每个程序发一份假内存。
又宽,又从第0格干干净净地开始,看着像自己独用。
A 的「第0格」和 B 的「第0格」,其实是不同的地方。
各自只看自己的内存,别人的,看都看不见。
这份自己专属的假内存,就叫虚拟内存。

程序A : 我的内存
0
1
2
3
4
5
A的0 ≠ B的0(真位置不同)

在程序 A 和 B 间切换。两个都有从第0格起的「我的内存」,各自一份。

两个都从第0格干净地用,真方便。
可假地址,不是真位置呀?
程序说「我的第3格」时,
那句话,由谁、怎么换成真位置呢?

03

把假地址转到真位置

程序每用一次「我的第3格」,
操作系统和硬件,就悄悄换成真位置。
一张小地图,把「我的3 → 真的27」这样接起来。
A 的「我的0」是真的5,B 的「我的0」是真的40。
同样的假号,真位置不同,所以不会撞上。

真位置
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

点一个假地址。它经过地图,接到真位置。A 和 B 同号也到不同的地方。

地图把假换成真,于是各自安全地分开过。
可把大家的假内存加起来,
可能比真内存大得多。
那么多东西,怎么塞进小小的真内存呢?

04

比真的还大:不用的挪到硬盘

操作系统的秘密,就是这个。
眼下不用的部分,先挪到慢硬盘待一会儿。
再把眼下要用的部分,放进腾出的位置。
回头那挪走的又要用了,就再取回来。
所以,能用上比真内存还大的内存。

真内存
P1
P2
P3
P4
硬盘
P5
P6

调入一个新部分。真内存满了,不用的就出到硬盘,需要的进来。

又挪出又取回,比真的还大的记忆,就成了。
可硬盘,比真内存慢太多了吧?
每次都跑一趟硬盘,会很憋的。
操作系统,最后还顾上一件事。

05

常用的,放在近处

操作系统,把常用的部分,留在近处的真内存里。
只把偶尔才用一次的,送去又远又慢的硬盘。
这和在「结构」里见过的缓存,是一个心思。「常用的,放近处。」
所以大多数时候,在快的真内存里就办完了,
跑去硬盘只是偶尔,于是那份慢,几乎感觉不到。

真内存
硬盘

多取几次。常用的留在真内存(近处),偶尔用的留在硬盘(远处)。

总结一下,虚拟内存,就是把假地址转到真位置、
把不用的送去硬盘、把常用的放近处的,一手好活儿。
靠它,每个进程都觉得自己独用着比真的还大的内存。
可每个只看「自己的位置」、看不见别人的,这一点,
其实就成了把我的和你的分开、守护起来的墙。这是下一个故事。

一句话总结操作系统给每个进程一份自己的「虚拟地址」,让大家都像独自在用一大片内存。虚拟地址会被悄悄转换到真位置,真内存一满,不用的部分就被挪到慢硬盘,需要时再取回。常用的部分,留在近处的真内存里。靠这个,每个进程都能私下、又快地,用上比真的还大的内存。
操作系统
如果有帮助,请支持我们