购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 虚拟内存

1.1.1 为什么需要虚拟内存

我们日常使用的操作系统都是支持同时运行多个程序的,从技术的角度来看,这并不是一件容易做到的事情,想要支持这一特性,需要解决很多问题,笔者在这里列举几个最典型的问题。

1.内存地址隔离问题

对于操作系统来说,应用程序是不能直接访问真实的内存(也称为物理内存)的。如果应用程序有这样的权限,那么不同的应用程序所使用的内存地址便无法相互隔离,此时恶意或非恶意的程序都可以很容易地改写其他程序的内存数据,导致内存数据被改写的程序产生数据安全或程序崩溃等严重问题。因此操作系统禁止了应用程序直接访问物理内存,并且给每个应用程序的进程创建一个“中间层”,每个进程都只能在其独有的“中间层”中读写数据,然后再由系统将“中间层”的数据映射到物理内存中,这样不同的进程便有自己独立的内存地址空间,可以独立运行而不互相干扰,从而实现各个程序间的内存地址隔离。

2.内存使用效率问题

为了确保程序运行的效率,程序被装载到内存中时地址空间都是连续的,但是内存的容量是有限的,所以很可能在加载几个程序后,就没有连续的大块内存给下一个程序使用了。这个时候,如果我们想继续执行新的程序,就只能将之前程序的数据暂时写回磁盘里,等到后面需要用到的时候再读回来。这个过程中有大量的数据被换入换出,程序的执行效率及性能自然就十分低下。所以想要提升内存的使用效率,就需要程序可以使用非连续的内存地址,而这又与程序的运行效率相冲突。操作系统的做法是创建一个地址连续的“中间层”,程序的数据都加载在这个连续的“中间层”中,然后由系统将“中间层”的连续地址映射到非连续的物理内存地址中。

3.地址稳定性问题

程序在运行过程中想要执行某个函数,首先需要知道这个函数在内存中的地址,如果程序是直接加载在物理内存中的,那么它很可能不是从地址0开始加载的,而是从中间某一个地址开始,所以函数的地址是不确定的。

解决函数地址不确定问题的方法依然是给每个进程创建一个独立的“中间层”,并且这个“中间层”的地址都是从0开始的。由于程序只能加载进这个“中间层”,我们就能确保程序一定是从地址0开始加载的,这样函数的地址不会发生改变,并能在编译时确定。

通过上文可以看到,操作系统都是通过创建一个“中间层”来解决几个典型问题的,这个“中间层”就是虚拟内存,可以说虚拟内存是现代操作系统中最重要的技术之一。那么什么是虚拟内存呢?虚拟内存又是如何解决上文提到的各种问题的呢?我们接着往下看。 3gDCj+z8z3nrOC9lBVgvpqphxC8U82iJ2+zniEn1Zmzw9Ahc2dP6Zo8pwkKwBglm

点击中间区域
呼出菜单
上一章
目录
下一章
×