news 2026/7/2 4:36:57

页命中与缺页

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
页命中与缺页

我们在上篇文章什么是内存(一):存储器层次结构中说过缓存命中与不命中的问题,都是缓存思想,在这里肯定也会存在同样的问题。并且磁盘与主存之间的缓存不命中代价肯定大的多。因为L0-L4之间,每级缓存的速度大约相差10倍左右,但是L4主存与L5磁盘之间,它们的速度相差约十万倍。所以主存与磁盘之间交换的页容量是最大的,尽可能的增加命中率。相应的替换策略,操作系统也使用了更加复杂精密的算法。

在上篇文章什么是内存(一):存储器层次结构,每次替换的区域,我们用了块(block),而这里我们却在说页(page), 其实同一个意思。只是因为历史原因,叫法不同罢了。

当CPU想要读取包含在某个虚拟页的内容时,如果该页已经缓存在主存中,也就是页命中。perfect,很完美。但是如果该页没有缓存在主存中,则我们称之为缺页(page fault)

图15:对VP3中的字的应用会引起不命中

如上图所示,CPU 引用了 VP3 中的内容, VP3 并未缓存在主存中。系统从内存中读取 PTE3,得知 VP3 未被缓存,这会触发了一个缺页异常。缺页异常会调用kernel的缺页异常处理程序,该程序会选择一个牺牲页。如下图所示,牺牲页选择了存放在 PP3 中的 VP4。


图16:VP4被牺牲了

此时如果 VP4 的内容被修改了,kernel会将它复制回磁盘。接下来,kernel从磁盘赋值 VP3 到内存中的 PP3并更新 PTE3。随后返回用户进程。当异常处理程序返回时,它会重启执行导致缺页的指令,当重新执行这条指令时,因为 VP3 已经在主存中了,此时就是页命中了。

图17:VP3被缓存到PP3

根据习惯性的叫法,我们在磁盘和内存之间传送页的活动叫做交换(swapping)或者页面调度(paging)。这种交换活动,只有当不命中发生时才会发生,(也就说,系统并不会将磁盘内容预存到内存中)。这种策略被称之为按需页面调度(demand paging)

我们刚才说,缺页错误是一种异常,但是实际上,在计算机系统中,被0除,读写文件,还有上篇文章中我们所说的中断(interrupt),甚至包括我们代码中写的try catch,都是一种异常。 比如被0除是intel 的CPU规定的的第0号故障(fault)类型的异常。而读写文件,分别是linux规定的第0号和第1号陷阱(trap)类型的异常。多任务的上下文切换,进程的创建回收等,等与系统中这种异常流的处理密切相关。当然,这是另外一个话题了。我们在这里不做累述。

虚拟内存作为内存管理和内存保护的工具

理所当然的,每个进程都有一个独立的页表和一个独立的虚拟地址空间

回到文章开头的问题,比如每个C程序都要调用的stdio这个库,不可能为每个进程都添加一份库,内存中只有一份stdio库的内容,供每个使用该库的进程共享。

图18:共享页面

如上图所示: 第一个进程的的页表将 VP2 映射到 某个物理页面。而第二个进程同样将它的 VP2 映射到 该物理页面。所以该物理页面都被两个进程共享了。

此时,大家再看一下"图:12 进程地址空间",就会发现在地址空间当中,"共享库的内存映射区域"对于每个进程起始地址都是相同的。再想想进程之间共享内存的通信方式, 所以说虚拟内存简化了共享机制

大家知道,C语言中存在指针,可以直接进行内存操作。因为有了虚拟内存,所以我们的指针操作也不会访问到其他进程的区域,但是哪怕是对于自己的地址空间,很多内存区域也应该是禁止访问的,这不仅包括kernel的区域,也包括自己的只读代码段。那么虚拟内存就提供了这样的一种内存保护工具。

地址翻译机制可以使用一种自然的方式来提供内存的访问控制。PTE 上添加一些额外的控制位来添加权限。每次 CPU 生成一个地址时,地址翻译硬件都会读一个 PTE 。

图19:虚拟内存提供内存保护

在上图中,每个 PTE 额外添加了三个控制位, SUP 位表示进程是否必须运行内核模式,READ和WRITE位分别控制页面的读写权限。如果有指令违反了这些控制权限,那么 CPU 会触发一个故障,并将控制传递给内核中的异常处理程序。该种异常一般称为段错误(segmentation fault)

段 和 页

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 4:35:32

移动端AI落地实战:从模型部署到商业验证的完整链路

1. 这不是未来科技,是今天你手机里正在呼吸的“智能器官”你刚用美团点完一杯冰美式,三分钟后骑手已出现在楼下;你划开小红书,首页刷出的穿搭笔记,像懂你衣柜里那件白衬衫的旧友;你对着微信语音输入框说“转…

作者头像 李华
网站建设 2026/7/2 4:34:30

Java毕业设计-基于 SpringBoot 的医院住院部综合管理系统的设计与实现 基于 SpringBoot 的住院患者病房管控系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/2 4:34:13

以下是C# 7.0至C# 14.0中类型系统新增或增强的主要内容:

C# 版本新增/增强内容发布年份描述7.0值元组(Value Tuples)2017轻量级数据结构,支持多值返回和解构7.2Span, ReadOnlySpan, 只读结构, 引用结构2017高性能内存操作和不可变/栈分配结构体8.0可空引用类型, Memory, ReadOnlyMemory2019空值安全…

作者头像 李华
网站建设 2026/7/2 4:33:24

网关实现机房动环设备SNMP转Modbus协议转换项目案例

一、项目背景1.1 项目概况某数据中心机房需要对机房动环设备进行集中监控管理。现场部署了多台精密空调、UPS电源、温湿度传感器、漏水检测器等动环设备,这些设备均支持SNMP协议进行数据采集。然而,客户的上位监控平台(SCADA系统)…

作者头像 李华
网站建设 2026/7/2 4:31:58

基于 ResNet50 迁移学习实现人脸考勤系统(完整 Kaggle Notebook 工程)

目录 摘要 一、项目整体架构与设计思路 1.1 系统模块拆分 1.2 技术选型优势 二、环境初始化与数据集解析 2.1 环境依赖与中文绘图配置 2.2 数据集结构解析 2.3 全局常量定义 三、人脸预处理:OpenCV 人脸裁剪与数据增强 3.1 人脸检测裁剪函数extract_face …

作者头像 李华