什么是内存
- 内存是一种硬件,我们的程序必须进入内存,才能被CPU执行,我们的CPU只能跟内存交互
存储单元
- 为了知道我们的数据存储在什么地方,那么就需要给我们的内存进行分区 编号,比如我们的酒店,就分为一间间客房,然后给客房编号,我们的住户就知道应该住在酒店的什么区域
- 我们的内存中将这种小房间称为存储单元
- 如果计算机按照字节编址(一个房间的大小为一个字节)
- 如果按字编制,那么每个存储单元的大小为一个字,如果计算机的字长是16位,那么每个存储单位的大小位16位
数量单位和内存地址
进程运行的基本原理
指令就是操作码和若干参数(包括地址码)
- 因为这种特性,所以造成我们的代码中的原子性的问题
- 因为要获得数据,所以我们必须要得到数据的地址,在上面的例子中,指令中给的变量x的实际地址(物理地址),但是在实际生成机器指令的适合并不知道该进程的数据会被放到什么位置,所以在编译生成的指令一般是使用逻辑地址
逻辑地址和物理地址
从写程序到程序运行—编译、链接、装入
- 编译:就是将我们的高级语言编程成机器语言
- 链接:由链接程序将编译后形成一组目标模块,以及将所需的库函数链接在一起,形成一个完成的的装入模块
- 装入:也就是将装入模块装入内存运行
装入的三种方式
绝对装入
- 这种方式只适合我们的单道程序环境 也就是我们程序中的地址必须是物理地址,不然就会出错
- 可以由我们的程序员直接赋予,但是一般是在编译或者汇编的时候给出
静态重定位
- 我们的装入模块的地址加上物理上的初始地址,然后在装入内存
- 这种需要在装入内存的时候,必须要分配其要求的全部内存空间,而且这种方式一旦进入了内存,在运行期间就不能在移动,也不能再神奇内存空间
动态重定位
- 编译,链接后的装入模块的地址是我们的逻辑地址,装入内存后也还是我们的逻辑地址
- 当我们的程序真正要执行的时候,才会利用重定位寄存器来得到真正的物理地址
- 好处就是
- 我们允许我们的程序在内存中发生移动
- 并且可以将程序分配到不连续的存储区,我们在程序允许的时候装入它的部分代码就可以进行运行,然后再程序运行期间根据需求动态申请分配内存(这样可以想用户提供一个比存储空间更大的地址空间)
三种链接方式
静态链接
- 在程序运行之前,就是还没有装入内存就将各目标模块以及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开
装入时动态链接
- 在装入的时候动态链接,各目标模块装入内存的时候,边装入边链接的链接方式
- 也就是在程序执行的时候当需要该目标模块的时候,才对它进行链接