比真的还大的记忆
我们说过,好多进程同时在跑(第2课)。 那些程序,各自都需要记东西的地方,内存。 可真内存(RAM)的量,是固定有限的。 要是都直接占真位置,很快就用光、还撞车。 所以操作系统,给每个一份「假装很大的内存」。
大家都想要内存
同时跑的程序,各自都要一个记东西的地方。
可真内存,是个有限的小空间。
要是都想直接占真位置,
位置很快就不够,彼此的地盘还撞上。
等于为了内存,吵起来了。
再加几个程序。真内存的条很快就满、溢出来。
光靠真内存,是应付不过来的。
可又不能叫程序「把内存让出来」。
每个都得能宽宽裕裕地用啊。
操作系统,在这儿耍了个聪明的把戏。
给每个一份「自己的大内存」
操作系统,给每个程序发一份假内存。
又宽,又从第0格干干净净地开始,看着像自己独用。
A 的「第0格」和 B 的「第0格」,其实是不同的地方。
各自只看自己的内存,别人的,看都看不见。
这份自己专属的假内存,就叫虚拟内存。
在程序 A 和 B 间切换。两个都有从第0格起的「我的内存」,各自一份。
两个都从第0格干净地用,真方便。
可假地址,不是真位置呀?
程序说「我的第3格」时,
那句话,由谁、怎么换成真位置呢?
把假地址转到真位置
程序每用一次「我的第3格」,
操作系统和硬件,就悄悄换成真位置。
一张小地图,把「我的3 → 真的27」这样接起来。
A 的「我的0」是真的5,B 的「我的0」是真的40。
同样的假号,真位置不同,所以不会撞上。
点一个假地址。它经过地图,接到真位置。A 和 B 同号也到不同的地方。
地图把假换成真,于是各自安全地分开过。
可把大家的假内存加起来,
可能比真内存大得多。
那么多东西,怎么塞进小小的真内存呢?
比真的还大:不用的挪到硬盘
操作系统的秘密,就是这个。
眼下不用的部分,先挪到慢硬盘待一会儿。
再把眼下要用的部分,放进腾出的位置。
回头那挪走的又要用了,就再取回来。
所以,能用上比真内存还大的内存。
调入一个新部分。真内存满了,不用的就出到硬盘,需要的进来。
又挪出又取回,比真的还大的记忆,就成了。
可硬盘,比真内存慢太多了吧?
每次都跑一趟硬盘,会很憋的。
操作系统,最后还顾上一件事。
常用的,放在近处
操作系统,把常用的部分,留在近处的真内存里。
只把偶尔才用一次的,送去又远又慢的硬盘。
这和在「结构」里见过的缓存,是一个心思。「常用的,放近处。」
所以大多数时候,在快的真内存里就办完了,
跑去硬盘只是偶尔,于是那份慢,几乎感觉不到。
多取几次。常用的留在真内存(近处),偶尔用的留在硬盘(远处)。
总结一下,虚拟内存,就是把假地址转到真位置、
把不用的送去硬盘、把常用的放近处的,一手好活儿。
靠它,每个进程都觉得自己独用着比真的还大的内存。
可每个只看「自己的位置」、看不见别人的,这一点,
其实就成了把我的和你的分开、守护起来的墙。这是下一个故事。