什么是缺页中断(缺页中断详解)

article/2025/8/3 16:33:19

文章目录

      • 【操作系统】什么是缺页中断(缺页中断详解)
        • 一、缺页中断的本质与背景
          • 1. **虚拟内存与分页机制**
          • 2. **缺页中断的定义**
        • 二、缺页中断的触发场景
          • 1. **首次访问新分配的虚拟页**
          • 2. **内存置换导致的页缺失**
          • 3. **访问权限冲突**
          • 4. **页表项无效**
        • 三、缺页中断处理流程(内核视角)
        • 四、缺页中断与性能影响
          • 1. **缺页率与系统性能**
          • 2. **减少缺页中断的策略**
        • 五、缺页中断与其他中断的区别
        • 六、实战分析:Linux下查看缺页中断
          • 1. **查看系统缺页统计**
          • 2. **分析进程缺页情况**
          • 3. **案例:大数组访问引发的缺页中断**
        • 七、总结

【操作系统】什么是缺页中断(缺页中断详解)

一、缺页中断的本质与背景
1. 虚拟内存与分页机制

现代操作系统(如Windows/Linux)为每个进程分配独立的虚拟地址空间,通过分页机制将虚拟地址映射到物理内存。

  • 页(Page):虚拟内存和物理内存的最小划分单位(通常为4KB、8KB等)。
  • 页表(Page Table):存储虚拟页到物理页的映射关系,由硬件(MMU,内存管理单元)查询。
2. 缺页中断的定义

当进程访问的虚拟地址对应的虚拟页未加载到物理内存时,操作系统会触发缺页中断(Page Fault),其核心作用:

  • 通知操作系统加载缺失的页到物理内存,建立虚拟地址与物理地址的映射。
  • 保证进程继续执行,无需修改程序逻辑(对应用层透明)。

关键点:缺页中断是一种异步中断,属于操作系统内核处理的异常事件,与CPU硬件紧密协作。

二、缺页中断的触发场景
1. 首次访问新分配的虚拟页

进程通过malloc等函数分配内存时,操作系统仅创建虚拟页表项,未分配物理页。首次访问该地址时触发缺页中断,分配物理页并建立映射。

2. 内存置换导致的页缺失

当物理内存不足时,操作系统会将长时间未访问的页置换到磁盘(如Linux的Swap分区)。后续再次访问该页时触发缺页中断,从磁盘重新加载。

3. 访问权限冲突
  • 虚拟页表项标记为“不可读/写/执行”,但进程尝试访问(如向只读页写入数据),此时触发的缺页中断会被判定为访问错误,导致进程崩溃(如段错误)。
4. 页表项无效

页表项未正确初始化(如未分配物理页帧),或因内核错误导致映射关系失效,访问时触发缺页中断。

三、缺页中断处理流程(内核视角)

在这里插入图片描述

  1. 硬件捕获中断

    • CPU访问虚拟地址时,MMU查询页表发现页未加载(页表项的“存在位”为0),触发缺页中断,将控制权转交操作系统内核。
  2. 保存进程上下文

    • 内核保存当前进程的寄存器状态、程序计数器(PC)等信息,以便中断处理完成后恢复执行。
  3. 判断缺页类型

    • 合法缺页:页属于进程地址空间,但未加载(如首次访问、置换到磁盘)。
    • 非法缺页:页不属于进程地址空间(如访问越界)或权限不符,触发段错误(Segmentation Fault),终止进程。
  4. 分配物理页帧

    • 若为合法缺页,内核从空闲页帧列表或**交换空间(Swap)**分配物理页:
      • 从磁盘加载:若页存在于磁盘(如可执行文件、数据文件),读取对应磁盘块到物理页。
      • 从Swap恢复:若页之前被置换到Swap,将其重新加载到物理内存。
  5. 更新页表映射

    • 内核修改页表项,设置“存在位”为1,填入物理页帧号、访问权限等信息,并通知MMU更新TLB(转换后援缓冲器,加速地址转换)。
  6. 恢复进程执行

    • 内核恢复进程上下文,CPU重新执行引发缺页的指令,此时虚拟地址已映射到物理页,访问成功。
四、缺页中断与性能影响
1. 缺页率与系统性能
  • 缺页率:访问虚拟地址时触发缺页中断的概率,计算公式:
    缺页率 = 缺页次数 / 总访问次数
    
  • 影响
    • 低缺页率(<1%):系统性能良好,内存分配合理。
    • 高缺页率(>5%):频繁磁盘I/O导致系统卡顿,可能出现颠簸(Thrashing)——内存与磁盘间大量数据交换,CPU利用率骤降。
2. 减少缺页中断的策略
  1. 合理使用内存
    • 避免申请过大内存(如预分配适量缓冲区,而非一次性分配巨型数组)。
  2. 优化页面置换算法
    • 采用LRU(最近最少使用)、LFU(最不常用)等算法,优先置换未来访问概率低的页。
  3. 增大物理内存或Swap空间
    • 为服务器增加内存,或调整Swap分区大小(Linux可通过swappiness参数控制页置换倾向)。
  4. 程序局部性优化
    • 利用空间局部性(访问相邻地址)和时间局部性(重复访问同一数据),如缓存热点数据、减少跨页访问。
