713 字
4 分钟
缺页异常如何处理?虚拟内存不等于 Swap
虚拟内存让进程通过虚拟地址访问受页表管理的映射。MMU 查 TLB 和页表,若映射有效且权限允许,地址转换到物理页框;若页表显示页面尚未驻留,CPU 产生缺页异常,内核再根据映射类型处理。缺页不等于内存不足,也不等于一定从磁盘读入。
常见分支有:
- 匿名内存首次访问:例如新分配但尚未实际触碰的堆页。内核可分配物理页并清零,或在满足语义时映射共享零页;这不需要从文件读取。
- 文件映射页不驻留:内核可从对应文件或页缓存取得内容。只读共享库的页面可以被多个进程映射到同一物理页。
- 匿名页被换出:若页面此前写入 Swap 且之后仍需访问,内核可将其读回内存;这只是虚拟内存可能使用的一类后备存储。
- 地址或权限非法:例如访问未映射区域、写只读映射且不是可处理的 COW 场景,内核无法补齐合法映射,会向进程报告访问错误,而不是随意找个物理页。
虚拟地址空间大小也不等于可用 RAM 或已提交内存。32 位地址位宽理论范围是 4GiB,但用户与内核如何划分、进程能映射多少受 OS/ABI 配置影响;64 位系统也只实现部分地址位,范围取决于 CPU、内核和进程 ABI。OOM 不是“Swap 满了必然启动”的固定流程:Linux 的分配上下文、内存域、cgroup 限额、系统策略等都会影响是否触发及影响范围。频繁换页可能造成抖动,但少量缺页属于正常按需调页。
常见追问
Q:发生缺页时一定要读磁盘吗?
A:不一定。匿名页可分配并清零,文件页可能在页缓存;只有相应内容不驻留且需要后备数据时才可能进行存储 I/O。
Q:缺页异常和非法内存访问是一回事吗?
A:不是。缺页异常是硬件报告映射未驻留或权限条件不满足,内核会先判断能否合法补页;非法地址或权限访问最终才报告进程错误。
Q:虚拟内存是不是把所有超出 RAM 的内容放到 Swap?
A:不是。映射还可能对应文件、共享页或尚未实际分配物理页的区域;Swap 只是匿名页等内容的一种后备位置。
Q:OOM killer 何时触发?
A:不能按“物理内存和 Swap 都满”一条规则判断;分配上下文、cgroup 限制、可回收页面及系统配置都会影响 OOM 处理。
缺页异常如何处理?虚拟内存不等于 Swap
https://blog.xqcherry.top/posts/interview/operating-system/page-fault-virtual-memory-boundaries/ 目录