- 基本内存管理:
- 进程占用空间必须连续,导致外部碎片以及附加的compaction
- 整个进程的swap in 和 swap out十分耗时。
- 解决:分页 ->内存空间不必连续,无外部碎片,有内部碎片。可以部分swap in 和 out。
- 分页式内存管理
- 重定位
- 物理内存:帧 <==> 逻辑内存:页
- 页表管理页和帧的映射关系,每条记录称作PTE。即输入page number,输出frame number。
- 逻辑地址:page number和page offset。
- 物理地址:frame number和frame offset。
- 实现:MMU查询页表负责地址映射,OS维护页表,屏蔽了映射细节。
- 页表存储在内存,Page table base register(PTBR)和 page table length register(PTLR)分别保存页表的位置和长度。
- 缺点:每次内存访问包括(2次)访问PT和访问内存数据。 解决方案:MMU中包含TLB(Translation Look-aside Buffers)缓冲。
- 内存保护
- 以页为单位,保护信息存储在PTE
- 另PTE包含valid/invalid位表明页是否可以使用。
- 页表结构
- 每个进程需要一个页表,而全地址页表过于大。需要动态调整进程页表的大小
- 层次型页表:树形,如二级页表(PD和PDE)【page directory number,page table number,page table offset】
- hash页表
- inverted页表
- 内存分配和回收
- 内存分配:分配frame,并创建页表
- 内存回收:进程退出时,回收frame
- 空间frame的管理:free frame list
- 内存共享以页面为单位。
- 分段式内存管理
- 概念:逻辑地址空间由段组成,每段的数据类型相同。如代码段,数据段,栈。段在物理上不连续。
- 重定位
- 逻辑地址:segment number , offset
- segement table 保存逻辑地址到物理地址的映射。每条记录包括base,limit(offset < limit),protection bits。
- 类似段表存储在内存,segment table base register 和 segment table length register保存段表的位置和长度。
- 内存保护和共享
- 以段为单位
- 缺点:容易产生外部碎片。
- 段页式内存管理(IA-32)
- 必须分段
- 最大段为4GB
- 全局段和本地段
- 可选分页
- 先分段,后分页