Windows 大内存块分配和4K块

Windows 大内存块分配和4K块,windows,memory,virtual,internals,win64,Windows,Memory,Virtual,Internals,Win64,考虑一下马克·鲁西尼奥维奇(MarkRussinovich)关于Windows内部构件的书中的这句话。这是关于大页面分配机制的,用于在物理内存中分配大的非页面内存块 操作系统启动后,分配大页面的尝试可能会失败 已经运行了很长一段时间,因为物理内存 对于每个大页面,必须占用一个有效数字(见表10-1) 物理上连续的小页面的数量,以及物理 此外,页面必须从较大的页面边界开始。(例如, 物理页面0到511可以用作x64上的大页面 系统,物理页512到1023,但第10页 通过521无法。)释放的物理

考虑一下马克·鲁西尼奥维奇(MarkRussinovich)关于Windows内部构件的书中的这句话。这是关于大页面分配机制的,用于在物理内存中分配大的非页面内存块

操作系统启动后,分配大页面的尝试可能会失败 已经运行了很长一段时间,因为物理内存 对于每个大页面,必须占用一个有效数字(见表10-1) 物理上连续的小页面的数量,以及物理 此外,页面必须从较大的页面边界开始。(例如, 物理页面0到511可以用作x64上的大页面 系统,物理页512到1023,但第10页 通过521无法。)释放的物理内存确实会随着 系统运行。这对于使用小型计算机的分配不是问题 但会导致大型页面分配失败

如果我理解正确的话,他是说分散的4K页面产生的碎片会阻止在物理内存中成功分配大的2M页面。但是为什么呢?普通4K物理页面很容易重新定位,也可以很容易地调出。换句话说,如果我们有一个物理内存区域没有被其他2M页占用,我们总是可以“清理”:通过将任何干扰的4K页从该物理内存区域重新定位到其他位置,使其可用。也就是说,从“天真”的角度来看,只要我们有足够的可用物理RAM,200万次分配应该“总是成功的”


我的逻辑有什么问题?马克说4K页面导致的物理内存碎片会阻止大页面的成功分配,他说的到底是什么?

他说的是随着时间的推移分配和释放连续内存块时存在的一个特定问题,您正在描述一个解决方案。您的逻辑没有问题,而这正是.NET垃圾收集器为减少内存碎片所做的工作。你说得对

如果你在一场棒球比赛中每排有10个座位,而2、4、6和8个座位都有人坐(零碎的),你和你的朋友将永远无法在那一排获得3个座位,除非你要求某人移动(压缩的


他所描述的4k块没有什么特别之处。

在Windows XP中实际上是这样工作的。但是成本太高了,Vista的设计变更使这种方法失效。在中,我将引用重要部分:

在Windows Vista中,内存管理人员认识到,这些长时间的延迟降低了超大页面对应用程序的吸引力,因此他们改变了应用程序对超大页面的请求,使其通过查找连续物理内存的“简单部分”来完成,但是在内存管理器进入绝望模式之前放弃了,宁愿失败


重新定位分配的物理内存会给系统带来开销。此外,查找最不分段的连续内存空间还需要另一个开销。这可能是原因吗?我觉得他解释得很清楚。你引入了一些技术来解决这个问题,Windows可能会在更新版本中使用这些技术,但在他写这本书的时候可能没有。我不相信我们能在逻辑没有问题的情况下回答“逻辑出了什么问题”。@Zan Lynx:首先,在透明环境中自由操作物理页面的能力(对于正在运行的进程)时尚是虚拟内存的基本属性。这就是虚拟内存。我不知道它怎么可能对那些版本的Windows不可用。其次,通过“那个逻辑”我指的是我的逻辑,而不是Russinovich的逻辑。应用程序和驱动程序可以锁定/分配物理内存。既然如此,你的问题是,为什么操作系统不能移动分配的物理内存页面?我明白了。但我不清楚改变行为背后的逻辑。建议从“长延迟”切换到“失败”可以使大页面更“吸引应用程序”(??)这对我来说毫无意义。目前的建议是在内存碎片仍然较低的情况下,尽早分配大页面,但这一建议同样适用于旧的和新的分配算法。也就是说,为了避免那些“长延迟”,他们可以说是以同样的成功程度一个人必须提前分配大页面。基本上,我甚至可以得出结论,博客文章中给出的理由是典型的虚假“营销言论”。我猜,原始的、更复杂的分配机制需要支持/维护工作,对于这样一个很少使用的“利基”来说,这被认为是过度的功能。也许这是使用别人的话的责任。我的说法是:“糟透了。最坏的情况是可怕的,应用程序无法合理地预测它会有多坏。所以他们只是删除了它。”。