96SEO 2026-06-12 18:06 9
缺页中断难道不是出错,而是内核Zui繁忙的正常路径吗?
哈哈,你说得对,咱就是说缺页中断这个名字听着挺吓人,但其实它是我们程序运行过程中非常常见的一种情况。

简单来说就是 CPU 在执行指令时需要访问某个虚拟地址,但发现对应的物理页不在内存里这时候就会触发缺页中断。
害,这时候内核就得接手了kankan这个地址到底是不是合法的,Ru果是的话,就得把对应的物理页给补上。
那怎么kan一个进程发生了多少次缺页中断呢?Linux 为每个进程实时累计着 minor / major fault 的次数,我们Ke以通过一些命令或者代码来查kan。
比如说我们Ke以用 /usr/bin/time -v 这个命令来跑我们的程序,结束后它会把整个进程的缺页数打出来。
你kan,这就是为什么百度不收录某些网站的原因之一,因为有些网站的服务器响应速度太慢,导致搜索引擎爬虫频繁超时这样就没法收录了。
回答:那是因为服务器响应速度太慢,或者网站结构、内容等原因导致搜索引擎爬虫没法正常抓取。
说实话,缺页中断是内核Zui忙的正常路径之一,不是异常。
咱就是说malloc 完第一次写、程序第一次执行到某段代码、读一个 mmap 进来的文件,全靠缺页才把内存真正落地。
它会检查出错的那个虚拟地址是不是合法的,Ru果不是直接给进程发 SIGSEGV 信号,结束进程。
Ru果地址合法,内核就得决定这页内容该从哪儿来是清零造一页,还是去磁盘取,或者从交换区换回内存。
这里面还有个hen有趣的事情,就是写时复制。比如说fork 出子进程时内核没有真复制父进程的内存,而是让父子的页表指向同一批物理页、并把这些页全标成只读。
一旦有谁去写,写只读页 → 触发缺页 → 走 do_wp_page内核这才复制一份新物理页给写的那一方。
虽然听起来挺复杂,但其实它是我们程序运行过程中非常常见的一种情况。
#include <sys/resource.h>
struct rusage r0, r1;
getrusage; // 测量区间——前
/* ... 想测的那段代码 ... */
getrusage; // 测量区间——后
printf("这段代码触发: minor=%ld major=%ld
",
r1.ru_minflt - r0.ru_minflt, // 没碰磁盘的缺页
r1.ru_majflt - r0.ru_majflt); // 真去磁盘的缺页
/proc/<pid>/stat 这个文件的第 、 个字段就是该进程的 minflt / majflt,cat 出来就Nengkan。
同样 个页,第一次访问: 匿名页写: minor= major= ← 内核就地造,不碰磁盘 文件页读: minor= major= ← 每页dou得去磁盘取 差别全在 handle_pte_fault 那一步分派给了谁: do_anonymous_page vs filemap_fault
同样 个页,第一次访问: 匿名页写: minor= major= ← 内核就地造,不碰磁盘 文件页读: minor= major= ← 每页dou得去磁盘取 差别全在 handle_pte_fault 那一步分派给了谁: do_anonymous_page vs filemap_fault
VMA是个啥?
VMA 是内核内部用来记录进程合法拥有的每一段地址区间的东西。
/proc/self/maps 出错地址 ──► findvma 在进程所有 VMA 里查它落在哪个区间
aaaaca4d0000-aaaaca4d1000 r-xp ← 代码段:可读可执行,不可写
aaaaca4f0000-aaaaca4f1000 rw-p ← 数据段:可读可写
aaaaf432c000-aaaaf434d000 rw-p ← 堆
ffffb6760000-ffffb68fc000 r-xp libc ← 库代码
ffff... rw-p ← 栈
查的结果分两种:根本没有哪个 VMA 罩住它 / 有,但权限不符CPU 翻页表失败、陷入内核,Zui先跑起来的是体系结构相关的入口函数——在 arm64 上叫 dopage_fault
缺页异常** | **缺页中断** | |--|--|---| | 定义 | 是指因当前工作集中不存在所需数据而导致处理器无法继续正常工作的状态;通常由硬件机制发起 | 表示为了应对前述状况所采取的一系列措施流程集合体 | | 发生位置 | 主要发生在指令执行阶段或者数据读取/写入期间 | 属于后续针对前者Zuo出反应的一部分 | | 处理主体 | 初始探测由硬件组件负责 | 后续处置则交予操作系统内核模块 | | 时间特性 | 即刻生效 | 存在一个延迟周期 |
fork 后 子写第 k 页 → dowppage
父 ─┐ 父 ─► 物理页A
├─► 物理页A
子 ─┘ 子 ─► 物理页B
↑ 这一次 COW 缺页干的事
读dou不缺页;谁写谁触发一次缺页,分一张私有页给它p = │ ▼ dopagefault ── findvma ──┬─ 没有 VMA ───────────► SIGSEGV └─ 有 VMA,但权限不符 ──► SIGSEGV │ 合法 ▼ handlemmfault → handleptefault ──┬─ doanonymouspage 匿名页:清零造一页 ├─ filemapfault 文件页:去磁盘取 │ ├─ doswappage 换出过:从swap换回 │ └─ dowppage 只读被写:复制一页 ▼ 填好页表项 ──► 回到 p= 这条指令重新执行 ──► 这次翻译通过跑完
gcc -O0 segv.c -o segv && ./segv; echo "退出码=$?" 准备读 %p ... 收到 SIGSEGV: 内核查遍所有 VMA dou没找到地址 %p, 判定非法访问 退出码=$?CPU 翻译虚拟地址时Ru果对应的物理页面不在内存中,就会触发一次缺页中断,此时CPU会暂停当前任务并将控制权交给操作系统的
处理器模式 描述 usr
属于正常 的用户模式,ARM处理器 正常 的程序执行状态,不Neng切换到其他模式 fiq
快速 中断 模式,对高速数据传输或通道处理 irq 对一般情况下的 中断 进行处理 svc 操作系统保…usr模式即Linux中的用户态模式,svc即 内核 模式。.
由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了 缺 页 中断 ,进程会从用户态切换到 内核 态,并将 缺 页 中断 交给 内核 的 Page Fault Handler 处理。.对于一个运行中的进程来说, 不是 所有的虚拟地址在物理内存中dou有对应的 页 .CPU通过地址总线Ke以访问连接在地址总线上的所有外设,包括物理内存、IO设备等等,但从CPU发出的访问地址并非是这些外设在地址总线上的物理地址, 而是 一个...
你打印出来的地址是假的→ 访问它要查多级 页 表、TLB
兜底 → 翻不出来就 缺 页 、陷入 内核 → 内核走这棵决策树,安检 +
补 页 → 回到原指令重跑、这次翻译通过。从 &x 那一串数字,到内存条上真实的一格,
中间这条路,到这 篇 算是走完了。
Zui典型的来源就是 fork 。上上 篇 我们见过 fork 的“同址两值”之谜,当时只说了结论,现在Neng从 缺 页
这一侧把它讲透了。
到这里Nengkan出 内核 的Zuo事顺序了:它 * 先安检,再办事 *。第一步跟“去哪 儿弄这 页
内存”毫无关系,纯粹在问“你有没有资格碰这里、Neng不Neng这么碰”。两道关——有没有 VMA、
权限符不符——任何一道没过直接 SIGSEGV ,连后面dou不用走。我们平时眼里“一种”的段 错误,
在 内核 这 儿其实是两个不同的失败分支。
还欠一篇 : 物理内存真的不够用时 , 内核 怎么挑“Zui不常用”的 页 踢到磁盘交换区、
腾地方给新的 缺 页 ——也就是本 篇 do_swap_page
那个分支的反面。那是另一棵树,下次再走。
分支② : 有 VMA,但你干的事它不允许 →
保护错误。
虚拟 地址 ,操作系统检查这个 地址 是否有效,并检查存取与保护是否一致。Ru果不一致,
向进程发出一个信号或杀掉该进程。Ru果 地址 有效且没有保护
错误
发生,系统则检查是否有空闲
页框 。Ru果没有空闲 页框 ,执行 页面置换算法寻找一个页面来淘汰。 ) Ru果选择的 页框 脏 了,
安排该 页 写回磁盘,并发生一次 上下文切换,挂起产生
缺 页 中断
的进程,让其他进程运行直至磁盘传输结束。无论如何,该 页框 被标记为忙,以免因为其他原因而被其他进程占用。 ) 一旦 页框
干净 后,操作系统查找所需页面在磁盘上的 地址 ,
通过磁盘操作将其装入。该页面被装入后,产生 缺 ...
你kan,这就是为什么咱要讨论这个话题,因为它和我们日常开发息息相关嘛!
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback