大量的页面错误与内存碎片有任何关系
High number of page faults has any relation to memory fragmentation?
我想知道如果一个程序在任务管理器或进程资源管理器中显示大量(或系统中最高)页面错误,这是否是内存碎片的指示。还有其他方法可以揭示这类问题吗?(内存碎片)。因此,运行时出现大量页面错误的程序可能是由于数据不在RAM中,但操作系统经常中断从磁盘加载。一个可能的原因是内存碎片?我想知道这两件事是否相关
来源:维基百科:
分页的主要功能是在程序试图访问当前没有映射到物理内存(RAM)的页面时执行的。这种情况被称为页面错误。然后,操作系统必须以程序不可见的方式控制并处理页面错误。因此,操作系统必须:
确定数据在辅助存储器中的位置。获得一个RAM中的空页帧用作数据的容器。加载请求的数据放到可用的页框中。将页表更新为参考新的页面框架。将控制权交还给程序,透明地重试导致页面错误的指令。
因此,我认为碎片通常与页面错误无关。后者表明RAM内存已经满了,这个特定的程序比其他程序消耗更多的内存,所以他在交换区有更多的内存,所以每次他试图访问一个被操作系统交换出的页面时,就会发生页面错误,操作系统必须将这个页面加载到RAM中。
如果您在单个进程中试验此错误。如果你观察到相同的问题与所有的过程,这是鞭打的迹象。在这种情况下,物理内存量不足以容纳所有正在运行的进程,因此虚拟内存子系统在分页上花费的时间要多得多。因此,进程没有进展,因为每次发生页面错误时,进程都会失去CPU,必须等待,直到页面在RAM中准备好。
当你的内存映射包含几个不能满足新保留的小块,所以进程开始要求更多的内存来容纳它们时,通常会发生碎片。所以在这种情况下的症状是更高的内存使用或内存没有被释放到操作系统,即使程序已经完成了一些特定的任务,应该分配动态内存,做一些事情,然后释放它大量的页面错误往往是由对驻留内存的高需求引起的。内存碎片可能是对驻留内存的高需求的潜在原因,但这不是我的第一个猜测。
也许这个问题只是需要那么多驻留内存。
也许这个问题需要那么多的虚拟内存,但是算法设计得很差(访问的局域性差),所以对驻留内存的需求比应该的要高。
也许程序编码不好,所以它使用了比它需要的更多的内存。
也许任务对驻留内存的需求是完全合理的(考虑到可用的物理内存),但微软的脑死亡内存管理算法正在无缘无故地产生压倒性的页面错误。
大多数页面错误是"软"错误,这意味着实际上不需要磁盘活动。操作系统在没有从物理内存中移除这些页面的情况下从任务中移除页面,作为测试任务真正需要哪些页面的一种手段,其长期目标是保持任务的"工作集"不增长(微软误用了"工作集"这个术语)。对于一个操作系统来说,这是所有必要和正确的行为。
但是当任务需要快速返回这些页面时,您会遇到软故障,操作系统会返回这些页面并带走其他页面,而不是意识到任务需要更高的总驻留内存,并且有足够的物理内存来容纳它。我在很多情况下看到,处理软故障的单线程内核CPU时间是长程序运行时间的90%或更多,而机器的大部分ram都是闲置的。
- 尝试摆脱任何堆内存分配
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- c++ 编译器是否保护常量内存地址免受任何更改?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- 在嵌入式系统中读取文件的内存碎片
- 内存碎片会减慢新/malloc
- 最终的ARM Linux内存碎片与NEON Copy,但不是memcpy
- 内存碎片是否导致内存异常
- 是否有可能解决 CUDA 内存碎片问题
- 重新分配内存以避免内存碎片
- C++:这看起来像内存碎片吗
- 防止多态容器中的内存碎片
- 堆分离以解决内存碎片
- C++中的内存碎片
- 内存碎片整理在64位系统上仍然相关吗
- 大量的页面错误与内存碎片有任何关系
- 我应该担心std::vector的内存碎片吗?
- 避免内存碎片的方法
- 多线程是否强调内存碎片