目录
什么是内存?内存的作用
常用的数量单位
指令的工作原理
思考
三种装入方式
绝对装入
可重定位装入(静态重定位)
动态运行时装入(动态重定位)
写程序到程序运行
编译和链接
链接的三种方式
本节思维导图
什么是内存?内存的作用
基本概念:暂时存放CPU中的运算数据,以及与硬盘等 外部存储器 交换的数据
作用:缓和CPU与硬盘之间的速度矛盾,程序执行前需要先放到内存中才能被CPU处理
原本数据是放在外存中进行处理的,但是外存处理速度很慢,CPU的处理速度很快,所以引入内存概念,将要处理的数据放入内存中让CPU进行快速处理
思考:多道程序环境下,系统中会有多个程序并发执行,也就是说会有多个程序的数据需要放到内存中,那么,如果区分各个程序的数据是放在什么位置?
答案:给内存的存储单元编写地址
位、字节、字是计算机数据存储的单位。位是最小的存储单位,每一个位存储一个1位的二进制码,一个字节由8位二进制组成。而字通常为16、32或64个二进制位组成。
常用的数量单位
- 2^10 = 1k(千)
- 2^20 = 1M(兆,百万)
- 2^30 = 1G(十亿,千兆)
一台手机有4GB内存,是指该内存中可以放4*2^30个字节,如果按字节编址,就有4*2^30 = 2^32个内存单元,这些内存单元需要2^32个地址才能一一标识,所以地址需要32个二进制位来标识(0~2^32-1)
指令的工作原理
指令(操作码,与该操作相关的必要参数,与该操作相关的必要参数...)
- 输入代码x=x+1.代码被编译成三条指令(机器码),每条指令都有其相应的作用
- 程序运行时,这些指令就会被放入内存的程序段中,等待上CPU
- 指令1在CPU上执行时,CPU发现操作码代表的意思是数据传送指令:将地址为01001111中存放的数据放入地址为00000011的寄存器中,然后执行指令2
- 指令2在CPU上执行时,CPU发现操作码代表的意思是加法指令:将地址为00000011的寄存器中存放的数据10加上1(00000001),此时该寄存器中存放的数据是11,然后执行指令3
- 指令3在CPU上执行时,CPU发现操作码代表的意思是数据传送指令:将地址为00000011的寄存器中存放的数据放入地址为01001111的内存单元中
- 至此完成x=x+1这段代码
(01001111这些码都是瞎编的,目的是为了方便理解)
结论:我们写的代码在执行后会要翻译成CPU能识别的指令(这些指令会告诉CPU应该去内存的哪个地址读/写数据,这个数据应该做什么样的处理。在这个例子中,我们默认让这个进程的相关内容从地址#0开始连续存放,指令中的地址参数直接给出了变量x的实际存放地址(物理地址))
思考
如果这个进程不是从地址#0开始存放的,会影响指令的正常执行吗
利用装入模块中提供的逻辑地址
起始为#0:
起始不为#0:
那么如何将指令中的逻辑地址最终转换为物理地址?
三种装入方式
绝对装入
概念:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码,装入程序按照装入模块中的地址,将程序和数据装入内存
缺点:只适用于单道程序环境(不存在操作系统时期使用的方法),可以移植性低(将该代码放在另一个操作系统中时,如果绝对地址为179的位置不能使用就会出错)
可重定位装入(静态重定位)
概念:编译、链接后的装入模块的地址都是从0开始的。指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行”重定位“,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)
缺点:一个作业在装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请空间
动态运行时装入(动态重定位)
概念:编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址(这种方式主要是利用了一个重定位寄存器)
重定位寄存器:存放装入模块存放的起始地址
如果想要从200开始,就将重定位寄存器中存放的起始地址修改为200即可
优点:
- 允许程序在内存中发生移动
- 可将程序分配到不连续的存储区中
- 在程序运行前只需要装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存
- 便于程序段的共享,可以向用户提供一个比存储空间大很多的地址空间
写程序到程序运行
编译和链接
链接的三种方式
本节思维导图
~over~