操作系统学习 Day01 内存管理 Apare_xzc
操作系统学习Day01 内存管理
2020.8.31
内存的基础知识
1. 什么是内存?有什么作用?
内存是用于存放数据的硬件,程序执行前要先放到内存中才能被CPU处理。
给内存的存储单元编地址,内存地址从0开始,每一个内存地址对应一个存储单元。如果计算机是按字节编址,则一个存储单元的大小为1字节,即8个二进制位。如果按字编址,字长为16位,那么一个存储单元的大小位2字节(Byte)。
1KB = 210B
1MB = 220B
1GB = 230B
一个手机有4GB的内存,是指在内存种可以存放232个字节,需要232个地址一对一表示,所以需要32位作为地址长度
2. 指令
高级语言编译后形成了机器语言,就是很多指令的集合。
每个进程在逻辑上由三部分组成:程序段,数据段,PCB(进程控制块)
变量存放在数据段里,指令存放在程序段里
CPU会根据程序段里的指令依次进行操作
变量在内存中存放的实际存放地址是物理地址(绝对地址),但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置,所以编译生成的指令中一般是使用逻辑地址(相对地址)
Eg:编译时只需要知道变量x存放的相对地址为100(也就是说相对于进程在内层中起始地址而言的地址)。Cpu想找到x在内存中的实际存放位置,只需要用进程的 起始地址+100 即可
3. 从写程序到程序运行经历的阶段
(1) 编译阶段:将许多源代码文件(.C)编译成为相应的目标模块(.O),就是把高级语言翻译成机器语言,每个目标模块都有自己从0开始的逻辑地址
(2) 链接阶段:由链接程序将编译后形成的一组目标模块,以及所需的函数库链接在一起,形成一个完整的装入模块(.exe),并且形成完整的逻辑地址空间。
(3)装入阶段:由装入程序将装入模块装入内存中运行(进行逻辑地址和物理地址的转换)
4. 装入的三种方式
(用三种不同的方法实现逻辑地址到物理地址的转换)
(1) 绝对装入:在编译时,就知道程序将放在内存的哪个位置,编译程序将产生绝对地址的目标代码,装入程序按照装入模块中的地址将程序和数据装入内存。(只适用用于单道程序环境)
(2) 静态重定位:又称可重定位装入。在装入时对地址进行重定位。将逻辑地址变为物理地址。(地址变换是在装入时一次性完成的)。
特点:在一个作业装入内存时,必须分配其要求的全部内存空间。 如果没有足够的内存,就不能装入。作业一旦进入内存后,在运行期间就 不能再移动,也不能再申请内存空间。
(3) 动态重定位:又称动态运行时装入。编译,链接后的装入模块逻辑地址是从0开始的。装入后不转化成逻辑地址。把地址转换推迟到程序真正要执行的时候。用重定位寄存器存放装入模块在内存中的起始地址,然后访存时,用逻辑地址+重定位寄存器中的气质地址就得到了物理地址。
特点:允许程序在内存中发生移动,只需要改变重定位寄存器中的起始地址即可。十分灵活。可将程序分配到不连续的存储区中。在程序运行前只需要装入部分代码即可投入运行。在运行期间,可以根据需要动态申请和分配内存。
5. 链接的三种方式
(1) 静态链接