大内存块分配和4K块

3
考虑一下马克·鲁西诺维奇在Windows内核方面的著作中的这段话。这是关于大页面分配机制的内容,旨在为物理内存中分配大型非换页内存块。

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

操作系统长时间运行后,尝试分配大页面可能会失败,因为每个大页面所需的物理内存必须占用显著数量(参见表10-1)的物理连续小页面,并且这种物理页面范围还必须从大页面边界开始。随着系统运行,可用的物理内存可能会变得碎片化。这对于使用小页面进行分配不是问题,但可能会导致大页面分配失败。
如果我理解正确,他的意思是分散的4K页面产生的碎片化可能会防止在物理内存中成功分配大型2M页面。但为什么呢?普通的4K物理页面很容易被重新定位,并且也可以很容易地被交换出去。换句话说,如果我们有一个物理内存区域没有被其他2M页面占用,我们总是可以“清理它”:通过将任何干扰该物理内存区域的4K页面从该物理内存区域重定位到其他位置来使其可用。也就是说,从“天真”的观点来看,只要我们有足够的空闲物理RAM,2M分配应该“总是成功”的。

我的逻辑有什么问题?当马克说由4K页面引起的物理内存碎片化可能会防止成功分配大页面时,他到底在说什么?


重新定位已分配的物理内存会给系统带来额外的开销。此外,寻找最不碎片化的连续内存空间需要另一个开销。这可能是问题的原因吗? - Mert Akcakaya
1
当逻辑没有问题时,我不相信我们能回答“逻辑有什么问题”。 - Zan Lynx
1
@Zan Lynx:首先,自由透明地操纵物理页面是虚拟内存的基本属性。这就是虚拟内存的定义。我不明白为什么那些版本的Windows可能无法使用它。其次,“那个逻辑”指的是我的逻辑,而不是Russinovich的逻辑。 - AnT stands with Russia
应用程序和驱动程序可以锁定/分配物理内存。鉴于此,您的问题是为什么操作系统不能移动已分配的物理内存页面? - josh poley
据我所知,在Windows中,“锁定”内存只是被认为是进程工作集的无条件部分。这意味着(尽管存在一种普遍的观点)它不仅可以在RAM中重新定位,而且在进程未运行时实际上可以被交换到磁盘上!我知道AllocateUserPhysicalPages,它是一个不同的故事。而且这是非常奇特的一件事情,我相信如果那是他的意思,马克会提到它的。对我来说,马克谈论的是“常规”的4K页面。 - AnT stands with Russia
显示剩余6条评论
2个回答

4

这在Windows XP中确实起作用。但成本太高,Vista的设计更改禁用了这种方法。在这篇博客文章中很好地解释了,我将引用其中的关键部分:

在Windows Vista中,内存管理人员意识到这些长时间的延迟使得对于应用程序来说非常大的页面不太具备吸引力,因此他们改变了行为,这样应用程序对于非常大的页面的请求会经过“易于处理”的连续物理内存查找部分,但会放弃进入绝望模式,而是选择失败。


1
我明白了。然而,我并不清楚更改行为背后的逻辑。建议从“长延迟”切换到“失败”,可以使大页面对应用程序更具吸引力(???),这个建议对我来说毫无意义。当前的建议是在内存碎片化仍然较低时尽早分配大页面,但这个建议同样适用于旧的和新的分配算法。 - AnT stands with Russia
1
他们可以说,为了避免这些“长时间延迟”,必须尽早分配大页面,以同样的成功程度。基本上,我甚至可以得出结论,博客文章中给出的理由是典型的虚假“营销用语”。我猜原始的、更复杂的分配机制需要支持/维护工作量,这被认为对于这种很少使用的“利基”功能来说过高了。 - AnT stands with Russia
也许这就是使用别人的话语所带来的责任。我的表述方式是:“很糟糕。最糟糕的情况是可怕的,应用程序无法合理地预测它会有多糟糕。因此,他们只好将其删除。” - Hans Passant

2
他在谈论一种存在于时间轴上的内存块分配和释放的特定问题,而你正在描述一种解决方案。你的逻辑没有问题,这大致就是.NET垃圾收集器减少内存碎片的方法。你说得对。
如果棒球比赛每排有10个座位,座位2、4、6和8被占用(碎片化),那么你和你的朋友将永远无法在该排中获得3个座位,除非你要求某人移动位置(压缩)。
他所描述的4k块没有什么特别之处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接