内存管理
内存管理主要功能包括:
- 内存空间的分配与回收
- 地址转化:把逻辑地址转化成物理地址
- 内存空间的扩充:虚拟存储技术
- 内存共享 : 允许多个进程安全地访问同一块物理内存地址
- 存储保护 : 确保各进程只能访问自身被授权的内存区域
逻辑地址与物理地址:
编译后的每个 .o 目标文件从 0 开始编址,这是逻辑地址。
链接器把多个 .o 拼成可执行文件时,统一分配代码段、数据段在逻辑地址空间里的实际起始位置(比如 Linux 下默认 0x400000)。
程序看到的永远是逻辑地址,真正运行时由 OS 分配物理页框 + MMU 实时翻译。程序员不用管物理地址。
程序的链接:
学c++的时候学过:编译与链接
静态链接就是都拼在一起加偏移量,动态链接是声明外部模块,运行时去外部寻找
程序的装入:
- 绝对装入:编译时就确定物理地址,程序里直接用物理地址,只适合单道、地址已知的场景
- 可重定位装入:逻辑地址从0开始,装入时一次性把逻辑地址加上起始地址换算成物理地址(静态重定位),装入后不能再移动
- 动态运行时装入:装入时不换算,程序运行、真正访问时才由硬件(MMU)把逻辑地址转成物理地址,程序可在内存中移动,是现代系统的做法
连续分配管理方式:
- 单一连续分配:操作系统和单一进程独占内存
- 固定分区分配:内存分区,每个分区一个进程,分区大小固定
- 动态分区分配:按进程实际需要动态划分分区,进程结束后再回收并合并空闲分区
| 算法 | 描述 |
|---|---|
| 首次适应算法 | 按地址顺序查找空闲分区,找到第一个满足大小要求的分区就分配 |
| 邻近适应算法 | 从上次查找结束的位置继续找,找到第一个满足要求的空闲分区就分配 |
| 最佳适应算法 | 选择最小但仍能满足要求的空闲分区进行分配,为了大进程安全 |
| 最坏适应算法 | 选择最大的空闲分区进行分配,让分配后的剩余空间尽量大,为了减小碎片化 |
| 快速适应算法 | 按空闲分区大小分类管理,进程可快速找到对应大小的空闲链表 |
| 伙伴系统 | 按 2 的幂次划分分区,需要时拆分,回收时按伙伴关系合并 |
| 哈希算法 | 用哈希表记录空闲分区信息,加快空闲分区的定位与分配 |