五、缺页中断与其他中断的区别
维度缺页中断时钟中断键盘中断
触发者硬件(MMU)硬件(时钟芯片)外设(键盘控制器)
异步性与指令执行异步(访问内存时)周期性异步触发异步(用户输入时)
处理方式内核自动处理,对用户透明内核调度器处理(如进程切换)用户空间程序响应(如终端输入)
影响范围单个进程地址空间全局(所有进程)特定进程(如当前前台程序)
六、实战分析:Linux下查看缺页中断
1. 查看系统缺页统计
# 查看/proc文件系统中的统计信息
cat /proc/vmstat | grep page
  • 关键字段
    • maj_flts主缺页中断(需要从磁盘加载页,耗时较长)。
    • min_flts次缺页中断(页已在物理内存,但页表项未更新,如TLB失效,耗时较短)。
2. 分析进程缺页情况
# 查看进程PID的缺页次数
ps -p <PID> -o maj_flt,min_flt
  • 主缺页高的可能原因
    • 进程内存使用超过物理内存,频繁触发Swap交换。
    • 程序存在内存泄漏,导致可用内存不足。
3. 案例:大数组访问引发的缺页中断
// C++示例:访问大数组,触发缺页中断
#include <vector>
int main() {const int SIZE = 1024 * 1024; // 4MB(假设页大小4KB,共1024页)std::vector<int> arr(SIZE);for (int i = 0; i < SIZE; ++i) {arr[i] = i; // 首次访问每个元素时触发缺页中断}return 0;
}
  • 现象:首次循环时,每个元素的访问都会触发次缺页中断(页表项更新),但因页未被置换,无主缺页中断。
七、总结
  • 缺页中断是虚拟内存系统的核心机制,通过动态加载页实现内存的高效利用。
  • 主缺页中断代价高昂(涉及磁盘I/O),需通过优化内存使用、置换算法等降低其频率。
  • 理解缺页中断原理有助于分析内存性能问题(如系统卡顿、进程崩溃),是操作系统调优的重要基础。

参考资料

  • 《操作系统概念》(Operating System Concepts)第9章
  • Linux内核文档:Memory Management
  • Intel/AMD架构手册:内存管理单元(MMU)章节

(本文案例可通过Linux的strace工具追踪缺页中断,或使用Valgrind分析内存访问模式。)


http://www.hkcw.cn/article/vmeFOZTvyW.shtml

相关文章

2025——》VSCode Windows 最新安装指南/VSCode安装完成后如何验证是否成功?2025最新VSCode安装配置全攻略

1.VSCode Windows 最新安装指南: 以下是 2025 年 Windows 系统下安装 Visual Studio Code(VSCode)的最新指南,结合官方文档与实际操作经验整理而成: 一、下载官方安装包: 1.访问官网: 打开浏览器,进入 VSCode 官方下载页面https://code.visualstudio.com/Download 2…

终结电源反接与压降损耗:理想二极管控制器深度解析

理想二极管控制器驱动外部 NMOS实现超低正向压降和可防反向电流特性&#xff0c;广泛应用在有大电流高功率、电源输入防反需求场景中。那理想二极管控制IC内部到底是怎么工作的&#xff0c;怎么实现这些特性的呢&#xff1f;本文以LM74700-Q1为例介绍尝试解答上述问题。 一 理…

开源版 PyMOL 如何绘制 新冠病毒 分子结构?

参阅&#xff1a;用生物知识解读“新冠病毒”&#xff0c; 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 先从 www.python.org…

PyTorch——DataLoader的使用

batch_size, drop_last 的用法 shuffle shuffleTrue 各批次训练的图像不一样 shuffleFalse 在第156step顺序一致

【前端】CSS面试八股

网上现有资料已经很丰富了&#xff0c;我挑了些自己押面试题时总结过的来写。 Q&#xff1a;回流和重绘 A&#xff1a; 回流reflow&#xff1a;计算元素的几何&#xff0c;引发layout重绘repaint&#xff1a;更新元素可见样式&#xff0c;引发paint 回流的成本比重绘高得多&…

【笔记】在 MSYS2(MINGW64)中安装 python-maturin 的记录

#工作记录 &#x1f4cc; 安装背景 操作系统&#xff1a;MSYS2 MINGW64当前时间&#xff1a;2025年6月1日Python 版本&#xff1a;3.12&#xff08;通过 pacman 安装&#xff09;目标工具&#xff1a;maturin —— 用于构建和发布 Rust 编写的 Python 包 &#x1f6e0;️ 安装…

华为IP(7)

端口隔离技术 产生的背景 1.以太交换网络中为了实现报文之间的二层隔离&#xff0c;用户通常将不同的端口加入不同的VLAN&#xff0c;实现二层广播域的隔离。 2.大型网络中&#xff0c;业务需求种类繁多&#xff0c;只通过VLAN实现二层隔离&#xff0c;会浪费有限的VLAN资源…

