现在的位置: 首页 > 综合 > 正文

内存分配相关

2013年06月16日 ⁄ 综合 ⁄ 共 940字 ⁄ 字号 评论关闭

1. 系统功能封装

内存相关的操作主要在 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 下

其中 os/unix/ngx_alloc.{h,c} 封装了最基本的内存分配函数,是对c原有的malloc/free/memalign 等原有的函数的封装,对应的函数为:

  • ngx_alloc 使用malloc分配内存空间
  • ngx_calloc 使用malloc分配内存空间,并且将空间内容初始化为0
  • ngx_memalign 返回基于一个指定的alignment大小的数值为对齐基数的空间
  • ngx_free 对内存的释放操作

2. ngx的内存池

为了方便系统模块对内存的使用,方便内存的管理,nginx自己实现了进程池的机制来进行内存的分配和释放, 首先nginx会在特定的生命周期帮你统一建立内存池,当需要进行内存分配的时候统一通过内存池中的内存进行分配,最后nginx会在适当的时候释放内存池的资源,开发者只要在需要的时候对内存进行申请即可,不用过多考虑内存的释放等问题,大大提高了开发的效率。

内存池的主要结构为:

typedef struct {
    u_char               *last;    //当前内存池分配到此处,即下一次分配从此处开始
    u_char               *end;     //内存池结束位置
    ngx_pool_t           *next;    //内存池里面有很多块内存,这些内存块就是通过该指针连成链表的
    ngx_uint_t            failed;  //内存池分配失败次数
} ngx_pool_data_t;                 //内存池的数据块位置信息


struct ngx_pool_s {                //内存池头部结构
    ngx_pool_data_t       d;       //内存池的数据块
    size_t                max;     //内存池数据块的最大值
    ngx_pool_t           *current; //指向当前内存池
    ngx_chain_t          *chain;   //该指针挂接一个ngx_chain_t结构
    ngx_pool_large_t     *large;   //大块内存链表,即分配空间超过max的内存
    ngx_pool_cleanup_t   *cleanup; //释放内存池的callback
    ngx_log_t            *log;     //日志信息
};
   
其中,sizeof(ngx_pool_data_t)=16B,sizeof(ngx_pool_t)=40B。 

抱歉!评论已关闭.