1、什么是内存?有何作用?2、进程运行的基本原理
什么是内存?有何作用?
1、内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。
2、在多道程序环境下,系统中会有多个不同程序并发执行,也就是说会有多个程序的数据需要同时放到内存中。那么,如何区分各个程序的数据是放在什么地方的呢?给出的方案是给内存的存储单元遍地址。
3、和大楼里的房间类似,内存中也有一个一个的“小房间”,每个小房间就是一个“存储单元”。我们将内存的每个存储单元都像房间号一样编上地址,这样各个程序只需要记得自己数据的房间号就可以很方便的找到。
4、储存单元的大小是不固定的。如果计算机“按字节编码”,则每个存储单元大小为1字节,即1B,即8个二进制位。如果字长为16位的计算机“按字编址”,则每个存储单元大小为1个字,每个字的大小为16个二进制位。
进程的运行原理---指令
1、我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。
2、存储单元的地址有物惯栲狠疲理地址和逻辑地址之分。物理地址又称绝对地址,就像学生的学号,入学就分配好了,入学之后也不会变,我们通过学号可以准确定位到某个同学,这样就是绝对的概念。逻辑地记醋弭床址又称相对地址,通常一个学院学生的学号是连续的,如果我们知道某一个同学的学号,那我们就可以间接知道他前面同学和后面同学的学号,这样就是相对的概念。
进程的运行原理---从写程序到程序运行
1、程序员通过编辑形成源代码.c文件(这里用C语言为例),.c文件通过编译生成.o文件(用机器语言表示的一系列源代码等价的指令集合)的多个目标模块,然后将目标模块链接成一个.exe文件的装入模块,最后由装入程序将装入模块放到内存的相应位置。
2、编译:由编译程序将用户的源代码编译成若干个目标模块(编译就是把高级语言翻译成机器语言)。链接:由链接程序将编译后形成的一组目标模块及其所需库函数链接在一起,形成一个完整的装入模块。装入(装载):由装入程序将装入模块装入到内存中运行。目标模块和装入模块都用的是逻辑地址,装入后变为内存的物理地址。
进程的运行原理---装入的三种方式
1、装入模块中的指令地址指的是“相对地址”,即:相对于开始地址而言的地址。如果将它放到内存为0的地方开始,那么相对地址就变成了绝对地址,指令中的地址也就不用修改了。但如果我们将其放到内存地址为100的地方开始,那么指令的逻辑地址都要加上100变为物理地址。
2、将指令中的逻辑地址转换为物理地址有三种方式,分别是绝对装入、静态重定位、动态重定位。
3、绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。绝对装入只适合用于单道程序环境。
4、静态重定位:又称重定溴腻男替位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位就女蒿鸳置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。逻辑地址到物理地址的转换是由装入程序完成的。静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。
5、动态重定位(现代计算机一般都是采用这种方式):又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。但这种方式需要一个重定位寄存器的支持,重定位寄存器用于存放装入模块存放的起始地址,程序运行时各指令的物理地址就是指令中的逻辑地址加上重定位寄存器中的模块起始地址。采用动态重定位时允许程序在内存中发生移动。
进程运行的原理---链接的三种方式
1、静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
2、装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
3、运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。