大内存块分配和4K块

时间:2014-02-24 21:29:16

标签: windows memory virtual internals win64

请考虑Mark Russiniovich关于Windows内部的书籍。这是关于大页面分配机制,用于在物理内存中分配大型非分页内存块

http://books.google.com/books?id=CdxMRjJksScC&pg=PA194&lpg=PA194#v=onepage

  

尝试分配大页面可能会在操作系统后失败   已经运行了很长一段时间,因为物理内存   对于每个大页面必须占用大量数字(见表10-1)   物理上连续的小页面,以及这种程度的物理   页面必须从大页面边界开始。 (例如,   物理页面0到511可以用作x64上的大页面   系统,物理页面512到1,023,但页面10   通过521不能。)自由物理内存确实变得支离破碎   系统运行。对于使用small的分配,这不是问题   页面但可能导致大页面分配失败。

如果我理解这一点,他说分散的4K页面产生的碎片可能会阻止在物理内存中成功分配大型2M页面。但为什么?普通的4K物理页面易于重定位,也可以轻松更换。换句话说,如果我们的物理内存区域没有被其他2M页面占用,我们可以随时“清理它”:通过将任何干扰的4K页面从该物理内存区域重新定位到其他位置来使其可用。即从“天真”的角度来看,只要我们有足够的免费物理RAM,2M分配就应该“永远成功”。

我的逻辑出了什么问题?当Mark说由4K页面引起的物理内存碎片可以阻止成功分配大页面时,Mark到底在谈论什么?

2 个答案:

答案 0 :(得分:4)

它实际上在Windows XP中以这种方式工作。但是成本过高而且Vista中的设计更改禁止了这种方法。在this blog post中解释得很好,我将引用基本部分:

  

在Windows Vista中,内存管理器人员认识到这些长时间延迟使得非常大的页面对应用程序的吸引力降低,因此他们改变了行为,因此对来自应用程序的非常大的页面的请求经历了寻找连续物理的“简单部分”内存,但在内存管理器进入绝望模式之前放弃了,而宁愿选择失败。

答案 1 :(得分:2)

他正在讨论随着时间的推移分配和释放连续内存块所存在的特定问题,并且您正在描述解决方案。您的逻辑没有任何问题,这大致是.NET垃圾收集器为减少内存碎片所做的工作。你是现场的。

如果你在棒球比赛中每排有10个席位而且有2个,4个,6个和8个席位(支离破碎),你将永远无法获得该排的3个席位你和你的朋友除非你要求某人搬家(压缩)。

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