在单道编程环境下,整个内存里面只有两个程序:一个是用户程序和操做系统程序。因为只有一个用户程序,而操做系统所占用的内存空间是恒定的,咱们能够将用户程序老是加载到一个内存地址上。即用户永远从同一个地方开始执行。在这种管理方式下,操做系统永远跳转到同一个地方来启动用户程序。这样用户程序里面的地址均可以事先计算出全部的物理地址。这种在运行前就将物理地址计算好的方式叫作静态地址翻译。编程
为了弄清楚是否达到的内存管理的目的,须要从下面几个方面考虑:小程序
为了克服单道编程的缺点,所以发明了多道编程。随着多道编程数的增长,cpu和内存的利用效率也随着增长。固然,这种增长有个限度,超过这个限度,则由于多道程序之间的资源竟争反而形成系统效率的下降。spa
虽然多道编程能够极大地改善cpu和内存的效率,改善用户的响应时间,可是天下并无免费的午饭,这种效率和响应时间的改善是须要付出代价的。操作系统
这种代价是什么呢?固然是操做系统的复杂性。由于多道编程的状况下,没法将程序加载到固定内存地址上,也就是说没法使用静态地址翻译。这样咱们就必须在程序加载完毕后才能计算物理地址,也就是程序在运行时进行地址翻译。这种翻译叫作动态地址翻译。翻译
用户发出的虚拟地址MUU(地址翻译器)翻译成物理地址。队列
多道编程下的内存管理策略有两种:进程
最下面的分区为操做系统占用,其它的分区由分户程序使用。这些分区大小能够同样,也能够不同。考虑到程序大小的实际状况,分区的大小一般也各不相同。当须要加载程序时,选择一个当前闲置且容量够大的分区进行加载。内存
这种模式下,当一个新的程序想要运行时,必须排在一个共同的队列里等待。当有空闲分区时,才能进行加载。因为程序大小和分区大小不必定匹配,有可能造成一个小程序占用一个大分区的状况。若是在前面加载小程序时考虑这一点,能够将小程序加载到小分区,就不会出现这样的状况(或者说至少下降这种状况发生的几率)。这样,咱们就想到也许可能采用多个队列,即给每一个分区一个队列。程序按照大小排在相应的队列里,以下图所示:资源
这样不一样的程序有不一样的对,就像在社会中不一样的社会阶层有着不一样的待遇同样,不一样条件家庭男孩配同等条件家庭的女儿(门当户对)。固然这种方式也有它自身的缺点,就是若是有空闲分区,但等待的程序不在该分区的等待队列上,就将形成有空间不能运行程序的尴尬处境。编译器