虚拟内存

背景

我们一般把内存看成一块连续的字节数组。我们通过指定地址来访问其中的内容。

我们看到图上,0KB-64KB 地址范围内,存放着操作系统。

如果现在 A 同学想要写一个程序,它指定代码放在64KB-128KB的位置。

现在B同学也写了一个程序,为了避免覆盖A同学程序,需要指定将代码放在128KB以后的位置。

这样,就很麻烦了,你需要提前知道其他程序所在的位置,这样写代码就特别痛苦。

为此,引入了虚拟内存的概念。

地址空间的引入

为此,引入了地址空间的概念,或者叫做虚拟地址。

现在,对每一个程序,进程,都提供一个虚拟的地址空间。也就是认为,每一个程序可以放在 0KB-任意大小 的虚拟的连续空间上。如下图所示。

通过这种方式,我们写程序就比较方便了。A同学写代码的时候,可以把变量放在0-64KB的位置,B同学也可以把变量放在0-64KB的位置。

注意,这里的0-64KB的位置是虚拟的,最后映射到不同的物理内存中。

虚拟地址(地址空间)的引入,让程序的编写更加容易。

不同进程的虚拟地址,经过地址转换,映射到不同的物理内存地址。

如果进行地址转换,就是后面所要讲解的内容。

虚拟内存

关于虚拟内存的定义,我感觉一直比较混乱。我觉得核心还是:

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间)。

就像我们上面举例说明的那样,每个程序可以放在一个连续的地址空间中。但注意,这个地址空间的大小你可以指定。

大小可以指定,意味着什么呢?

比如你的物理内存有1G,但你可以假设地址空间有4G甚至更大。这样你编写程序的时候,就不会受到实际物理内存的影响。

但是4G的程序怎么可以在1G的物理内存上运行呢?这就用到了局部性原理。

所以,引入虚拟内存的概念,带来什么好处?

  • 编写程序更加简单,现在无需担心实际的内存大小,同时也不用担心程序之间在内存会互相覆盖

可以看到,虚拟内存的引入,是为了程序的编写更加简单。

我们后面将会重点讲解如何进行地址转换?

我们先想想地址转换需要什么要求?

  • 要将不同进程的内容转换到不同的地址上
  • 尽可能利用内存
  • 因为引入了地址转换,相较于直接访问内存,多了转换过程,耗时更长,如何进行优化?

接下来,我们将继续讲解~

posted @ 2020-05-09 15:24  土堆碎念  阅读(170)  评论(0编辑  收藏  举报