第 6 章 · 内存管理

内存管理:把有限物理内存安全、高效地分给多进程,用虚拟内存让每个进程以为独占全部空间。

6.1 连续分配

把内存分成连续块分给进程。三种动态分区放置策略:

  • 首次适应(First Fit):从头找第一个够大的空闲块。快,低地址端碎片多。
  • 最佳适应(Best Fit):找最接近大小的空闲块。浪费最小,产生大量极小碎片,且要遍历。
  • 最坏适应(Worst Fit):找最大的空闲块。剩余块仍较大可用,但大块很快耗尽。

连续分配产生外部碎片:总空闲够但都太小不连续,装不下新进程。解决:紧凑(compaction),代价高。

6.2 分页 vs 分段

分页分段
划分依据固定大小(如 4KB),无逻辑意义逻辑单元(代码/数据/栈),变长
用户可见不可见可见,符合程序员视角
地址空间一维(页号+页内偏移)二维(段号+段内偏移)
碎片内部碎片(最后一页浪费)外部碎片(段间空隙)
共享/保护按页,粒度粗按段,语义清晰
现代用法主流(x86 分页)常与分页结合(段页式)

分段符合程序结构但外部碎片难处理;分页无外部碎片但破坏逻辑边界。现代系统用段页式:先分段再分页。

6.3 虚拟内存

虚拟内存:把磁盘当内存延伸,进程只把当前需要的页调入内存,其余留交换区。

  • 局部性原理:时间局部性(刚用过的可能再用)+ 空间局部性(附近的可能用)——虚拟内存能成立的根基。
  • 缺页(page fault):访问的页不在内存,触发缺页中断从磁盘调入。缺页是第 7 章置换算法的触发器。

好处:地址空间可大于物理内存、隔离保护、共享库。代价:缺页磁盘访问慢(毫秒 vs 内存纳秒)。

6.4 地址转换:页表 + 快表

物理地址=页框号×页大小+页内偏移\text{物理地址}=\text{页框号}\times\text{页大小}+\text{页内偏移}

// 页表项存:页框号 + 有效位 + 权限位
phys = page_table[vpn].frame * PAGE_SIZE + offset;
  • 页表:每进程一张,页号索引 → 页框号。多级页表解决页表太大。
  • TLB(快表):CPU 高速缓存,缓存最近用过的页表项,命中省一次访存。
  • 有效访问时间:TLB 命中 ≈ 1 次访存;未命中 ≈ 2 次(先查页表再访存)。TLB 命中率是性能命门。

内部碎片 = 分给进程但用不完的块内浪费(分页最后一页);外部碎片 = 块间无法利用的空隙(连续/分段)。分页只有内部碎片;分段/连续只有外部碎片。二者此消彼长。