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

常用的放在近处

操作系统把常用的部分留在近处的真内存里,只把偶尔才用一次的送到又远又慢的磁盘上。
这和在计算机结构里遇到的缓存是同一个道理:“常用的放在近处。”
所以大部分活儿在快的真内存里就做完了,跑到磁盘去只是偶尔的事,几乎感觉不到慢。

真内存
硬盘

拿出来的次数越多,常用的就留在真内存(近处),偶尔用的就待在磁盘(远处)。

总结一下,虚拟内存就是这样一门手艺:把假地址换到真地方,不用的送到磁盘,常用的放在近处。多亏了它,每个程序都觉得自己独自用着一块比真内存还大的内存。
可是,每个程序只看得到“自己的地方”、看不到别人的,这一点其实成了一道把你的和我的分开守护的墙。那是下一个故事。

一句话总结操作系统给每个进程只属于自己的“虚拟地址”,让大家看起来都独自用着一大块内存。虚拟地址被悄悄换到真地方;真内存满了,不用的部分就挪到慢的磁盘上,需要时再搬回来。常用的部分留在近处的真内存里。所以,每个程序都能各自、快速地用上比真内存还大的内存。
← 操作系统
如果有帮助,请支持我们