操作系统中内存管理发展的梳理
一、首先是直接使用物理地址
一开始对存储器没有抽象。程序中的每一个地址就是真实的物理地址,这样使用存储器非常危险,主要有两个方面的问题。第一,随随便便(不小心或者故意)就可以访问和修改其他程序数据,所有多道程序并发很难实现;第二,不同的程序会产生物理地址冲突。解决第一个问题,可以采用交换技术或者硬件保护。解决第二个问题可以采用重定位(静态),在加载的时候进行重定位。
二、对存储器进行抽象
为程序抽象出一个内存,叫做地址空间。每一个进程都有自己的地址空间。它又如何解决直接使用物理地址产生的问题呢?也是采用重定位(动态)。使用寄存器来保存该程序的起始物理地址,而程序中通通使用地址空间中的逻辑地址,每次要使用地址的时候,就进行运算同时检查该地址是否超过了属于自己程序的范围。这就解决了进程之间访问的安全性和物理地址冲突的问题。也可以使用多个寄存器,将程序分为不同的段,每一个段有自己的段基址。我认为这已经是虚拟地址的运用。
三、物理内存不够用
随着软件发展,真实的物理内存已经不够用了,一种解决办法就是交换技术。要用的程序读进内存,不用的程序写入磁盘。这样会产生内存碎片,对内存的使用效率不高。另一种解决方法是虚拟内存。
四、虚拟内存
首先,每一个程序有自己的地址空间。
其次,地址空间被划分为固定大小的页,物理内存也被划分为相同固定大小的页。
最后,只需要将现在要使用的程序放在物理内存中。
虚拟内存更像是对分段机制的一种改进,将程序以更小的粒度映射到物理内存,从而进行重定位。
以上,是我对《现代操作系统》中内存管理的梳理,不是原创。详细内容请看书。