JS基础内容1

JS基础内容1目录 打印方式关联方式延迟加载变量声明数组对象补充&#xff1a;json格式 函数函数的分类函数在对象和数组中的使用函数的交互调用 打印方式 1、弹窗打印 alert(arr) 2、控制台打印 console.log() 以 html 的形式打印 console.dir() 将 document 当成 对象 打印 …

高考报名人数8年来首降背后 教育需求变化探因

教育部近日公布,今年高考报名人数为1335万人,比去年的1342万略微下降7万人,这是自2018年以来首次出现下降。2025年高考考生主要对应的是2006年和2007年的新生儿。2007年出生人口数量为1594万,比2006年增长了10万,但为何考生数量会下降呢?这不能简单以数字对比来解释。例如…

数据库安全性

一、计算机安全性概论 &#xff08;一&#xff09;核心概念 数据库安全性&#xff1a;保护数据库免受非法使用导致的数据泄露、更改或破坏&#xff0c;是衡量数据库系统的关键指标之一&#xff0c;与计算机系统安全性相互关联。计算机系统安全性&#xff1a;通过各类安全保护…

【C++】string类

1. 标准库中的string类 1.1 string类 string类的文档介绍 在 使用 string 类时&#xff0c;必须包含 #include 头文件以及 using namespace std ; 1.2 auto和范围for auto 关键字 在早期C/C 中 auto 的含义是&#xff1a;使用 auto 修饰的变量&#xff0c;是具有自动存储器…

Docker 在云环境中的部署:AWS/ECS 与 Azure/AKS 的实践对比

Docker 容器的出现极大地提升了应用程序的打包、交付和运行效率。然而,在面对高并发、高可用和大规模集群管理的生产环境时,将 Docker 容器部署到公有云平台成为了必然选择。公有云平台提供了强大的基础设施和托管服务,极大地简化了底层运维负担。 在众多云服务提供商中,A…

【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解

【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解 一、前言 LayaAir引擎是国内最强大的全平台引擎之一&#xff0c;当年H5小游戏火的时候&#xff0c;腾讯入股了腊鸭。我还在游戏公司的时候&#xff0c;17年曾经开发使用腊鸭的H5小游戏&#xff0c;很怀念当年和腊鸭同事一起解决…

理解解释器架构:原理、组成与运行机制全解析

目录 前言1. 什么是解释器架构2. 解释器的基本组成2.1 被解释执行的程序2.2 解释器引擎2.3 解释器内部状态2.4 程序执行的当前状态2.5 存储器模型 3. 解释器的工作原理3.1 解析源代码3.2 初始化运行环境3.3 逐条执行语法结构3.4 维护程序状态3.5 内存管理与变量作用域 4. 举例&…

SOD-123和SOD-123FL封装到底有什么区别?

目录 1. 封装结构与尺寸 2. 热性能 3. 电气特性 4. 应用场景 5. 兼容性与替代性 6.价格比较 大家好&#xff0c;我们硬件工程师经常用到SOD-123和SOD-123FL的封装&#xff0c;特别是二极管&#xff0c;比如二极管1N4007便有这两种封装。那么这两种封装两者到底有什么区别…

Apache IoTDB V2.0.3 发布|新增元数据导入导出脚本适配表模型功能

Release Announcement Version 2.0.3 Apache IoTDB V2.0.3 已经发布&#xff01; V2.0.3 作为树表双模型正式版本&#xff0c;主要新增元数据导入导出脚本适配表模型、Spark 生态集成&#xff08;表模型&#xff09;、AINode 返回结果新增时间戳&#xff0c;表模型新增部分聚…

NX753NX756美光科技闪存NX784NX785

技术解读与产品特性 美光科技的NX系列闪存&#xff0c;包括NX753、NX756、NX784、NX785等型号&#xff0c;代表了当前存储技术的前沿水平。这些产品基于先进的NAND闪存技术&#xff0c;采用业界领先的3D TLC NAND技术&#xff0c;实现了高速的数据读写能力。3D TLC NAND技术通…

go语言的GMP(基础)

1.概念梳理 1.1线程 通常语义中的线程&#xff0c;指的是内核级线程&#xff0c;核心点如下&#xff1a; &#xff08;1&#xff09;是操作系统最小调度单元&#xff1b; &#xff08;2&#xff09;创建、销毁、调度交由内核完成&#xff0c;cpu 需完成用户态与内核态间的切…

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群&#xff0c;容器信息&#xff1a; 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群&#xff1a; 文件内容&…

RTMP播放器谁更强?深入解析SmartPlayer与VLC、PotPlayer等方案的技术差异

在视频直播、安防监控、边缘计算、AI视觉识别等场景中&#xff0c;低延迟、高稳定的RTMP播放器SDK 是关键技术模块。虽然市面上存在VLC、PotPlayer等“看起来能播”的播放器&#xff0c;但真正能适用于生产环境&#xff0c;支持工程集成、多平台、复杂网络、实时反馈的专业RTMP…