内存管理
功能
内存管理的主要功能有:
- 内存的分配与回收,使程序员免除分配内存的麻烦;
- 地址转换,多道程序环境下,逻辑地址与物理地址不一致,操作系统通过内存管理单元 MMU 进行转换;
- 内存扩充,通过虚拟化技术或自动覆盖技术,从逻辑上扩充内存;
- 内存共享,允许多个进程访问同一内存部分;
- 存储保护,保证各作业在各自存储空间运行,互不干扰。
程序的链接和装入
创建进程首先要将程序和数据装入内存,流程为:
- 编译,由编译程序将源代码编译为若干目标模块;
- 链接,将目标模块与其需要的库函数链接,形成完整的装入模块;
- 装入,装入内存。
tip
链接一般有三种方式:
- 静态链接,程序运行前,链接为一个完整的装入模块,不再拆开,但要解决两个问题:
- 修改相对地址,编译后的所有目标模块都是从 0 开始;
- 变换外部调用符号,也变换为相对地址;
- 装入时动态链接,便于修改和更新,实现对目标模块的共享;
- 运行时动态链接,加快装入过程,节省大量内存。
装入也有三种方式:
- 绝对装入,只适用于单道程序,逻辑地址与物理地址相同,甚至可以由程序员给出;
- 可重定位装入,多道程序环境下,起始地址通常是 0,程序中的其他地址则是相对于 0 的相对地址,装入时需要进行 重定位,静态 修改所有地址为实际物理地址;
- 动态运行时装入,程序若在内存中发生移动,则需要 动态 装入,将地址转换推迟到程序执行,需要一个重定位寄存器;便于将程序分配到不连续的存储区,并且只装入部分代码就可以运行,也有利于程序段的共享。
进程的内存映像
- 代码段,程序的二进制代码,只读,可被多个进程共享;
- 数据段,包括全局变量和静态变量;
- 进程控制块(PCB),存放在系统区;
- 堆,存放动态分配的变量,从低地址向高地址;
- 栈,实现函数调用等,从高向低。
代码段和数据段装入时就指定了大小,而堆和栈不同,会动态收缩和扩张。
内存保护
为了确保进程都有单独的内存空间,有两种方法:
- CPU 中设置上下限寄存器,判断有无越界;
- 采用 重定位寄存器(又称基地址寄存器)和界地址寄存器(又称限长寄存器),分别包含最小的物理地址值和逻辑地址最大值,判断有无越界。
内存共享
tip