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

High number of page faults has any relation to memory fragmentation?

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

来自维基百科:

The main functions of paging are performed when a program tries to access pages that are not currently mapped to physical memory (RAM). This situation is known as a page fault. The operating system must then take control and handle the page fault, in a manner invisible to the program. Therefore, the operating system must:

Determine the location of the data in secondary storage. Obtain an empty page frame in RAM to use as a container for the data. Load the requested data into the available page frame. Update the page table to refer to the new page frame. Return control to the program, transparently retrying the instruction that caused the page fault.

因此,我认为碎片通常与页面错误无关。后者表明 RAM 内存已满,并且该特定程序比其他程序消耗更多内存,因此他在交换区域中有更多内存,因此每次他尝试访问已被 [=21 换出的页面时=] 发生页面错误,OS 必须将此页面加载到 RAM。

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

当您的内存映射包含几个无法满足新保留的小块时,通常会发生碎片,因此进程开始请求更多内存以容纳它们。因此,这种情况下的症状是内存使用率较高或内存未释放给 OS 即使程序完成了一些本应分配动态内存的特定任务,执行一些操作然后释放它也是如此。

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

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

也许问题需要那么多虚拟内存,但算法设计不佳(访问的局部性差),因此对常驻内存的需求高于应有的水平。

也许程序编码不当,所以它使用的内存比需要的多。

也许任务对驻留内存的需求是完全合理的(给定可用的物理内存),但 Microsoft 脑死亡的内存管理算法无缘无故地产生了压倒性的页面错误。

大多数页面错误是 "soft" 错误,这意味着实际上不需要磁盘 activity。 OS 已经从任务中取出页面,但没有从物理 ram 中删除这些页面,作为测试任务真正需要哪些页面的一种手段,长期目标是防止任务的 "working set" 增长(随着Microsoft 滥用术语 "working set")。这是 OS 的所有必要且正确的行为。

但是当任务需要快速返回这些页面时,您会遇到一个软故障,其中 OS 返回这些页面并带走其他页面,而不是意识到任务需要更高的总驻留 ram 和有足够的物理内存来容纳它。我见过很多情况,其中单线程内核 CPU 处理软故障的时间是长程序运行时间的 90% 或更多,而机器的大部分 ram 只是闲置。