1、程序如何运行:
在多道程序环境下,要是程序运行,必须纤维质创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可以在内存中执行的程序,通常都要经过一下几个步骤:
首先是要编译,有编译程序将用户源代码编译成cpu可执行的目标代码,产生了若干个目标模块(若干程序段)
其次是链接,有链接程序将编译后形成的一组目标模块(程序段),以及他们所需要的库函数链接在一起,形成一个完整的装入模块。
最后是装入,由装入程序将装入模块装入内存。
2、程序的装入方式:绝对装入方式、静态地址重定位、动态地址重定位
(1)绝对装入方式
在编译时,就已经知道程序驻留在内存中的什么位置,即程序中的逻辑地址跟实际地址完全相同。
优点:CPU执行目标代码快
缺点:(1)由于内存大小限制,能装入内存并发执行的进程数大大减少。
(2) 编译程序必须知道内存的当前空闲内存和其地址,执行效率低下
(3)绝对装入方式只适用于单道程序环境
(2)静态地址重定位
在目标代码装入内存的过程中完成,在程序开始运行前,程序中的指令和数据的各个地址均已完成重定位,即虚拟地址到内存地址的映射。地址变换通常在装入是一次完成,以后不在改变。
优点:无需硬件支持
缺点:(1)程序重定位之后就不能再内存中搬动了。
(2)要求程序的储存空间是连续的,不能把程序放在若干个不连续的区域中。
(3)动态地址重定位
在每次访问内存单元前才将要访问的程序或数据地址变换为内存地址。
优点:一个程序由若干个相对独立的目标模块组成时,每个目标模块个装入一个存储区域,这些存储区域可以是不顺序相邻的,只要各个模块有自己对应的定位寄存器就行。
3、程序的连接
源程序进过编译后,可得到一组目标模块,在利用连接程序将这组目标模块连接,根据连接时间的不同,可将连接分为如下三种:
(1)静态连接:在程序运行之前,先将各目标模块及他们所需的库函数,连接成一个完整的装配模块,以后不再拆开。
(2)装入时动态链接:将用户编译后所得到的一组目标模块,在装入内存时,采用边装入边连接的连接方式。在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存。
(3)运行时动态链接。这是指某些目标模块的连接,是在程序执行中需要该模块时,才对它进行的连接。在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。