1. 引言
2. 内存管理的环境
3. 内存管理的目标
4. 虚拟内存
5. 单道编程的内存管理
5.1 静态地址翻译
在单道编程环境下,整个内存里面只有两个程序:一个是用户程序和操作系统程序。由于只有一个用户程序,而操作系统所占用的内存空间是恒定的,我们可以将用户程序总是加载到一个内存地址上。即用户永远从同一个地方开始执行。在这种管理方式下,操作系统永远跳转到同一个地方来启动用户程序。这样用户程序里面的地址都可以事先计算出所有的物理地址。这种在运行前就将物理地址计算好的方式叫做静态地址翻译。
5.2 内存管理的目的
为了弄清楚是否达到的内存管理的目的,需要从下面几个方面考虑:
- 首先,地址是否独立,即固定地址的内存管理达到地址独立了吗?衡量地址是否独立的判断标准就是看看用户编写程序时是否需要知道该程序将要运行的物理内存的知识,而用户在编写程序时所用的物理内存无须考虑具体的物理内存,即该管理模式下达到了的地址的独立性。那它是如何达到的呢?办法就是将用户程序加载到同一物理地址上。通过静态编译即可完成虚拟地址到物理地址的映射,而这个映射翻译工作可以由编译器或加载器来实现。
- 其次,物理地址是否得到保护,即要看进程是否访问到了其它用户进程的空间,或都别的用户进程是否会访问该进程的地址(进程地址是否允许多用户进行访问)?其实在单道编程的情况下,肯定是不会的。因为,整个系统里面只有一个用户程序。因此,固定地址的内存管理就是因为只运行了一个用户程序而达到地址保护。
5.3 固定地址内存管理优缺点
- 优点:固定地址的内存管理单元非常简单,实际上并不需要任何内存管理单元。因为程序发出的地址已经是物理地址,在执行过程中无须进行任何地址翻译,而这种情况的直接结果就是程序运行速度快,因为越过了地址翻译的过程。
- 缺点:
- 整个程序要加载内存中去。这样会导致比物理内存大的程序无法运行。
- 只运行一个程序造成很大的浪费。如果一个程序很小,虽然所用的内存空间小,但是剩下的内存空间也无法使用。
- 无法在不同的操作系统下运行,因为不同的操作系统所占用的内存空间大小也不一样,使得用户程序的起始地址可能不一样。这样在一个系统环境编译出来的程序很可能无法在另一个操作系统环境下执行。
6. 多道编程的内存管理
为了克服单道编程的缺点,因此发明了多道编程。随着多道编程数的增加,cpu和内存的利用效率也随着增加。当然,这种增加有个限度,超过这个限度,则因为多道程序之间的资源竟争反而造成系统效率的降低。
6.1 动态地址翻译
虽然多道编程可以极大地改善cpu和内存的效率,改善用户的响应时间,但是天下并没有免费的午餐,这种效率和响应时间的改善是需要付出代价的。
这种代价是什么呢?当然是操作系统的复杂性。因为多道编程的情况下,无法将程序加载到固定内存地址上,也就是说无法使用静态地址翻译。这样我们就必须在程序加载完毕后才能计算物理地址,也就是程序在运行时进行地址翻译。这种翻译叫做动态地址翻译。
6.2 动态地址翻译流程
用户发出的虚拟地址MUU(地址翻译器)翻译成物理地址。
6.3 动态地址翻译下的内存管理策略
多道编程下的内存管理策略有两种:
- 固定分区:将内存分成固定的几个区域,每个区域的大小固定,如下图所示
最下面的分区为操作系统占用,其它的分区由分户程序使用。这些分区大小可以一样,也可以不一样。考虑到程序大小的实际情况,分区的大小通常也各不相同。当需要加载程序时,选择一个当前闲置且容量够大的分区进行加载。
这种模式下,当一个新的程序想要运行时,必须排在一个共同的队列里等待。当有空闲分区时,才能进行加载。由于程序大小和分区大小不一定匹配,有可能形成一个小程序占用一个大分区的情况。如果在前面加载小程序时考虑这一点,可以将小程序加载到小分区,就不会出现这样的情况(或者说至少降低这种情况发生的概率)。这样,我们就想到也许可能采用多个队列,即给每个分区一个队列。程序按照大小排在相应的队列里,如下图所示:
这样不同的程序有不同的对,就像在社会中不同的社会阶层有着不同的待遇一样,不同条件家庭男孩配同等条件家庭的女儿(门当户对)。当然这种方式也有它自身的缺点,就是如果有空闲分区,但等待的程序不在该分区的等待队列上,就将造成有空间不能运行程序的尴尬处境。
- 非固定分区
来源:oschina
链接:https://my.oschina.net/u/2858189/blog/779819