字节(或任何其他)数组必须使用连续的地址空间,在这种情况下是连续的虚拟地址空间。这是一个可以使碎片成为问题的区域,并且实际上由于内存的虚拟化而加剧。由于此类系统系统中固有的各种“重定向”以及使其高效的性能考虑导致实际分配映射到块(通常是页面)中的虚拟地址空间的物理地址空间。
因此,请求 10 字节的虚拟地址空间块实际上可能会导致整个 4K 页面被保留和映射。由于页面内的物理内存必须是连续的,这可能导致整个 4K 的虚拟地址空间被“封锁”。
多个小的分配可以放在一个页面中(好的内存管理器会尝试实现这一点),但实际上保留的地址空间超过了严格要求的空间。考虑在起始 fa 页分配单个字节,然后是 4K - 2 个字节,然后是另一个单个字节。这(有效地)占据了整个页面。
考虑是否不再需要中间分配并因此被释放。在“top”和“tail”值被释放或移动到其他地方之前,在虚拟地址空间中创建了一个空白,该空白只能由小于 4K-1 字节的内容填充。如果发生足够多的此类事情,则虚拟地址空间中的连续区域收缩的速度比实际使用的内存总量要快得多。
您是正确的,因为没有什么能阻止您,用户,将您的(受限于 32 位土地)地址空间映射到 CPU/OS 支持的更大的磁盘或内存空间。一些芯片通过诸如PAE之类的机制使用超过 4GB 的物理地址空间来实现这一点。
Windows 本身提供了一个 API 来处理“更改地址空间的映射以将不同的“窗口”放到更广泛的池中的大多数方面(无论是通过 PAE、运行 WoW64、磁盘还是混合)。这称为AWE。但是这样的机制已经存在多年(就像那些记得 EMS 时代的传统记忆或分段记忆时代的人一样。
即使没有 CPU 和操作系统支持,您仍然可以通过各种技术自己手动完成(见下文)。
非常有趣的 Raymond Chen 处理了 windows 中许多更复杂的方面。