网站大量收购独家精品文档,联系QQ:2885784924

nginx内存池管理.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档