在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将目标模块(即程序和数据)装入内存。在将目标模块装入内存时,可以有绝对装入、静态地址重定位和动态地址重定位三种方式。
绝对装入
用户程序经过编译之后,将产生绝对地址(物理地址)的目标模块,即按照装入模块中的物理地址,将程序和数据装入内存。
优点
CPU执行目标代码快。
缺点
由于内存大小限制,能装入内存并发执行的进程数大大减少。
应用场景
绝对装入方式一般只适用于单道程序环境,需要知道该程序实际运行的地址。
静态装入
在多道程序环境下,编译汇编所得到的目标模块的起始地址通常是从0开始的,目标模块中的其它地址也都是相对于起始地址计算的,即目标模块采用的是相对地址。
静态地址重定位就是根据内存的当前情况,将装入模块装入到内存的适当位置,并在程序运行之前对指令和数据的各个地址进行重定位,即完成相对地址到物理地址的映射。地址变换通常是在程序真正运行前时一次完成的,以后不再改变。
优点
无需硬件支持。
缺点
- 程序重定位之后就不能在内存中搬动了。
- 要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域中。
应用场景
针对多道程序环境下,编译程序不可能预知编译后所得的目标模块应该存放在内存的何处。
动态装入
动态地址重定位不是在程序执行之前而是在程序执行过程中进行地址变换。更确切的说,是把这种地址转换推迟到程序真正要执行时才进行,即在每次访问内存单元前才将要访问的程序或数据的相对地址变换成物理地址。
动态重定位可使装配模块不加任何修改而装入内存。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。
优点
目标模块装入之后再进行搬迁也不会影响其正确执行。
缺点
需要硬件支持。
应用场景
一个进程可能被多次换出,又被多次换入,每次换之后的位置都是不同的,应采用这种装入模式。