D
AI
学习工作台
8 周后端冲刺2026-05-221 分钟阅读

虚拟内存

页表、TLB、缺页中断与 mmap 机制

8周冲刺week4操作系统虚拟内存记笔记标记疑惑

地址翻译

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 区别。

知识卡片

问题

为什么需要虚拟内存?

点击翻转查看答案

答案

进程独立地址空间(隔离与安全)、逻辑地址空间大于物理内存(换页)、简化链接加载(固定虚拟布局)。

问题

TLB 作用?

点击翻转查看答案

答案

页表项缓存,加速虚拟地址到物理地址翻译;TLB miss 需走页表,多级页表减少内存占用。

问题

缺页中断后内核做什么?

点击翻转查看答案

答案

查 VMA 合法性;若页在 swap 则调入;若匿名页则分配零页;更新页表并置 valid,返回用户态重试指令。