当前位置 博文首页 > 白徽的博客:简说程序运行流水线

    白徽的博客:简说程序运行流水线

    作者:[db:作者] 时间:2021-07-30 20:56

    在这里插入图片描述

    编译

    源程序—> 目标模块

    连接

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

    装入

    将装入模块装入到内存

    绝对装入方式

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

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

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

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

    可重定位装入方式

    在这里插入图片描述

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

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

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

    动态运行时的装入方式

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

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

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

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

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

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

    静态链接

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

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

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

    装入时动态链接

    边装入边连接

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

    运行时动态链接

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

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

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

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

    优点1 便于修改和更新

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

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

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

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

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

    无法实现目标模块的共享

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

    链接时间不同

    静态:装入之前链接

    装入时动态:装入时链接

    运行时动态:运行时链接

    cs