第8章 内存管理(memory management)
- 内存硬件的组织方法
- 内存管理计数,包括分页跟分段
背景
- 解决内存与CPU之间的速度问题,在两者之间插入高速缓存(cache)
- 基址寄存器:规定了最小的合法地址
- 界限地址寄存器:决定了范围的大小
- 绝对代码:编译时即知道进程最后在内存中的地址,直接生成绝对地址
- 重定位代码:编译时不知道进程最后在内存中的地址,从而生成重定位地址,在链接(加载)时再进行地址的绑定
- CPU产生的是逻辑地址,通过重定位寄存器的修改后,变成内存中的绝对地址
交换
类似轮换算法等,都是需要不断交换CPU中的进程来执行的
- 滚出(roll out):低优先级的进程被高优先级的进程置换出来
- 滚入(roll in):高优先级的进程执行完毕后,低优先级的进程再次进入
连续内存分配(Contiguous Allocation)
- 操作系统一般放置在低内存,即小端,跟随中断向量的位置
- 连续内存分配(contiguous memory allocation):每个进程位于一个连续的内存区域中
内存分配(分区:partition)
- 固定分区:将内存分成固定大小的分区,每个分区只允许放置一个进程
- 可变分区(variable-partition):通过一张表记录哪些内存可用或不可用,每次需要增加进程时,查询足够大的空闲内存(即孔hole)
动态分区的算法
- 首次适应法(first-fit):分配第一个足够大的孔
- 最佳适应法(best-fit):分配最小的足够大的空,必须遍历整张表
- 最差适应法(worst-fit):分配最大的空,必须遍历整张表
- 再次适应法(next-fit):从上一次插入的位置,往下寻找可以足够大的孔
碎片
- 外部碎片(external fragmentation):动态分配内存的时候,两个进程之间的空闲的小块
- 内部碎片(internal fragmentation):固定大小分区时,插入的进程小于固定分配的内存大小,产生的内部碎片
- 紧缩(compaction):通过移动内容,来使小的外部碎片合并成较大的外部碎片
分页
- 目的:允许进程的物理空间地址是不连续的
- 帧(frame):将物理地址分为固定大小的块
- 页(page):将逻辑地址分为固定大小的块
- CPU产生的地址分为两个部分:页号(p)和页偏移(d)
- 页号:页表中的索引,对应每一页的基地址
- 页偏移:在页号对应的基地址的基础上的偏移
- 分页不会产生外部碎片,但是会产生外部碎片,在最后一页未用完的内存即成为内部碎片
- 硬件支持:需要有页表,帧表以及重定位的寄存器,同时可以通过TLB(转换表缓存区)来实现快速查找
- 共享也的相关说明
页表结构
- 层次页表(Hierarchical Paging):多重索引
- 哈希页表()
- 反向页表
分段
- 分页的问题:用户视角跟实际物理内存是不一样的
- 分段(segmentation):支持用户视角的内存管理方案,将数据够跟程序等继续分开,分成大小不一的内存段,即分段
- 硬件:段表