请考虑一下关于Windows内部结构的书中的引用。这是关于大页分配机制,用于在物理内存中分配大的非分页内存块。
http://books.google.com/books?id=CdxMRjJksScC&pg=PA194&lpg=PA194#v=onepage
在操作系统运行了很长一段时间后,分配大页的尝试可能会失败,因为每个大页的物理内存必须占用大量物理上连续的小页(请参见表10-1),而且物理页的这一范围还必须从大页边界开始。(例如,物理页0到511可以用作x64系统上的大页,物理页512到1023也可以使用,但是第10页到521页不能。)当系统运行时,可用的物理内存确实变得支离破碎。对于使用小页的分配,这不是问题,但可能导致大页分配失败。
如果我正确理解了这一点,他是说分散的4K页面所产生的碎片可以阻止在物理内存中成功地分配大的200万页。但是为什么呢?普通的4K物理页面很容易被重新定位,也可以很容易地交换出去。换句话说,如果我们的物理内存区域没有被其他200万页占用,我们总是可以“清理它”:通过将任何干扰的4K页从物理内存区域重新定位到其他位置,使其可用。也就是说,从“天真”的角度来看,只要我们有足够的免费物理RAM,200万的分配就应该“永远成功”。
我的逻辑怎么了?当Mark说由4K页造成的物理内存碎片会阻止大页面的成功分配时,他到底在说什么?
发布于 2014-02-24 23:27:24
在Windows中,它实际上是这样工作的。但是成本太高了,Vista的设计改变就使这种方法失效了。在这篇博客文章中解释得很好,我将引用基本部分:
在Windows Vista中,内存管理器的工作人员认识到,这些长时间的延迟使得非常大的页面对应用程序没有吸引力,因此他们改变了行为,因此从应用程序中请求非常大的页面经过了寻找连续物理内存的“简单部分”,但在内存管理器陷入绝望模式之前就放弃了,而只是选择了失败。
发布于 2014-02-24 22:53:13
他说的是随着时间的推移分配和释放连续内存块时存在的一个特定问题,您将描述一个解决方案。您的逻辑没有什么问题,这大致就是.NET垃圾收集器为减少内存碎片所做的工作。你很在行。
如果你在一场棒球比赛中每排有10个座位,并且有2、4、6和8个座位,那么你将永远无法为你和你的朋友获得3个座位,除非你让别人移动(compacted)。
他描述的4k街区没有什么特别之处。
https://stackoverflow.com/questions/21999406
复制相似问题