内存管理:把有限物理内存安全、高效地分给多进程,用虚拟内存让每个进程以为独占全部空间。
把内存分成连续块分给进程。三种动态分区放置策略:
连续分配产生外部碎片:总空闲够但都太小不连续,装不下新进程。解决:紧凑(compaction),代价高。
| 分页 | 分段 | |
|---|---|---|
| 划分依据 | 固定大小(如 4KB),无逻辑意义 | 逻辑单元(代码/数据/栈),变长 |
| 用户可见 | 不可见 | 可见,符合程序员视角 |
| 地址空间 | 一维(页号+页内偏移) | 二维(段号+段内偏移) |
| 碎片 | 内部碎片(最后一页浪费) | 外部碎片(段间空隙) |
| 共享/保护 | 按页,粒度粗 | 按段,语义清晰 |
| 现代用法 | 主流(x86 分页) | 常与分页结合(段页式) |
分段符合程序结构但外部碎片难处理;分页无外部碎片但破坏逻辑边界。现代系统用段页式:先分段再分页。
虚拟内存:把磁盘当内存延伸,进程只把当前需要的页调入内存,其余留交换区。
好处:地址空间可大于物理内存、隔离保护、共享库。代价:缺页磁盘访问慢(毫秒 vs 内存纳秒)。
// 页表项存:页框号 + 有效位 + 权限位
phys = page_table[vpn].frame * PAGE_SIZE + offset;
内部碎片 = 分给进程但用不完的块内浪费(分页最后一页);外部碎片 = 块间无法利用的空隙(连续/分段)。分页只有内部碎片;分段/连续只有外部碎片。二者此消彼长。