“内存缓存”和“内存池”之间的区别

时间:2011-09-23 09:44:20

标签: linux unix memory-management memory-pool memorycache

通过阅读“了解linux网络内部”和“了解linux内核”这两本书以及其他参考资料,我很困惑,需要对“内存缓存”和"memory pool"技术进行一些澄清。

1)它们是相同还是不同的技术?

2)如果不相同,是什么产生差异,或者是不同的目标?

3)此外,Slab Allocator是如何进入的?

3 个答案:

答案 0 :(得分:2)

关于slab分配器:

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

< ============ 256字节=======================>

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

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

因此它变得支离破碎,然后没有你美丽的4gig内存块的痕迹 - 这是碎片。现在,slab分配器将要做的是跟踪已分配的对象,一旦它们不再使用它会说内存是空闲的,实际上它将被保留在某种List中(你可能想读一下{{3 }})。

所以现在假设第一个程序放弃分配的256个字节,然后一个新的想要有256个字节,所以不用分配主内存的新块,而是可以重新使用最后释放的256个字节,而不必去通过搜索物理内存以获得适当的连续空间块的负担。这就是你基本上实现内存缓存的方式。这样做是为了整体减少内存碎片,因为你可能最终会遇到内存碎片太多而无法使用的情况,并且内存管理器必须做一些魔术来让你阻止适当的大小。使用slab分配器主动打击(但不消除)问题的地方。

答案 1 :(得分:0)

Linux内存分配器A.K.A slab分配器维护常用的类似或近似大小的内存对象列表/池。 slab为程序员提供了额外的灵活性,可以创建自己常用的相同大小的内存对象池,并将其标记为程序员想要,分配,解除分配并最终销毁它。这个缓存对于你的驱动程序是已知的并且是私有的。但是一个问题,在内存压力下,分配失败的可能性很高,这在某些驱动程序中可能是不可接受的,那么做得更好总是保留一些内存,以便我们永远不会感到内存紧张,因为kmem缓存是更通用的池机制我们需要一个能够始终保持最低所需记忆的人,以及我们的伙伴记忆池。

答案 2 :(得分:0)

Lookaside Caches - Linux 内核中的缓存管理器有时称为 slab 分配器。您最终可能会一遍又一遍地分配许多相同大小的对象,因此通过使用这种机制,您只需分配许多相同大小的对象,然后再使用它们,而无需一遍又一遍地分配许多对象。

Memory Pool 只是一种后备缓存的形式,它试图始终保留一个内存列表以备不时之需,因此在创建内存池时,分配函数(slab分配器)创建一个预分配对象池,以便您可以在需要时获取它们。