目录
- 一、项目介绍
- 这个项目是做什么的?
- 二、什么是内存池?
- 2.1 什么是池化技术?
- 2.2 内存池
- 2.3 内存池主要解决什么问题?
- 2.4 malloc
一、项目介绍
这个项目是做什么的?
当前项目是实现一个高并发的内存池,它的原型是google的一个开源项目TCmalloc,TCmalloc全称是Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。
这个项目是把TCmalloc最核心的框架简化后拿出来,模拟实现出一个自己的mini版的高并发内存池,目的就是学习TCamlloc的精华部分,而并非造一个更好的轮子。
二、什么是内存池?
2.1 什么是池化技术?
所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。就好比我们上大学时问父母要生活费,也是一次就要一个月的生活费而并非每天都找父母要一次生活费。
其实在计算机中,有很多使用“池”这种技术的地方,除了内存池,还有连接池、线程池、对象池等。以服务器上的线程池为例,它的主要思想是:先启动若干数量的线程,让它们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态,以上都是池化技术的一些应用场景。
2.2 内存池
内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放。
2.3 内存池主要解决什么问题?
1、首先,内存池解决的最主要问题肯定还是效率问题,使用内存池有助于提高效率。
2、其次,内存池还能解决内存碎片的问题,何为内存碎片?内存碎片分为内碎片和外碎片内碎片主要是因为内存对齐而导致的,而外碎片是:例如有一块大内存的前100个字节被函数1申请开辟了,中间100字节被函数2申请开辟了,后100个字节被函数3申请开辟了,这时函数1和函数3调用结束,释放了这块内存的前100个字节和后100个字节,那么现在有200个字节,但是当函数4想要申请200个字节的内存时却申请不出来,原因是申请的一块内存必须是连续的,而正因为这200个字节的内存不连续,所以虽然是有200个字节的内存,但是却申请不到200字节的内存出来,这个就称为外碎片。
简单来说就是外碎片是一些空闲的连续内存区域太小,这些内存空间不连续,以至于合计的内存足够,但是不能满足一些的内存分配申请需求。内碎片是由于一些对齐的需求,导致分配出去的空间中一些内存无法被利用。
2.4 malloc
C/C++中我们要动态申请内存都是通过malloc去申请内存,但是我们要知道,实际我们不是直接去堆获取内存的,而是malloc本身就是一个内存池。malloc() 相当于向操作系统申请了一块较大的内存空间,然后按需分给程序用。当这个大块内存全部用完或程序有大量的内存需求时,再根据实际需求向操作系统申请内存。malloc的实现方式有很多种,一般不同编译器平台用的都是不同的。比如windows的vs系列用的是微软自己写的一套,
linux gcc用的glibc中的ptmalloc。