2011-09-23 67 views

回答

2

关于slab分配器:

所以,想象存储器是平坦的是你有4个连续的演出内存块。然后你的一个程序需要256字节的内存,所以内存分配器必须做的是从这4个演出中选择一个合适的256字节块。所以现在你的记忆看起来像

< ============ 256bytes =======================>

(每个=是连续的内存块)。一段时间过去了,许多使用内存的程序需要更多的256个块或更多或更少,所以最终你的内存可能看起来像:

< == 256 == 256 = 256 = 86 = 68 = 121 = ==>

所以它被分割,然后没有你美丽的4gig内存块的痕迹 - 这是碎片。现在,slab分配器会做的是跟踪分配的对象,一旦它们不再被使用,它会说内存是空闲的,实际上它会保留在某种列表中(你可能想读FreeLists)。

所以现在想象一下,第一个程序放弃分配的256个字节,然后一个新的想要有256个字节,所以不用分配一个新的主内存块,它可以重新使用最后释放的256个字节,而不必通过搜索物理内存来寻找合适的连续空间块。这就是你实质上实现内存缓存的方式。这样做是为了减少整体内存碎片,因为最终可能导致内存碎片化,无法使用,并且内存管理器必须采取一些魔法才能阻止适当的大小。在哪里使用板分配器主动地打击(但不消除)问题。

+1

谢谢LordDoskias,供您参考。但是,这更多关于碎片。它没有解释我询问关于“内存缓存”和“内存池”的相同/差异关系问题。 – pepero

0

Linux内存分配程序A.K.A板分配程序维护频率相似或近似大小的内存对象的常用列表/池。 slab为编程人员提供了额外的灵活性,可以创建他们自己的相同大小的常用内存对象池,并将其标记为程序员想要的,分配,释放并最终销毁它。此缓存对您的驱动程序是已知的,对于它是私有的。但是,一个问题,在内存压力下,分配失败的可能性很高,这在某些驱动程序中可能是不可接受的,那么做什么更好总是保留一些内存方便,以便我们从不感觉内存紧缩,因为kmem缓存更通用的池机制需要一个能够始终保持最小需求内存的人,这就是我们的好友内存池。

相关问题