地址翻译
CPU 使用 虚拟地址;MMU 通过 页表 查 物理页框。典型页大小 4KB(也有 2MB 大页 HugePage 降 TLB miss)。
多级页表:只用到的地址空间才分配中间页表,节省内存。
页面置换
物理内存满时 换出 冷页到 swap,换入 热页。算法:LRU 近似(clock)、FIFO(Belady 异常)。
抖动 thrashing:工作集大于内存,频繁缺页,CPU 利用率暴跌。
写时复制 Copy-on-Write
fork 后父子共享只读页;写入触发缺页,复制一页。Go slice 共享底层数组类似逻辑(用户态)。
mmap
把文件或匿名内存映射到虚拟地址空间,按需缺页 加载。
// 概念示意
void *p = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
MAP_SHARED 多进程共享;MAP_PRIVATE COW。Go 堆、Java metaspace 等与 OS 虚拟内存协作。
与 week03-go-memory-gc
Go GC 扫描堆上指针;栈扫描 STW 短暂。理解 OS 层面 RSS vs VSS:进程虚拟大小含未 touch 映射。
后端场景
- 数据库 Buffer Pool:InnoDB 页与 OS page cache 关系(Week 5)。
- Redis:持久化 fork 时 COW 导致内存峰值(Week 6)。
- 容器 memory limit:OOM killer 杀进程。
面试题
虚拟地址空间布局(栈向下、堆向上、mmap 区);4GB 32 位限制;大页在 DB 中的应用。
Week 4 总结
网络(TCP/HTTP/DNS/LB)+ OS(进程线程、虚存)构成后端基础八股闭环,支撑 Week 5 MySQL 与 Week 6 Redis。
实战巩固与面试表达
本篇属于 8 周冲刺 week04-virtual-memory 主题。复习时先闭卷回答 frontmatter 中三张 flashcard,再展开口述两个「为什么」:为什么这种方案能 work、边界失败时如何降级。与相邻章节对照:算法篇强调复杂度与模板,Go 篇强调工程默认写法,中间件篇强调线上故障案例。
动手与自检清单
用 25 分钟限时做 1 道相关练习题或画出一张架构/数据结构示意图;用 5 分钟写 STAR 片段说明你在项目里是否用过类似技术。记录 3 个面试追问及你的标准答法,存入 /zh/notebook/master-plan 笔记。若某点不熟,回到对应 /chapters 交互 Lab 重新走一遍流程,比死记卡片更有效。
易错点提醒
避免只背名词不会画图;避免只说优点不谈 trade-off(性能、一致性、运维成本至少提一项);避免把学习 Demo 说成百万 QPS 生产。回答时使用「场景 → 方案 → 结果 → 反思」四段式,体现工程成熟度。
自检
画虚拟地址到物理地址翻译路径;解释 major/minor page fault 区别。