7.Nginx内存池

Nginx采用内存池来避免频繁的内存分配和释放导致的性能问题及内存碎片。内存池预分配内存块,并按需从块中分配空间,但可能导致生命周期不一致的对象占用空间直至最后一个对象释放,从而造成一定的空间浪费。这是一种牺牲空间换取效率的内存管理策略。
摘要由CSDN通过智能技术生成

如果我们在需要的时候才分配内存,使用完毕就释放,这种内存管理方式比较简单粗暴,但是会带来内存碎片的问题从而降低性能;

为了避免上述弊端,Nginx使用内存池来进行内存管理。预先申请一个或多个内存块,然后真正使用内存之时,从这些内存块分配空闲区间; 当内存块耗尽时,再次申请新的内存块。当然内存池也是有其他弊端的,假设在内存池中存放了3个对象A/B/C,这3个对象的生命周期不一致,C是最后使用完毕的,那么我们必须在C使用完毕后,才能销毁这个内存池,而在此之前A和B依旧占用着内存空间;因此说,内存池会造成空间浪费,是一种以空间换时间的内存管理方式。

/* ngx_core.h */
typedef struct ngx_pool_s        ngx_pool_t;

/* ngx_config.h */

/* 内存对齐: NGX_ALIGN就是平台的字长减1
   原理就是:  1.如果地址p是平台字长的整数倍, 那么就是对齐的
             2.如果地址p不是平台字长的整数倍, 那么向上取整使之能被平台字长整除 */
#define ngx_align(p)    (char *) ((NGX_ALIGN_CAST p + NGX_ALIGN) & ~NGX_ALIGN)

/* ngx_palloc.h */
typedef struct ngx_pool_large_s  ngx_pool_large_t;

struct ngx_pool_large_s {      // 大块内存结构体
    ngx_pool_large_t  *next;   // 指向下一个大块内存
    void              *alloc;  // 内存地址
};

struct ngx_pool_s {             // 内存池结构体
    char              *last;    // 记录内存池中可用区间的首地址
    char              *end;     // 记录内存池的结束地址
    ngx_pool_t        *next;    // 通过链表来管理内存池, 这里指向下一个内存池
    ngx_pool_large_t  *large;   // 大块内存链表
    ngx_log_t         *log;     // 日志句柄
};

/* ngx_palloc.c */

/*  创建内存池
    param size: 待创建的内存池大小
          log : 日志句柄 
*/
ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)
{
    ngx_pool_t  *p;

    // ngx_alloc实际上就是调用mall
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值