Nginx内存池的一些理解

内存管理中为避免内存碎片,nginx管理内存技术在此理解:
结构图如下:
一、内存池的数据结构
在nginx内存池中有一个头部,头部里又包含一个数据部,数据部主要用来为用户分配小块内存。数据部之外主要为用户分配大块内存、管理外部资源、日志信息以及内存池的一些其他信息。
Nginx内存池的一些理解_第1张图片
ngx_pool_s的ngx_pool_data_t中:
last:是一个unsigned char 类型的指针,保存的是/当前内存池分配到末位地址,即下一次分配从此处开始。
end:内存池结束位置;
next:内存池里面有很多块内存,这些内存块就是通过该指针连成链表的,next指向下一块内存。
failed:内存池分配失败次数。
ngx_pool_s
d:内存池的数据块;
max:内存池数据块的最大值;
current:指向当前内存池;
chain:该指针挂接一个ngx_chain_t结构;
large:大块内存链表,即分配空间超过max的情况使用;
cleanup:释放内存池的callback
log:日志信息
Nginx内存池的一些理解_第2张图片
二、内存池的创建
Nginx内存池的一些理解_第3张图片
三、内存池中内存的分配申请
在内存池中分配内存有三种情况
(用户需要申请的空间size和池内的剩余空间相比较,如果大于剩余空间但是小于
max则用next指针在增加内存池;如果直接大于max则申请大块内存)
1.申请的是小块内存,内存池中的空间足够
直接移动起始指针
2.申请的是小块内存,内存池中空间不够
建立同等大小的内存池并分配size大小的空间
3.申请的是大块内存
在堆中申请大块内存,并用链表管理
注意:①开辟内存为什么要考虑内存对齐是因为内存取整可以降低CPU读取内存的次数,提高性能。主要为减少内存的I/O操作,由于此操作性能太低。
②nginx内存池的大块内存和小块内存的界是max即一页内容=4096字节=4k
③小块内存为什么不提供释放函数,只有一个重置函数ngx_reset_pool什么时候调用呢 ?
因为http协议本身就是一个短连接,无状态的协议。
处理完请求,服务器断开。在处理完http请求完成之后,就可以发起内存池的重置函数

Nginx内存池的一些理解_第4张图片
四、内存池中的内重置
释放大块内存,重置小块内存
Nginx内存池的一些理解_第5张图片
五、内存池清理
只释放大块内存
Nginx内存池的一些理解_第6张图片
六、内存池摧毁
Nginx内存池的一些理解_第7张图片

你可能感兴趣的:(c语言)