一、内存
内存是用于存放数据的硬件。程序执行前需要先放入内存中才能被处理。
在多道程序环境下,系统中会有多个程序并发执行,会有多个程序的数据需要提示放入内存,如何区分程序中的数据在内存的位置?
给内存的存储单位编地址。
内存地址从0开始。每个地址对应一个存储单元。
如果计算机按字节编码,则每个存储单位大小就是1字节,即8个二进制位。
如果字长为16的计算机按字编码,那么每个存储单位为16个二进制位。
如一台手机有\(4GB\)内存,该内存可以存放\(4*2^{30}\)个字节,按字节编码就会有\(2^{32}\)个存储单元。地址长度为32位。
二、程序运行原理
2.1、程序的运行
- 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)
- 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
- 装入(装载):由装入程序将装入模块装入内存运行
2.2、装入的三种方式
2.2.1、绝对装入(物理地址)
- 绝对装入
- 在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址(物理地址)的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
- 只适合单道程序环境
- 程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。通常情况下都是
编译或汇编时再转换为绝对地址
。- 例如
- 事先已知用户程序(进程)驻留在从R处开始的位置,则编译程序所产生的目标模块(即装入模块),便可从R处开始向上扩展。
- 绝对装入程序便可按照装入模块中的地址,将程序和数据装入内存。
- 装入模块被装入内存后,由于程序中的相对地址(即逻辑地址)与实际内存地址完全相同,故不需对程序和数据的地址进行修改。
2.2.2、静态重定向(装入时转换)
- 静态重定向
- 又称可重定位装入。
- 编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。
- 可根据内存的当前情况,将装入模块装入到内存的适当位置。
装入时对地址进行重定位
,将逻辑地址变换为物理地址- 地址变换是在装入时一次完成的,作业运行期间作业不能移动【实际指令地址变化】
- 在一个作业装入内存时,必须分配其要求的全部内存空间
- 如下图
- 装入前:指令\(LOAD\) \(12500\)的物理地址是【起始地址0+1000】
- 装入后:指令\(LOAD\) \(12500\)的物理地址是【起始地址10000+1000】
2.2.3、动态重定向(运行时转换)
- 动态重定位
- 又称动态运行时装入。
- 编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到
程序真正要执行时才进行转换
。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。- 可以将程序分配到不连续的存储区中,作业运行期间允许移动。在程序运行前只需要装入部分代码就可以运行,在运行期间,根据需要动态申请内存。
2.3、三种链接方式
2.3.1、静态链接
- 在程序运行之前
- 先将各个目标模块及它们所需的库函数链接成一个完整的可执行文件(装入模块),之后不再拆开。
2.3.2、装入时动态链接
- 将各个目标模块装入内存时,边装入边链接
2.2.2、运行时动态链接
标签:程序运行,装入,程序,地址,内存,模块,链接 From: https://www.cnblogs.com/shyfvm/p/16948898.html
- 在程序执行中需要该目标模块时才对它链接
- 便于修改和更新,实现目标模块的共享