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

通过阅读“理解linuxnetworking内部”和“理解linux内核”这两本书以及其他参考书,我感到相当困惑,需要对“内存caching”和“内存池”技术进行一些说明。

1)他们是相同或不同的技术?

2)如果不一样,有什么不同,还是截然不同的目标?

3)另外, Slab Allocator怎么进来?

    关于slab分配器:

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

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

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

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

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

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

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