gpt4 book ai didi

Windows 32 位虚拟内存页面映射问题

转载 作者:可可西里 更新时间:2023-11-01 10:02:03 24 4
gpt4 key购买 nike

我正在从这里学习 Windows 32 位虚拟内存页面映射,

(我的目标是现代 Windows 版本,例如 Vista、Win 7、Server 2003/2008 32 位版本。)

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

两个困惑,

  1. 用户空间虚拟内存空间通常限制为2G,但物理磁盘页面存储可能远大于2G。由于磁盘页面的数量多于虚拟内存页面的数量,因此理论上可以将多个磁盘页面映射到一个虚拟地址页面。如果用户请求访问某个虚拟地址,如果多个磁盘页面映射到一个虚拟地址页面,内存管理器如何知道应该访问哪个磁盘页面?

  2. 不知道为什么会有byte[]数组必须使用连续的虚拟内存空间这样的限制。我认为理论上即使我们只分配500M的虚拟空间地址,我们也可以重新使用这样的虚拟空间地址来继续映射/取消映射磁盘页面文件来消耗我们想要的,甚至超过2G。

有什么想法吗?

最佳答案

字节(或任何其他)数组必须使用连续的地址空间,在本例中是连续的虚拟 地址空间。这是一个可以使碎片化成为问题的区域,并且实际上会因内存虚拟化而加剧。由于此类系统中固有的各种“重定向”以及使其高效的性能考虑导致实际分配物理地址空间映射到 block 中的虚拟地址空间(通常是页面)。

因此请求 10 字节的虚拟地址空间 block 实际上可能会导致整个 4K 页面被保留和映射。由于页面中的物理内存必须是连续的,这会导致整个 4K 的虚拟地址空间被“阻塞”。
可以在一个页面中放置多个小分配(优秀的内存管理器会尝试实现这一点),但实际上已经保留了超出严格要求的地址空间。考虑在页的开头分配一个字节,然后是 4K - 2 个字节,然后是另一个字节。这会(有效地)占据整个页面。
考虑中间分配是否不再需要,因此被释放。在'top'和'tail'值被释放或移动到别处之前,虚拟地址空间中已经创建了一个间隙,该间隙只能由小于 4K-1 字节的内容填充。如果发生足够多的此类事情,虚拟地址空间中的连续区域收缩速度比实际实际使用内存收缩速度快得多。

你是正确的,因为没有什么能阻止你,用户,将你的(限制在 32 位区域)地址空间映射到 CPU/OS 支持的更大的磁盘或内存空间。一些芯片通过类似 PAE 的机制使物理地址空间超过 4GB 成为可能。 .

Windows 本身提供了一个 API 来处理“更改地址空间的映射以获得不同的‘窗口’到更广泛的池中”的大多数方面(通过 PAE、运行 WoW64、磁盘或混合)。这叫做 AWE .但是像这样的机制已经存在多年(因为那些记得使用 conventional memorysegmented memory 的 EMS 时代的人。

即使没有 CPU 和操作系统的支持,您仍然可以通过各种技术自己手动完成(见下文)。

Windows 中的许多更复杂的方面都由非常有趣的 Raymond Chen 处理。

关于Windows 32 位虚拟内存页面映射问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1297797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com