简说程序运行流水线

在这里插入图片描述

编译

源程序—> 目标模块

连接

目标模块+所需库函数 ---->装入模块

装入

将装入模块装入到内存

绝对装入方式

当前计算机为单道程序技术时使用

此时编译后产生的地址直接就是物理地址(绝对地址)

等于是说目标模块即是装入模块

因为已经知道了物理地址所以不存在地址的转换,直接装入内存即可

可重定位装入方式

在这里插入图片描述

多道程序环境下,编译程序不可能预知经编译后所得的目标模块放在内存的哪里。

把在装入时对目标程序中指令和数据地址的修改过程称之为重定位(地址转换)。

又因为地址变换通常是在进程装入时一次完成的,修改以后不会再改变。故又为静态重定位

动态运行时的装入方式

实际情况中,程序在内存中运行时也伴随着位置的移动。

但是静态重定位不能满足这一需求
使用它也就意味着内存中的位置是不变的。

动态运行时的装入程序在把装入模块装入内存中的时候,并不是立即
将逻辑地址转换为物理地址。

而是在推迟到真正运行时才进行

所以装入后的地址都是逻辑地址

此时还应有重定位寄存器的支持

静态链接

程序运行之前,将目标模块和所需库函数事先链接起来,以后不再拆开。

静态链接之后,产生的装入模块称之为可执行文件

需解决的问题:
1.对相对地址进行修改
2.变换外部调用符号

装入时动态链接

边装入边连接

装入内存时,目标模块如果发生外部调用,就寻找到相应的外部模块将其导入到内存中去。

运行时动态链接

程序运行时,应用每一次调用的模块都可能是不一样的。

但是事先我们无法知道将要运行哪个模块,所以只能将所有模块全部导入内存中

显然有的模块到程序结束,都不会运行,这造成了很大的浪费

那么运行时动态链接:
对某些模块推迟到程序调用时才去链接。。等到程序执行之时调用某个模块,就让OS去找到它,导入到内存链接

优点1 便于修改和更新

若发生需要修改或者更新,容易操作

毕竟 个个模块是分开存放的

不像静态链接,很难实现甚至无法实现。

优点2 便于实现对目标模块的共享

静态连接时,每个应用模块都有着其他模块的拷贝

无法实现目标模块的共享

采用装入时动态链接时可以实现目标模块的共享

链接时间不同

静态:装入之前链接

装入时动态:装入时链接

运行时动态:运行时链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值