内存
一、内存
内存是用于存放数据的硬件,程序执行前
需要放到内存
中才能被CPU处理
内存地址从0开始,每个地址
对应一个存储单元
二、指令
高级语言编译后
的代码,会形成对等的机器指令
内存中,变量存放在数据段,指令存放在程序段。CPU会依次执行指令,每个指令对应的有操作码和地址码,一般来说机器指令不知道该进程数据会存放在哪里
,这里指令给出的地址参数
一般是逻辑地址
进程在逻辑上由程序段、数据段、PCB组成
三、逻辑地址,相对地址
编译时产生的指令只关心 相对地址(逻辑地址),实际放入内存中根据起始位置得到 绝对地址(物理地址)
四、写程序到程序运行
编译
:由程序将用户源代码编译成若干个目标模块(翻译为机器语言)
链接
:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成完整的装入模块
装入
:由装入程序将装入模块装入内存运行
在装入过程要先完成逻辑地址
到物理地址
的转换,然后将程序和数据装入内存中指定的物理地址。根据逻辑地址到物理地址所采用的不同转换方法将装入分为三种方式,下面详细讲解这三种装入方式(逻辑地址转物理地址方式)
五、装入三种方式
5.1 绝对装入
定义:即在编译时,就已经知道程序将放到内存中的哪个位置,编译程序直接产生绝对地址(物理地址)的目标代码。装入程序按照装入模块中的地址,直接将程序和数据装入内存即可
这种方式只适用于单道程序
环境,因为单道程序保证只有一个程序
在访问内存,不会导致不同程序相互竞争占用同一块内存的情况。
5.2 静态重定位
定义:装入之前就必须分配其需要的全部内存空间,并且确定内存的起始位置,然后装入程序一次性完成所有指令的逻辑地址到物理地址的转换
静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间
,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动
,也不能再申请内存空间。
5.3 动态重定位
定义:这种方式就是在将逻辑地址转为物理地址推迟
到了具体的程序运行时期,具体是通过一个系统设置的重定位寄存器
实现的。重定位寄存器中存放了装入模块在内存中的起始地址,我们只需要将逻辑地址与寄存器中的起始地址相加就可以得到实际的物理地址
采用动态重定位时允许程序在内存中发生移动
(只需要对应修改重定位寄存器中的起始位置就可以了)
5.4 总结
1、绝对装入和静态重定位装入的方式,都是一次性将程序全部装入到指定内存位置,
并且后续程序位置不能发生改变;
2、动态重定位装入方式是可以一部分一部分的装入内存,并且程序在内存中的位置并不固定,
可以发生移动(只需要对应修改重定位寄存器中的起始位置就可以了)
六、链接三种方式
链接是将编译为CPU可以识别的多个机器代码目标模块整合为一个完整的装入模块。根据链接的时期将其分为三种方式
6.1 静态链接
在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件
(装入模块),之后不再拆开
6.2 载入时动态链接
将各目标模块装入内存时,边装入边链接
的链接方式(一次性依次将所有模块装入)
6.3 运行时动态链接
在程序执行中需要该目标模块
时,才对它进行链接
。其优点是便于修改和更新,便于实现对目标模块的共享