【总结笔记】如何设计内存池

内存池与 malloc 的区别

(1)malloc 位于标准库这一层,而内存池位于应用程序这一层。内存池技术是一次性获取到大块内存,然后在其上管理内存的申请和释放,绕过标准库及操作系统。
(2)malloc 的定位是通用性,设计比较复杂;而内存池技术专用于某个特定场景,以优化程序性能。 在一种场景下有很高性能的内存池基本上无法在其他场景获得高性能甚至根本无法应用于其他场景

线程安全

为保证线程安全,需要加锁。锁的粒度有几种选择:

全局锁;整个内存池一把锁

如果程序有大量线程申请释放内存,全局锁不会获得很好的性能,因为竞争太激烈。

线程局部存储(TLS:Thread Local Storage)

解释线程局部存储:
存储在该区域的变量是全局变量;
每个线程都有该全局变量的副本,互不影响
为每个线程维护一个内存池:创建一个全局变量,使得所有线程可以使用该全局变量。与此同时,将全局变量声明为 线程私有存储,那么虽然所有线程看似使用同一个全局变量,但该全局变量在每个线程中都有副本,相互之间不会干扰。

2 种内存池设计方法

方法一:只申请相同大小的内存块

申请出一堆来,使用的时候拿出一个,使用完后还回去。

方法一:可申请不同大小的内存块

使用指针 free_ptr 指向空闲内存块起始位置,当向内存池分配内存时找到free_ptr并判断当前内存池剩余空闲是否足够就可以了,有就分配出去并修改free_ptr,否则向malloc再次成倍申请内存。

posted @ 2022-06-04 09:54  MasterBean  阅读(149)  评论(0)    收藏  举报