很少被开发者关注的页面错误

今天我们会说说关于虚拟内存处理中最为常见的一个问题:页面错误(Page Fault)。

什么情况下会发生一个页面错误呢?
当应用程序请求的页面地址不在当前的内存驻留页面(Memory resident pages)时,就会发生页面错误。

当发生页面错误的时候,会发生什么?
发生页面错误的线程会被操作系统设置为挂起状态,而此时操作系统会尝试在磁盘上找到对应的页面并将此页面恢复到物理内存。

当一个线程尝试引用一个非驻留内存页面时,一个硬件中断会触发并导致应用程序的终止执行。引发页面错误的指令会产生一个地址访问异常,从而触发中断。内核中有一个中断服务例程(ISR, Interrupt Service Routine)会获得控制流,并判断出访问地址是有效的,但是访问地址所在的页面没有驻留在内存中。

接下来,操作系统会在页面文件中定位目标页面的一个拷贝,并将此页面从磁盘拷贝至内存中的一个空闲页面。一旦拷贝操作成功完成,则操作系统会允许上文中提到的挂起线程继续执行。

请注意:如果程序因为逻辑错误而访问一个无效的内存位置,则一个类似于页面错误的地址访问异常会被触发,同时也会引发一个硬件中断。这个时候,内存管理器(Memory Manager)的ISR会获取控制流来区分这两种不同的情况。

软页面错误和硬页面错误

区分软页面错误和硬页面错误,也十分重要。
当访问一个不在物理内存或内存映射文件(由应用程序进程创建)中的页面时,一个硬页面错误会被触发。
当系统内存不足或者发生了频繁的硬页面错误时,应用程序的性能会受到影响。所以,从操作系统的角度来看,尽可能迅速地从硬页面错误中恢复过来,从而不影响程序的运行时性能,就显得尤为重要。

另一方面,当访问一个驻留在别处的内存页面时,就会发生一个软页面错误。
举个例子,目标内存页面可能位于另一个进程的工作集中。软页面错误发生的另一种场景是:由于目标页面之前被使用,但它已经从进程的工作集中移除,或者,目标页面由于系统的Prefetch(性能优化组件)而成为驻留页面。

我们还需要快速回顾一下另外两个概念:系统文件缓存(System File Cache)和缓存错误(Cache Faults)。系统文件缓存使用虚拟内存管理器的功能来管理应用程序文件数据。它会映射文件到系统虚拟地址空间的一部分并使用进程的工作集机制来尽可能地保持当前文件在内存中的驻留。
缓存错误也是一种页面错误,当程序引用一个没有驻留在物理内存中的文件时,就会发生缓存错误。操作系统通过从磁盘或者网络中读取对应的文件数据来解决缓存错误。
在很多的文件服务中,文件缓存都大量使用了虚拟内存和物理内存。

最后,当研究和页面错误有关的问题时,区分硬页面错误还是软页面错误很重要。
在性能监视器中,页面错误计数值并没有区分这两种错误,所以,如果想要区分它们,需要做一些额外的工作。
以下几个计数器可以用来分析页面错误:
1) 内存页面错误/每秒
2) 内存缓存错误/每秒
3) 内存页面读取/每秒

前面两个计时器用来追踪工作集和文件系统缓存。页面读取可以用来追踪硬页面错误。
如果你观察到有大量的页面错误,同时伴随着大量的页面读取(也会显示在磁盘计数中),则当系统可用内存不足时就会出现应用程序或者整体计算性能降低的问题。

总结

尽量避免发生硬页面错误,尽量减少软页面错误(例如,频繁的进行堆内存的分配和释放)。

最后

本文来自:The Basics of Page Faults

