我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是缺页错误Page Fault

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是缺页错误Page Fault

本篇内容主要讲解“什么是缺页错误Page Fault”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是缺页错误Page Fault”吧!

术语约定

  • VA:Virtual Address 虚拟地址

  • PA:Physical Address 物理地址

  • MMU:Memory Manage Unit 内存管理单元

  • TLB:Translation Lookaside Buffer 旁路快表缓存/地址变换高速缓存

  • PTE:Page Table Entry 分页表项

内存的惰性分配

以32位的Linux系统为例,每个进程独立拥有4GB的虚拟地址空间,根据局部性原理没有必要也不可能为每个进程分配4GB的物理地址空间。

64位系统也是一样的道理,只不过空间寻址范围大了很多很多倍,进程的虚拟地址空间会分为几个部分:

什么是缺页错误Page Fault

实际上只有程序运行时用到了才去内存中寻找虚拟地址对应的页帧,找不到才可能进行分配,这就是内存的惰性(延时)分配机制。

什么是缺页错误Page Fault

对于一个运行中的进程来说,不是所有的虚拟地址在物理内存中都有对应的页,如图展示了部分虚拟地址存在对应物理页的情况:

什么是缺页错误Page Fault

虚拟地址空间根据固定大小一般是4KB进行划分,物理内存可以设置不同的页面大小,通常物理页大小和虚拟页大小是一样的,本文按照物理页4KB大小展开。

经过前面的分析,我们将面临一个问题:如何将虚拟地址准确快速地映射到物理页呢?

>>>高能预警 敲黑板 本段小结<<<

  • 1. Linux的虚拟地址空间就是空头支票,看着很大但是实际对应的物理空间只有很少的一部分。

  • 2.内存的惰性分配是个有效的机制,可以保证内存利用率和服务器利用率,是资源合理配置的方法。

  • 3.大量的虚拟地址到物理地址的快速准确地查询转换是一个难题。

CPU如果获取内存中的数据

CPU并不直接和物理内存打交道,而是把地址转换的活外包给了MMU,MMU是一种硬件电路,其速度很快,主要工作是进行内存管理,地址转换只是它承接的业务之一。

什么是缺页错误Page Fault

一起看看MMU是如何搞定地址转换的。

MMU和Page Table

每个进程都会有自己的页表Page  Table,页表存储了进程中虚拟地址到物理地址的映射关系,所以就相当于一张地图,MMU收到CPU的虚拟地址之后开始查询页表,确定是否存在映射以及读写权限是否正常,如图:

什么是缺页错误Page Fault

对于4GB的虚拟地址且大小为4KB页,一级页表将有2^20个表项,页表占有连续内存并且存储空间大,多级页表可以有效降低页表的存储空间以及内存连续性要求,但是多级页表同时也带来了查询效率问题。

什么是缺页错误Page Fault

我们以2级页表为例,MMU要先进行两次页表查询确定物理地址,在确认了权限等问题后,MMU再将这个物理地址发送到总线,内存收到之后开始读取对应地址的数据并返回。

什么是缺页错误Page Fault

MMU在2级页表的情况下进行了2次检索和1次读写,那么当页表变为N级时,就变成了N次检索+1次读写。

可见,页表级数越多查询的步骤越多,对于CPU来说等待时间越长,效率越低,这个问题还需要优化才行。

>> 本段小结 敲黑板 划重点 <<

  • 1.页表存在于进程的内存之中,MMU收到虚拟地址之后查询Page Table来获取物理地址。

  • 2.单级页表对连续内存要求高,于是引入了多级页表,但是多级页表也是一把双刃剑,在减少连续存储要求且减少存储空间的同时降低了查询效率。

MMU和TLB的故事

MMU和TLB的故事就这样开始了...

CPU觉得MMU干活虽然卖力气,但是效率有点低,不太想继续外包给它了,这一下子把MMU急坏了。

MMU于是找来了一些精通统计的朋友,经过一番研究之后发现CPU用的数据经常是一小搓,但是每次MMU都还要重复之前的步骤来检索,害,就知道埋头干活了,也得讲究方式方法呀!

找到瓶颈之后,MMU引入了新武器,江湖人称快表的TLB,别看TLB容量小,但是正式上岗之后干活还真是不含糊。

