背景:
多道程序环境下,程序是并发执行的,所以要使程序运行,必须先为之创建进程,而创建进程的第一件事就是将程序和数据装入内存,目的是将源程序变成内存可以执行的程序
![](https://img-blog.csdnimg.cn/img_convert/fffa4f719bb6e496872b44b0e265e292.png)
具体的步骤如上。
程序的链接:
源程序经过编译后,得到一组目标模块,再利用“链接程序”将这组目标模块链接起来,形成一个完整的装入模块(即可执行文件)
程序的装入:
即将链接好的模块装入内存
分类
Ø 绝对装入方式
Ø 可重定位装入方式(静态重定位)
Ø 动态运行时装入方式(动态重定位)
1.绝对装入:在程序编译时就知道程序需要放在内存中的什么地方,编译后的程序不是从0开始的逻辑地址,而是真实的物理地址,然后采用绝对装入,按照编译程序产生的绝对地址进行装入。
2.静态可重定位装入:编译后的模块需要连续装入内存,但是在内存中的物理地址可与逻辑地址不同,可以存在一定偏移,比如逻辑地址是0-100,它可以在内存中存储在100-200的内存单元中,需要设定一个偏移量就是100,同时也需要为其分配连续的存储空间,不然通过偏移量是无法找到的,现在就可以通过作业的逻辑地址+偏移量获得作业在内存中的绝对地址。
作业一旦进入内存,在整个运行期间无法在内存中移动
需要为其分配连续的内存空间,用于访存
运行前将其装入内存
3.动态运行时装入:将不同的模块可以装入在不同的内存地址,不同模块可以不连续,但是同一模块还是要连续存放的,同一模块需要设定一个重定位寄存器,其实每个小模块和静态可重定位装入是一样的,每个模块的重定位寄存器中的值就是对应的偏移量。装入程序会把模块装入内存,但是并不会立即将装入模块的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正执行时才进行。
可以将程序分配到不连续的存储区,在程序运行之前就可以将其投入运行。