注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[nginx] ngx mempool  

2009-08-15 07:45:13|  分类: web_nginx |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
俄罗斯同学的 http server,据说很快很好用。我向来喜欢短小精悍的家伙,虽然我自己不做web,不过还是可以研究下,看看web的应用环境到底啥情况。
http://nginx.net/
http://wiki.nginx.org/

nginx 的代码结构很简洁,分为下面几个目录。
[core], [event], [os],此三者就是核心部分了,其中 event 管理事件分发,而 os 则是系统相关内容的封装,比如thread。
[http], [mail], 专项处理 http/mail 两大类协议。
[misc],杂项,每个项目里总会有点不知道归属哪个类别的东西。

看代码,自己总喜欢先翻翻 util func 之类的辅助类,一般对其他模块依赖比较少,读起来比较畅快。
nginx 实现了简单的内存池管理。(core/ngx_palloc.c|.h)
  1. 小块内存,申请了不释放 (free 整个 pool 的时候才一并干掉)
  2. 大内存,直接找系统 malloc/free
小内存块不释放的原因,个人理解为每次 http request 的过程总不会太长,一次 http request 后,所有的 pool 都会被干掉。多次分配一次释放,倒是清爽迅捷。而且统一从 pool 分配,很容易跟踪内存分配的情况。同时方便了代码的撰写,比如:
create_xxx(ngx_pool_t *pool)
{
    a = ngx_palloc(pool, size_a);
    if ( a == NULL ) { return ERR_A; }
    ...
    b = ngx_palloc(poo, size_b);
    if ( b == NULL ) { return ERR_B; }
    return CREATE_OK;
}
外层函数根据返回值判断,如果失败,可以整体删除 pool 即可。

ngx mempool 里稍微有点 trick 的地方,就是 struct ngx_pool_s 在 ngx_create_pool/ngx_palloc_block 两个地方,采用了不同的用法。其中 palloc_block 的 pool_s 并不会使用 ngx_pool_data_t d 之外的任何 field。
struct ngx_pool_s {
    ngx_pool_data_t       d;
    size_t                max;
    ngx_pool_t           *current;
    ngx_chain_t          *chain;
    ngx_pool_large_t     *large;
    ngx_pool_cleanup_t   *cleanup;
    ngx_log_t            *log;
};

--- nginx 0.7.61
  评论这张
 
阅读(863)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017