操作系统基础28-内存基础知识
2020-12-16 05:59·重学IT的老猫
什么是内存,有何作用
进程运行的原理-指令
我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。在这个例子中,指令中直接给出了变量x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用逻辑地址(相对地址)。
逻辑地址VS物理地址
编译时只需确定变量x存放的相对地址是100 ( 也就是说相对于进程在内存中的起始地址而言的地址)。CPU想要找到x在内存中的实际存放位置,只需要用进程的起始地址+100即可。 相对地址又称逻辑地址,绝对地址又称物理地址。
进程运行的基本原理(从写程序到程序运行)
编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)
链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。
装入(装载) :由装入程序将装入模块装入内存运行。
装入内存的三种方式
绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。 绝对装入由于逻辑与实际内存地址相同,故不需要对程序和数据的地址进行修改。绝对装入只适用于单道程序环境,绝对地址可由程序员在编译或者汇编时赋予。
可重定位装入:在多道程序环境下,多个目标模块的起始地址通常都是从0开始,程序中的其他地址都是相对于起始地址的,此时采用可重定位装入方式,根据内存的目前情况,将装入模块装入到内存的适当位置。装入时对目标程序中指令和数据的修改称为重定位,地址变换通常是在装入时一次完成的。所以又称静态重定位。 静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业,此外,作业一旦进入内存后,在整个运行期间不能在内存中移动。
动态运行时装入:也称为动态重定位,程序在内存中如果发生移动,就需要采用动态的装入方式。编译、链接后的装入模块的地址都是从0开始的。装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换成绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。 动态重定位的特点是可以将程序分配到不连续的存储区中,在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配的内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
链接的三种方式
静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成-一个完整的可执行文件(装入模块),之后不再拆开。
装入时动态链接:将用户源程序编译后所得到的一组目标模块,将各目标模块装入内存时,边装入边链接的链接方式。
运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行的链接,其优点是便于修改和更新,便于实现对目标模块的共享。