内存管理的功能
- 内存空间的分配与回收
- 地址转换
- 内存空间的扩充
- 存储保护
程序装入和链接
步骤:编译 → 链接 → 装入
- 程序的链接方式:静态链接、装入时动态链接、运行时动态链接
- 内存的装入方式:绝对装入、可重定位装入(静态重定位)、动态运行时装入(动态重定位,在执行过程中进行)
内存保护
- 设置一对上、下限寄存器
- 利用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行判断
连续分配管理方式
- 单一连续分配:有内部碎片
- 固定分区分配:分区大小相等 / 不等;程序过大放不进分区、内部碎片导致主存利用率低
- 动态分区分配(可变分区分配):外部碎片,用紧凑(compaction)技术解决
动态分区分配算法:
| 算法 | 特点 |
|---|---|
| 首次适应(First Fit) | 空闲分区按地址递增排列,每次从低址 开始找 |
| 最佳适应(Best Fit) | 空闲分区按容量递增排列;最容易产生内存碎片,但回收的分区利于再次利用 |
| 最坏适应(Worst Fit) | 空闲分区按容量递减排列 |
| 邻近适应(Next Fit) | 从上次查找位置继续查找 |
非连续分配管理方式
基本分页存储管理
- 页面和页面大小:进程中的块称为页(Page),内存中的块称为页框(Page Frame / 页帧),外存直接称为块(Block)
- 页表:实现从页号到物理块号的地址映射
- 基本地址变换机构:页表寄存器(PTR)。设页面大小 L、逻辑地址 A、物理地址 E:
- 页号 P = A / L,页内偏移量 W = A % L
- 若 P ≥ 页表长度 M,产生越界中断
- 页表项地址 = 页表始址 F + P × 页表项长度,取出物理块号 b
- 物理地址 E = b × L + W
- 具有快表的地址变换机构:高速缓冲存储器快表(相联存储器 TLB),主存中的页表常称为慢表;基于局部性原理
- 两级页表:顶级页表最多只能有一个页面;如 10 位一级页号 + 10 位二级页号 + 12 位页内偏移(32 位系统)
基本分段存储管理
- 按程序逻辑分段,段长不固定
- 地址变换:逻辑地址 A = 段号 S + 段内偏移 W;段表项地址 = 段表始址 F + S × 段表项长度;物理地址 E = 段始址 b + W
- 段的共享和保护:分段比分页更易于实现共享和保护
段页式管理
- 地址结构:段号 + 页号 + 页内偏移量
- 一个进程中段表只有一个,页表可能有多个
- 段页式管理的地址空间是二维的