1.这个项目做的是什么?
- 实现一个高并发内存池,参考原型为Google的一个开源项目tcmalloc(Thread-Caching Malloc)
- 即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)
- 此项目是把tcmalloc最核心的框架简化后拿出来,模拟实现出一个自己的高并发内存池,以供学习
- tcmalloc源代码
2.此项目涉及知识面
- C/C++、数据结构(链表、哈希桶)、操作系统内存管理、单例模式、多线程、互斥锁
3.什么是内存池?
1.池化技术
- 程序先向系统申请过量的资源,然后自己管理,以备不时之需
- 之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,使用时就会变得非常方便快捷,大大提高程序运行效率
- 计算机中,很多使用"池"这种技术的地方,比如内存池、连接池、线程池、对象池等
2.内存池
- 内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取
- 同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池
- 当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放
3.内存池主要解决的问题
-
内存池主要解决效率问题,其次如果作为系统的内存分配器的角度,还需要解决一下内存碎片的问题
-
什么是内存碎片?(外碎片)
- 如下图
- 此时有384byte空间,但是因为要申请超过256byte的空间却申请不出来,因为这两块空间碎片化,不连续了
-
内存碎片
- 外碎片
- 一些空闲的连续内存区域太小,这些内存空间不连续,以至于合计的内存足够,但是不能满足一些的内存分配申请需求。
- 内碎片
- 由于一些对齐的需求,导致分配出去的空间中一些内存无法被利用
- 外碎片
4.理解malloc
-
C/C++中要动态申请内存都是通过malloc去申请内存,但是我们实际不是直接去堆获取内存的,而malloc就是一个内存池
-
malloc()相当于向操作系统"批发"了一块较大的内存空间,然后"零售"给程序用,当全部"售完"或程序有大量的内存需求时,再根据实际需求向操作系统"进货"
-
malloc的实现方式有很多种,一般不同编译器平台用的都是不同的
- 比如Windows的vs系列用的微软自己写的一套
- Linux gcc用的glibc中的ptmalloc