- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
nginx内存池管理
1.为什么需要内存池
??? 为什么需要内存池?
a. 在大量的小块内存的申请和释放的时候,能更快地进行内存分配(对比malloc和free)
b.减少内存碎片,防止内存泄露。
2.内存池的原理
??? 内存池的原理非常简单,用申请一块较大的内存来代替N多的小内存块,当有需要malloc一块比较小的内存是,直接拿这块大的内存中的地址来用即可。
??? 当然,这样处理的缺点也是很明显的,申请一块大的内存必然会导致内存空间的浪费,但是比起频繁地malloc和free,这样做的代价是非常小的,这是典型的以空间换时间。
??? 一个典型的内存池如下图所示:
HYPERLINK /cnblogs_com/sld666666/WindowsLiveWriter/nginx3nginx_112BD/MemoryPool_Step5_2.png
图一:一个典型的内存池
?
??? 首先定义这样一个结构体:
?typedef struct MemoryBlock
{
char *Data ; //数据
std::size_t DataSize ; //总的大小
std::size_t UsedSize ; //已经用了的大小
MemoryBlock*Next ;
} MemoryBlock;
??? 一个内存池就是这样一连串的内存块组成。当需要用到内存的时候,调用此内存池定义好的接口GetMemory(),而需要删除的时候FreeMemory()。
??? 而GetMemory和FreeMemory干了什么呢?GetMemory只是简单返回内存池中可用空间的地址。而FreeMemory干了两件事情:一: 改变UsedSize 的值,二:重新初始化这一内存区域。
?
3.nginx中的内存池
3.1 nginx内存池的结构表示
??? 首先我们看一下nginx内存池的定义:
?
代码
struct ngx_pool_s { ngx_pool_data_t d;//表示数据区域 size_t max;//内存池能容纳数据的大小 ngx_pool_t * current;//当前内存池块(nginx中的内存池是又一连串的内存池链表组成的,应该指向最后一个fail 4的内存池的后继) ngx_chain_t* chain;//主要为了将内存池连接起来 ngx_pool_large_t* large;//大块的数据 ngx_pool_cleanup_t* cleanup;//清理函数 ngx_log_t* log;//写log};
?
nginx中的内存池和普通的有比较大的不同。nginx中的内存池是由N个内存池链表
组成的,当一个内存池满了以后,就会从下一个内存池中提取空间来使用。?
??
对于ngx_pool_data_t的定义非常简单???
typedef struct { u_char *last; u_char *end; ngx_pool_t *next; ngx_uint_t failed;} ngx_pool_data_t;
?
其中last表示当前数据区域的已经使用的数据的结尾。
end表示当前内存池的结尾。
next表示下一个内存池,前面已经说过,再nignx中,当一个内存池空间
不足的时候,它不会扩大其空间,而是再新建一个内存池,组成一个内存池链表。
failed标志申请内存的时候失败的次数。
在理解了这个结构体后面的就非常简单了。
current 表示当前可分配内存的内存池。
chain表示内存池链表。
large表示大块的数据。
对于ngx_pool_large_t定义如下:
struct ngx_pool_large_s { ngx_pool_large_t* next; void* alloc;};
?
此结构体的定义也是非常简单的。一个内存地址的指针已经指向下一个地址的指针。
这里再解释下为什么需要有large数据块。当一个申请的内存空间大小比内存池的大小还要大的时候,
malloc一块大的空间,再内存池用保留这个地址的指针。
Cleanup保持存着内存池被销毁的时候的清理函数。
typedef void (*ngx_pool_cleanup_pt)(void *data);
struct ngx_p
您可能关注的文档
- 2011年秋季计本10级《软件工程概论》第5讲(第4章:概要设计一).ppt
- 2011年河南省中招化学试题审题报告.doc
- 2011年第一季度公务员入党积极分子思想汇报最新版.doc
- 2011年综治计划.doc
- 2011年职评积分办法.doc
- 2011年苏州大学学生科技协会论坛部干事培训材料.doc
- 2011年英语第三轮复习巩固完善综合提高.doc
- 2011年运输大队交通安全工作总结.doc
- 2011年随想.doc
- 2011年高三计算练习4(附答案).doc
- 福莱特玻璃集团股份有限公司海外监管公告 - 福莱特玻璃集团股份有限公司2024年度环境、社会及管治报告.pdf
- 广哈通信:2024年度环境、社会及治理(ESG)报告.pdf
- 招商证券股份有限公司招商证券2024年度环境、社会及管治报告.pdf
- 宏信建设发展有限公司2024 可持续发展暨环境、社会及管治(ESG)报告.pdf
- 品创控股有限公司环境、社会及管治报告 2024.pdf
- 中信建投证券股份有限公司2024可持续发展暨环境、社会及管治报告.pdf
- 洛阳栾川钼业集团股份有限公司环境、社会及管治报告.pdf
- 361度国际有限公司二零二四年环境、社会及管治报告.pdf
- 中国神华能源股份有限公司2024年度环境、社会及管治报告.pdf
- 广西能源:2024年环境、社会及治理(ESG)报告.pdf
文档评论(0)