SGI STL vector内存池源码
SGI STL包含了一级空间配置器和二级空间配置器,其中一级空间配置器allocator采用malloc和free来
管理内存,和C++标准库中提供的allocator是一样的,但其二级空间配置器allocator采用了基于freelist
自由链表原理的内存池机制实现内存管理。
nginx内存池
内存池创建函数
小内存块分配
如果需要申请的内存小于一个页面,就去小内存分配函数
如果该内存池内存不够用,分配失败退出while进入block函数
再创建一个内存块,利用for循环如果去分配内存失败超过4次就把current指针指向下一个内存块,进行开辟,上一个内存块说明已经很小了(current指向d.next联系两个内存块)
大块内存分配
虽然大块,但是无论如何不会超过一个页面max<一个页面
ngx_alloc函数,内部用malloc开辟大块内存,然后对大块内存的头部信息也用小块内存分配
大块内存释放,小块内存不释放
效率:以后申请大块内存时,会遍历前三个大内存头信息,看他们的内存是否已经被释放,如果释放了直接用即可,不必再次申请浪费时间
内存池重置函数和小块内存回收机制
外部资源释放和内存池销毁代码
释放大块内存之前,里面可能还有数据,,所以可以设置一个资源释放回调函数handler()
上图自制了release函数,将其与cleanup_add()结合,cleanup_add函数得到一个链表包含大块资源里的外部资源信息,给handler放入release()函数,后面调用即可。
销毁时判断如果回调函数不为空就执行handler回调函数,传入参数data数据对其free,因为是for循环,可以删完
销毁步骤
1.利用自制回调函数清理外部资源
2.遍历large,释放大块内存
3.遍历小块内存,一个一个free掉(因为小块内存储存了大块的头部信息)