虚拟内存
背景
我们一般把内存看成一块连续的字节数组。我们通过指定地址来访问其中的内容。
我们看到图上,0KB-64KB 地址范围内,存放着操作系统。
如果现在 A 同学想要写一个程序,它指定代码放在64KB-128KB的位置。
现在B同学也写了一个程序,为了避免覆盖A同学程序,需要指定将代码放在128KB以后的位置。
这样,就很麻烦了,你需要提前知道其他程序所在的位置,这样写代码就特别痛苦。
为此,引入了虚拟内存的概念。
地址空间的引入
为此,引入了地址空间的概念,或者叫做虚拟地址。
现在,对每一个程序,进程,都提供一个虚拟的地址空间。也就是认为,每一个程序可以放在 0KB-任意大小 的虚拟的连续空间上。如下图所示。
通过这种方式,我们写程序就比较方便了。A同学写代码的时候,可以把变量放在0-64KB的位置,B同学也可以把变量放在0-64KB的位置。
注意,这里的0-64KB的位置是虚拟的,最后映射到不同的物理内存中。
虚拟地址(地址空间)的引入,让程序的编写更加容易。
不同进程的虚拟地址,经过地址转换,映射到不同的物理内存地址。
如果进行地址转换,就是后面所要讲解的内容。
虚拟内存
关于虚拟内存的定义,我感觉一直比较混乱。我觉得核心还是:
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间)。
就像我们上面举例说明的那样,每个程序可以放在一个连续的地址空间中。但注意,这个地址空间的大小你可以指定。
大小可以指定,意味着什么呢?
比如你的物理内存有1G,但你可以假设地址空间有4G甚至更大。这样你编写程序的时候,就不会受到实际物理内存的影响。
但是4G的程序怎么可以在1G的物理内存上运行呢?这就用到了局部性原理。
所以,引入虚拟内存的概念,带来什么好处?
- 编写程序更加简单,现在无需担心实际的内存大小,同时也不用担心程序之间在内存会互相覆盖
可以看到,虚拟内存的引入,是为了程序的编写更加简单。
我们后面将会重点讲解如何进行地址转换?
我们先想想地址转换需要什么要求?
- 要将不同进程的内容转换到不同的地址上
- 尽可能利用内存
- 因为引入了地址转换,相较于直接访问内存,多了转换过程,耗时更长,如何进行优化?
接下来,我们将继续讲解~