创建进程首先要将程序和数据将入内存。将用户源程序变为可在内存中执行的程序,通常需要以下步骤:
1: 编译。由编译程序将用户源代码编译成若干目标模块
2:链接。由链接程序将编译后形成的一组目标模块及它们所需的库函数链接在一起,形成一个完整的装入模块
3:装入。由装入程序将装入模块装入内存运行
程序的链接有以下三种方式
1:静态链接
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。将几个目标模块装配成一个装入模块时,需要解决两个问题:1.修改相对地址,编译后的所有目标模块都是从0开始的相对地址,当链接成一个装入模块时要修改相对地址。 2.变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址
2:装入时动态链接
将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式,其优点是便于修改和更新,便于实现对目标模块的共享
3:运行时动态链接
对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。其优点是能加快程序的装入过程,还可节省大量的内存空间。
内存的装入模块在装入内存时,同样有以下三种方式:
1:绝对装入
绝对装入方式只适用于单道程序环境。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际地址完全相同,因此不需对程序和数据的地址进程修改
另外,程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址
2:可重定位地址
在多道程序环境下,多个目标模块的起始地址通常都从0开始,程序中的其他地址都是相对于起始地址的,此时采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址交换通常是在进程装入时一次完成的,故称为静态重定位
3:动态运行装入
也称为动态重定位。程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持
动态重定位的优点:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享