nginx内存池(palloc创建函数)
我们分析palloc.h
第1个宏的名字意思是:能从池里分配的最大内存(4096字节)(4k)
也就是说,对于nginx,小块内存和大块内存区分的界线是1个页面(4096)(因为nginx是http服务器,面对所有的模块提供的,所以分界线值比较大,而SGI STL是给C++STL管理容器底层用的)
第2个宏的名字意思是:默认的池的大小(16k)
第3个宏的名字意思是: 内存池内存分配的字节对齐的数字
第4个宏的名字意思是:内存池中最小的大小
我们进去看看ngx_align函数
这个似曾相识,和SGI STL的相似,作用是把内存的开辟调整到临近a(16)的倍数。
相关函数的接口:
内存池结构体
这个结构体对应的图:
第1个成员是内存池的头信息。
创建函数create pool
我们进去ngx_memalign看看
宏定义,判断要不要内存对齐:
我们进去看看:
下面这句代码,根据用户指定的大小来开辟内存池,可以根据不同系统平台定义的宏调用不同系统平台,如果没有定义的话,其实就是调用底层的malloc函数
如果申请失败:
如果申请成功:
如下图所示:
整个大小就是用户传入的size(1024),而且要存储头信息。
空白的部分是用户使用的。
然后执行:
总大小-内存池头部信息=用户可以使用的真实的大小。
p->max就是说ngx_create_pool(size)中的可用空间size如果大于等于4095(1个页面)的话,取的就是4095(一个页面),否则的话就取size。这是维护nginx小块内存的操作。
所以max就是存储当前小块内存的分配的最大值
current指针指向内存的起始地址,指向当前块。
然后返回新创建的内存池的起始地址p