pyqt5程序发生错误不中断_关于Windows页面错误的一些基础概念相关推荐

  1. sja1000 中断_[转载]SJA1000的错误中断处理

    SJA1000的错误处理好似还是比较复杂的的啦,下面是我自己的一些理解,有不对之处还请各位大虾多多指点啊! SJA1000的错误有: 仲裁丢失: 数据溢出: 总线错误: 错误状态有: 错误主动(Err ...

  2. grad在python什么模块_深度学习(Deep Learning)基础概念1:神经网络基础介绍及一层神经网络的python实现...

    此专栏文章随时更新编辑,如果你看到的文章还没写完,那么多半是作者正在更新或者上一次没有更新完,请耐心等待,正常的频率是每天更新一篇文章. 该文章是"深度学习(Deep Learning)&q ...

  3. 商城项目01 _电商系统基本模式、分布式基础概念、微服务架构图、微服务划分图

    文章目录 ①. 电商系统基本模式 ②. 分布式基础概念 ③. 微服务架构图详解 ④. 微服务划分图 ①. 电商系统基本模式 ①. B2C模式 就是我们经常看到的供应商直接把商品卖给用户,即" ...

  4. 第一个错误的版本_寻找第一个错误的版本

    第一个错误的版本 Problem statement: 问题陈述: Suppose that IncludeHelp turns to be a product company & we ha ...

  5. 程序固化到优盘中_将Windows 8/10 系统装进优盘

    介绍Windows To Go技术 Windows 有一项相当吸引人的神奇功能--"Windows To Go",它可以让你将 Windows 完整安装到U盘.移动硬盘等便携设备上 ...

  6. 文件夹错误 分配句柄_重启数据库遇到错误ORA27154,ORA27300,ORA27301,ORA27302

    作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,很高兴又和大家见面了 ...

  7. python核心理念_《三天搞定Python基础概念之第一天》中文版

    前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...

  8. learnpythonthehardway中文版_《三天搞定Python基础概念之第一天》中文版

    前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...

  9. yaw公式_坐标系和yaw, pitch, roll等基础概念

    坐标系 右手坐标系:把右手拇指食指中指伸直并正交,拇指X,食指Y,中指Z.一般无特殊说明,都是右手坐标系. 右手坐标系的旋转正方向:从轴的正方向看向原点,逆时针方向即是旋转正向.或者,伸出右手,拇指指 ...

最新文章

  1. 关于虚函数(多态)与继承的一道搜狗笔试题
  2. mate 10android o主题,Mate10不仅硬件强,还有安卓8.0
  3. python-time.time()
  4. 给大家推荐一款高大上的代码高亮插件(sublime,github风格)——highlight.js
  5. 解决鼠标滚动的时候多次执行函数
  6. linux 自学系列:touch 命令
  7. java Integer类的缓存(转)
  8. 驱动级鼠标模拟实现_双飞燕血手幽灵V8M Max电竞鼠标兼具功能和性价比
  9. POJ 1201 Intervals(差分约束)
  10. 树莓派安装各种Ubuntu版本及系统推荐
  11. 求一元二次方程的解法c语言,有什么方法求一元二次方程求解決一元二次方程的解法要详细...
  12. 论文阅读笔记:From Zero-Shot Learning to Cold-Start Recommendation
  13. android极光推送 小米,极光推送- 小米厂商通道集成指南 - 极光文档
  14. 在线文档协作进行项目管理
  15. javaGUl编程设计(大学生项目)
  16. IEEE802是什么?
  17. m35c android 4.4,透明带回来了!索尼中端“双雄”国内登场
  18. 新联邦业务数据湖为颠覆大数据应用铺路
  19. 如何给xp系统提速 怎样提高xp下载速度
  20. 语雀 —— 云端知识库

热门文章

  1. Ubuntu 14.04 64bit上玩转graphviz绘图工具
  2. Rocksdb 的优秀代码(一) -- 工业级分桶算法实现分位数p50,p99,p9999
  3. 设计模式 之美 --- 初篇
  4. Linux tcpdump命令详解与Wireshark
  5. CarTool 使用,获取图片资源
  6. oracle与mysql创建表时的区别
  7. ●洛谷P3688 [ZJOI2017]树状数组
  8. [NOI2011]Noi嘉年华
  9. Java中数组常见的几种排序方法!
  10. 通过API文档查询Math类的方法,打印出近似圆,只要给定不同半径,圆的大小就会随之发生改变...