通过阅读《理解Linux网络内部》和《理解Linux内核》这两本书以及其他参考资料,我对“内存缓存”和“内存池”技术感到很困惑,需要一些澄清。
1)它们是相同的技术还是不同的技术?
2)如果不同,是什么造成了区别,或者说有何不同的目标?
3)此外,Slab Allocator如何介入其中?
1)它们是相同的技术还是不同的技术?
2)如果不同,是什么造成了区别,或者说有何不同的目标?
3)此外,Slab Allocator如何介入其中?
Linux内存分配器,也称为slab分配器,维护了相似或近似大小的内存对象的常用列表/池。 slab赋予程序员额外的灵活性,可以创建自己的同一大小的常用内存对象池,并根据程序员想要的方式标记、分配、回收和最终销毁它。这个缓存对于您的驱动程序是已知的并且是私有的。但是,在内存压力下,存在高概率的分配失败问题,这在某些驱动程序中可能是不可接受的,那么怎么办呢?最好总是保留一些备用内存,以便我们永远不会感到内存短缺,由于kmem缓存是更通用的池机制,因此我们需要一个可以始终维护所需最少内存的朋友——内存池。
旁路缓存 - Linux内核中的缓存管理器有时被称为slab分配器。您可能会反复分配许多相同大小的对象,因此通过使用此机制,您只需分配许多相同大小的对象,然后稍后再使用它们,而无需反复分配许多对象。
内存池只是一种旁路缓存的形式,试图始终保留一些内存列表以供紧急情况使用,因此当创建内存池时,分配函数(slab分配器)会创建一组预分配的对象池,以便在需要时获取它们。