转自:https://zhuanlan.zhihu.com/p/38046941
首先需要回顾下历史,看看一下历史的脉络。
早期时代内存管理是很简单的,内核放在低地址,程序在OS后面放,很清晰的逻辑。
时间到了批处理时代,需要同一个电脑能够做很多事情,而且出现了time sharing,简单的使用内存的方式就是先load一个程序到内存,然后运行,到了分配的时间点后将内存中的程序存储到硬盘中载入另外一个程序。当然这种方式很慢啦。进一步,为了效率快点,在要切换程序的时候,可以不换出程序,而是只加载新的程序,这样就让内存中有了多个程序,示意图如下:
随着这种分享使用的方式越来越流行,新的需求也随之产生,特别就是如何在多个程序都在内存中的时候能够保护它们之间不会相互影响。为了能够提供一个易于使用的内存,os对物理内存进行的抽象,我们称之为地址空间(address space)。理解这个抽象对于理解内存的虚拟化是很重要的。地址空间包含这个程序运行时的所有的内存信息,比如,程序的代码肯定要在内存中,我们需要分配内存给栈,堆这些信息在内存中,以便让程序运行,另外还有一些其他的信息,我们先假设只有这3块:代码,栈,堆。这三块是放在内存中的,我们不像之前的内存分布一样,而是提供一个统一的内存分布来分配这三块信息,示例图如下:
当然在实际的实现中不是这种简单的模型,但是我们需要说明的,当我们在说地址空间的的时候,实际上我们在说的是一种os提供给运行程序的抽象。程序实际上的物理内存地址其实不在0到16KB的,它可能加载在任何的物理内存中,但是os提供了这种抽象,让程序看到的是一个一致的内存分布。这样做的好处很多,
1.将主存看做了磁盘的高速缓存,在主存中只加载活动区域,根据需要在磁盘和主存中传送数据,高效的利用了主存
2.为每个进程提供了一致的地址空间,简化了存储器管理
3.保护了每个进程的地址空间不会被其他的进程破坏。
下面说说虚拟内存(VM)设计的目标:
1.透明性。也就是说对于用户程序来说,你是不知道有vm存在的,或者说你不用关心vm。
2.效率。虽然vm有好处,但是你不能因为这个好处让系统运行慢的不可接受,所以效率也很重要。
3.保护。也就是各个程序间的内存使用应该不会影响,不会出现我的内存被其他的进程篡改的情况。