什么是缺页错误Page Fault

当CPU给MMU传新虚拟地址之后,MMU先去问TLB那边有没有,如果有就直接拿到物理地址发到总线给内存,齐活。

TLB容量比较小,难免发生Cache Miss,这时候MMU还有保底的老武器页表 Page  Table,在页表中找到之后MMU除了把地址发到总线传给内存,还把这条映射关系给到TLB,让它记录一下刷新缓存。

什么是缺页错误Page Fault

TLB容量不满的时候就直接把新记录存储了,当满了的时候就开启了淘汰大法把旧记录清除掉,来保存新记录,彷佛完美解决了问题。

在TLB和Page Table加持之下,CPU感觉最近MMU比较给力了,就问MMU怎么做到的?MMU就一五一十告诉了CPU。

CPU说是个不错的路子,随后说出了自己的建议:TLB还是有点小,缓存不命中也是经常发生的,要不要搞个大的,这样存储更多访问更快?

MMU一脸苦笑说道大哥TLB很贵的,要不你给涨点外包费?话音未落,CPU就说涨工资是不可能了,这辈子都不可能了。

>>>高能预警 敲黑板 本段小结<<<

1. CPU要根据用户进程提供的虚拟地址来获取真实数据,但是它并不自己做而是交给了MMU。

2. MMU也是个聪明的家伙,集成了TLB来存储CPU最近常用的页表项来加速寻址,TLB找不到再去全量页表寻址,可以认为TLB是MMU的缓存。

3. TLB的容量毕竟有限,为此必须依靠Page Table一起完成TLB Miss情况的查询,并且更新到TLB建立新映射关系。

缺页异常Page Fault大揭秘

设想CPU给MMU的虚拟地址在TLB和Page Table都没有找到对应的物理页帧或者权限不对,该怎么办呢?

没错,这就是缺页异常Page Fault,它是一个由硬件中断触发的可以由软件逻辑纠正的错误。

 PageFault,它来了

假如目标内存页在物理内存中没有对应的页帧或者存在但无对应权限,CPU 就无法获取数据,这种情况下CPU就会报告一个缺页错误。

由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault  Handler 处理。

什么是缺页错误Page Fault

缺页异常并不可怕,只要CPU要的虚拟地址经过MMU的一番寻址之后没有找到或者找到后无权限,就会出现缺页异常,因此触发异常后的处理流程将是重点内容。

 缺页错误的分类处理

缺页中断会交给PageFaultHandler处理,其根据缺页中断的不同类型会进行不同的处理:

  • Hard Page Fault

也被称为Major Page  Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的页帧,需要CPU打开磁盘设备读取到物理内存中,再让MMU建立VA和PA的映射。

  • Soft Page Fault

也被称为Minor Page  Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。

  • Invalid Page Fault

翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报segment fault错误中断进程直接挂掉。

什么是缺页错误Page Fault

 缺页错误出现的原因

不同类型的Page Fault出现的原因也不一样,常见的几种原因包括:

  • 非法操作访问越界

这种情况产生的影响也是最大的,也是Coredump的重要来源,比如空指针解引用或者权限问题等都会出现缺页错误。

  • 使用malloc新申请内存

malloc机制是延时分配内存,当使用malloc申请内存时并未真实分配物理内存,等到真正开始使用malloc申请的物理内存时发现没有才会启动申请,期间就会出现Page  Fault。

  • 访问数据被swap换出

物理内存是有限资源,当运行很多进程时并不是每个进程都活跃,对此OS会启动内存页面置换将长时间未使用的物理内存页帧放到swap分区来腾空资源给其他进程,当存在于swap分区的页面被访问时就会触发Page  Fault从而再置换回物理内存。

>>> 敲黑板 划重点 本段小结:<<<

触发Page Fault的原因可能有很多,归根到底也只有几种大类:

1. 如使用共享内存区域,没有存储VA->PA的映射但是存在物理页帧的软缺页错误,在Page Table/TLB中建立映射关系即可。

2.  访问的地址在物理内存中确实不存在,需要从磁盘/swap分区读入才能使用,这种性能影响会比较大,因为磁盘太慢了,尽量使用高性能的SSD来降低延时。

