大量的页面错误与内存碎片有什么关系?

时间:2015-10-09 10:33:19

标签: c++ windows memory-management page-fault

我想知道在页面错误中显示高数量(或系​​统中最高)的程序是否可以说是任务管理器或进程资源管理器,这是内存碎片的指示。有没有其他方法可以揭示这种问题? (内存碎片)。因此,运行时出现大量页面错误的程序可以来自不在RAM中的数据,但OS会频繁地从磁盘加载中断。可能的原因可能是内存碎片?我想知道这2件事是否相关

2 个答案:

答案 0 :(得分:1)

来自维基百科:

  

当程序试图访问当前未映射到物理内存(RAM)的页面时,将执行分页的主要功能。这种情况称为页面错误。然后,操作系统必须以程序不可见的方式控制并处理页面错误。因此,操作系统必须:

     

确定辅助存储中数据的位置。获得一个   RAM中的空页框架用作数据的容器。加载   请求的数据进入可用的页面框架。将页面表更新为   请参阅新的页面框架。将控制权返回给程序,   透明地重试导致页面错误的指令。

因此,我会说碎片通常与页面错误无关。后者表明RAM内存已满,而且这个特定程序比其他程序消耗更多内存,因此他在交换区域中有更多内存,因此每次他尝试访问已被OS换出的页面时发生故障,操作系统必须将此页面加载到RAM。

如果您使用单个进程试验此错误,那就是这样。如果您在观察所有过程中的相同问题,则表明Thrashing。在这种情况下,物理内存量不足以容纳所有正在运行的进程,因此虚拟内存子系统在分页上花费的时间要多得多。因此,进程没有进展,因为每次发生页面错误时,进程都会丢失CPU,并且必须等到RAM中的页面准备就绪。

当您的内存映射包含几个无法满足新预留的小块时,通常会发生碎片,因此进程开始要求更多内存以容纳它们。因此,在这种情况下的症状是,即使程序完成了一些应该分配动态内存,执行某些操作然后释放它的特定任务,内存或内存的使用量也没有释放到操作系统中。

答案 1 :(得分:0)

大量的页面错误往往是由对驻留内存的高需求引起的。内存碎片可能是居民记忆需求高的根本原因,但这不是我的第一个猜测。

也许问题只需要那么多常驻内存。

也许问题需要那么多的虚拟内存,但算法设计很差(访问的位置较差),因此对驻留内存的需求高于应有的。

可能程序编码很差,因此它使用的内存比它需要的多得多。

也许任务对驻留内存的需求是完全合理的(考虑到可用的物理内存),但是微软的脑死存储器管理算法正在产生压倒性的页面错误,这是没有充分理由的。

大多数页面错误都是"软"故障意味着实际上不需要磁盘活动。操作系统已将页面从任务中删除,而不将这些页面从物理RAM中删除,作为测试任务真正需要的页面的一种方法,其长期目标是保持该任务的工作集"从成长(微软滥用术语"工作集")。这是操作系统的所有必要和正确的行为。

但是,当任务需要快速返回这些页面时,您会遇到一个软错误,操作系统会将这些页面返回并取走其他页面,而不是意识到任务需要更高的总驻留内存并且有足够的物理内存容纳它。我见过许多情况,其中服务软故障的单线程内核CPU时间是长程序经过时间的90%或更多,而大多数机器的内存只是未使用。