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

news2025/6/3 11:23:06

文章目录

      • 【操作系统】什么是缺页中断(缺页中断详解)
        • 一、缺页中断的本质与背景
          • 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.coloradmin.cn/o/2395579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【echarts】仪表盘

<div style"width:50%;height:33%"><Yibiaopan echart_id"ybpChart2" :series_data"gaugeData2" title"火电" unit"MWh" :colorList"[#DFA58F,#F89061,#FF8E59]" /></div> 链接&#xff1a;ht…

java27

1.IO流 FileOutPutStream字节输出流基本用法&#xff1a; 一次性写入一个字符串的内容&#xff1a; 注意&#xff1a;\r或者\n表示把普通的r或者n的字符转义成回车的意思&#xff0c;所以不需要\\ FileInputStream字节输入流基本用法 -1在ASCII码里面对应的符号&#xff1a; 不…

OpenFeign和Gateway集成Sentinel实现服务降级

目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…

CS144 - LAB0

CS144 - Lab 0 telnet 发送请求 如图&#xff0c;很简单&#xff0c;但是注意输入时间太久会超时 发邮箱 首先我们需要用命令行去发邮箱&#xff0c;这里我用企业微信邮箱给自己的 qq 邮箱发送~ 整个命令如下&#xff01; 对于其中的参数&#xff0c;其实从英文就可以看出来…

论文浅尝 | 将复杂知识图谱问答对齐为约束代码生成(COLING2025)

笔记整理&#xff1a;康家溱&#xff0c;东南大学在读硕士&#xff0c;研究方向为代码大语言模型 论文链接&#xff1a;https://aclanthology.org/2025.coling-main.267.pdf 发表会议&#xff1a;COLING 2025 1. 动机 近年来&#xff0c;随着大语言模型&#xff08;LLM&#xf…

Golang|分布式搜索引擎中所使用到的设计模式

迭代器模式 定义&#xff1a;在遍历接口时&#xff0c;提供统一的方法函数供调用&#xff0c;保持一致性。核心思想&#xff1a;与大众习惯保持一致&#xff0c;方便第三方实现容器类时保持一致。常见方法&#xff1a;如next()方法&#xff0c;适用于所有集合类&#xff0c;简化…

Ubuntu22.04通过命令行安装qt5

环境&#xff1a; VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤&#xff1a; 安装好虚拟机进入shell&#xff0c;或通过ssh登录&#xff0c;确保虚拟机能上外网&#xff0c;执行命令&#xff1a; sudo apt update sudo apt install build-essential sudo snap in…

STM32:ESP8266 + MQTT 云端与报文全解析

知识点1【MQTT的概述】 1、概述 MQTT是一种基于发布/订阅模式的轻量级应用层协议&#xff0c;运行在TCP/IP协议之上&#xff0c;专用物联网&#xff08;IoT&#xff09;和机器对机器&#xff08;M2M&#xff09;设计&#xff0c;其核心目标是低带宽&#xff0c;高延迟或不稳定…

HTML5 Canvas 星空战机游戏开发全解析

HTML5 Canvas 星空战机游戏开发全解析 一、游戏介绍 这是一款基于HTML5 Canvas开发的2D射击游戏&#xff0c;具有以下特色功能&#xff1a; &#x1f680; 纯代码绘制的星空动态背景✈️ 三种不同特性的敌人类型&#x1f3ae; 键盘控制的玩家战机&#x1f4ca; 完整的分数统…

箱式不确定集

“箱式不确定集&#xff08;Box Uncertainty Set&#xff09;”可以被认为是一种 相对简单但实用的不确定集建模方式。 ✅ 一、什么是“简单的不确定集”&#xff1f; 在鲁棒优化领域&#xff0c;“简单不确定集”通常指的是&#xff1a; 特点描述形式直观数学表达简洁&#…

内存管理 : 04段页结合的实际内存管理

一、课程核心主题引入 这一讲&#xff0c;我要给大家讲的是真正的内存管理&#xff0c;也就是段和页结合在一起的内存管理方式。之前提到过&#xff0c;我们先学习了分段管理内存的工作原理&#xff0c;知道操作系统采用分段的方式&#xff0c;让用户程序能以分段的结构进行编…

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…

Redis最佳实践——性能优化技巧之集群与分片

Redis集群与分片在电商应用中的性能优化技巧 一、Redis集群架构模式解析 1. 主流集群方案对比 方案核心原理适用场景电商应用案例主从复制读写分离数据冗余中小规模读多写少商品详情缓存Redis Sentinel自动故障转移监控高可用需求场景订单状态缓存Redis Cluster原生分布式分片…

常见相机的ISP算法

常见的ISP算法 3A算法 去雾算法 图像增强算法 图像宽动态算法 图像的电子缩放算法&#xff0c;无极电子缩放 图像降噪算法 相机常见问题 1.相机启动速度问题&#xff0c;启动速度较慢 2.相机扛不住高低温问题 3.相机散热问题问题 4.相机高低温芯片保护掉电 5.相机的成像效果或者…

2024 CKA模拟系统制作 | Step-By-Step | 8、题目搭建-创建 Ingress

目录 ​​​​​​免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、核心考点 Ingress 资源定义 Ingress Controller 依赖 服务暴露验证 网络层次关系 三、搭建模拟环境 1.创建命名空间 2.安装ingress ingress-nginx-controller 3.创建hello.yaml并部署 四、总结 …

OldRoll复古胶片相机:穿越时光,定格经典

在数字摄影盛行的今天&#xff0c;复古胶片相机的独特魅力依然吸引着无数摄影爱好者。OldRoll复古胶片相机这款软件&#xff0c;以其独特的复古风格和丰富的胶片滤镜效果&#xff0c;让用户仿佛穿越回了那个胶片摄影的黄金时代。它不仅模拟了胶片相机的操作界面&#xff0c;还提…

通俗易懂的 JS DOM 操作指南:从创建到挂载

目录 &#x1f9e9; 1. 创建元素&#xff1a;document.createElement / createElementNS &#x1f4dd; 2. 创建文本&#xff1a;document.createTextNode ✏️ 3. 修改文本&#xff1a;node.nodeValue &#x1f5d1;️ 4. 移除元素&#xff1a;el.removeChild() &#x1…

CSS Day07

1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 &#xff08;1&#xff09;Favicon图标 &#xff08;2&#xff09;版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…

RV1126-OPENCV 交叉编译

一.下载opencv-3.4.16.zip到自己想装的目录下 二.解压并且打开 opencv 目录 先用 unzip opencv-3.4.16.zip 来解压 opencv 的压缩包&#xff0c;并且进入 opencv 目录(cd opencv-3.4.16) 三. 修改 opencv 的 cmake 脚本的内容 先 cd platforms/linux 然后修改 arm-gnueabi.to…

【深度学习】 19. 生成模型:Diffusion Models

Diffusion Models Diffusion Models 简介 Diffusion 模型是一类通过逐步添加噪声并再逆向还原的方式进行图像生成的深度生成模型。其基本流程包括&#xff1a; 前向过程&#xff08;Forward Process&#xff09;&#xff1a;将真实图像逐步加噪&#xff0c;最终变为高斯噪声…