3. 访问的地址内存非法,缺页错误会升级触发SIGSEGV信号结束进程,这种属于可以导致进程挂掉的一种缺页错误。

什么是缺页错误Page Fault

到此,相信大家对“什么是缺页错误Page Fault”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是缺页错误Page Fault

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

手机网页错误101指的是什么意思

这篇文章给大家分享的是有关手机网页错误101指的是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。错误101在微软Internet Explorer存在的意义是404或者403,如果使用Internet E
2023-06-20

oracle中12154错误是什么

Oracle中的12154错误是指TNS解析器无法解析给定的服务名或连接描述符。这个错误通常发生在尝试连接到Oracle数据库时,而数据库的连接信息无法正确识别或解析。这个错误可能有多种原因,包括:1. 无效的服务名或连接描述符:请确保使用
2023-08-24

php中302是什么错误

在php中,302不是错误,而是HTTP响应状态码,意思为“临时重定向”,表示被访问页面因为各种需要被临时跳转到其他页面;可利用header()来实现302跳转,语法“header('Location: 跳转url',true,302)”。
2020-11-05

java中的错误是什么

在Java中,根据错误性质将运行错误分为两大类:错误和异常。 (推荐学习:java课程)Java中的所有异常都是由Throwable类的子类生成的对象,所有的异常类都是Throwable类的子类或子类的子类。Throwable类是Obj
java中的错误是什么
2021-08-15

golang错误是什么意思

golang错误是一个特殊的类型,用于表示函数执行期间可能发生的问题或异常情况,当函数无法正常执行时,可能会返回一个错误对象作为函数的结果,错误对象通常包含一个描述错误的字符串,以及其他属性,如错误代码或错误源。本文操作环境:Windows
2023-07-19

PHP页面静态化的优缺点是什么

这篇文章主要介绍“PHP页面静态化的优缺点是什么”,在日常操作中,相信很多人在PHP页面静态化的优缺点是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP页面静态化的优缺点是什么”的疑惑有所帮助!接下来
2023-07-05

网页设计中7个令人抓狂的错误是什么

这期内容当中小编将会给大家带来有关网页设计中7个令人抓狂的错误是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。所有人都知道网页设计的重要性,糟糕的网页设计会给用户带来糟糕的体验,从而影响网页的流量,或
2023-06-10

List列表标签和Page分页标签的通用参数是什么

这篇“List列表标签和Page分页标签的通用参数是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“List列表标签和Pa
2023-06-26

go语言eof错误是什么

在go语言中,eof是指文件结尾错误,是Go语言中最重要的错误变量,存在于io包中,用于表示输入流的结尾。因为每个文件都有一个结尾,所以“io.EOF”很多时候并不能算是一个错误,它更重要的是表示一个输入流结束了。
2023-05-14

oracle错误3114是什么问题

oracle错误3114是Oracle客户端无法与服务器进行通信的问题,解决方法:1、检查网络配置,确认网络连接正常;2、检查防火墙设置,确保允许客户端访问服务器的端口;3、检查监听器的状态,确保它正在运行,并且配置正确;4、检查数据库实例
2023-07-10

linux中500错误指的是什么

这篇文章主要讲解了“linux中500错误指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中500错误指的是什么”吧!在linux中,500错误指的是“500 Intern
2023-07-02

网页设计人员应该注意的Web设计错误是什么

这篇文章的内容主要围绕网页设计人员应该注意的Web设计错误是什么进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!1. 用户必须在几秒钟知道网站是做什么
2023-06-08

php中401错误指的是什么

本文小编为大家详细介绍“php中401错误指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“php中401错误指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。PHP 401错误码是指服务器拒绝访问
2023-07-05

php执行错误是什么意思

php执行错误表示php程序执行提示错误,其解决办法就是检查出错行上是否存在输出,然后在index.php的头部执行“error_reporting(0);”即可。
2014-10-20

springmvc错误处理机制是什么

这篇“springmvc错误处理机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springmvc错误处理机制是什么
2023-06-17

php.ini详细错误指的是什么

这篇文章主要讲解了“php.ini详细错误指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php.ini详细错误指的是什么”吧!PHP ini详细错误是一种配置错误,通常会在服务器上
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录