1.简单粗暴:在早期的计算机中,程序员常常应用汇编语言编程。这时的内存往往直接暴露给程序员:比如程序员想把数字1写入1号内存,只需要执行“mov MEM1,1” 即可。我们可以看出,早期的计算机几乎不可能同时执行两个程序:比如另一个程序也要使用1号内存,之前的内容就会被覆盖。
2.地址空间:如果把内存空间直接暴露给用户,往往会出现问题:应用程序可以任意修改内存单元,直到操作系统崩溃。解决这个问题的办法就是使用“地址空间”这个概念。地址空间是说,一个进程暴露给用户的地址,与进程在硬件上的实际地址是不一样的。我们把前者称为逻辑地址,后者称为物理地址。举个例子,如果程序员编写了一个程序占用0-1000号内存单元(逻辑地址),但是在实际内存中,这个程序可能被放在1001-2001号内存单元(物理地址)。通过这样的方式,内存就被保护起来。
用户看到的内存空间 | 实际上的物理空间 |
0000 | 1001 |
1000 | 2001 |
3.交换技术:虽然说地址空间技术解决了物理内存的暴露问题,但是如果系统要并发地执行两个进程,但是内存又不足以放下这两个进程,那么怎么办才好呢?答案有两个,一是交换技术,二是虚拟内存。交换技术的实现方式也是简单粗暴的:第一个进程运行完一段时间,就把它写回磁盘;再把第二个进程放到内存中执行,如此往复。
4.虚拟内存:交换技术虽然看起来很优秀,但是也存在问题:如果我电脑的内存是8G,但是我需要运行一个16G的游戏,该怎么办?这时候虚拟内存就挺身而出。虚拟内存把一个程序划分为多个页,如果需要执行的页在内存中,那么直接执行即可;如果不在,就发生缺页异常,操作系统负责将缺失的页从磁盘中调入内存。