nginx内存管理--大块内存空间申请 ngx_palloc_large

本文详细解析了nginx内存管理中关于大块内存插入的优化策略,包括内存池的分配机制、内存块的插入方式以及背后的逻辑原理。通过分析内存池的内部实现,揭示了为何选择特定的插入策略来提高查找效率,以及这种策略背后的经验值设定。深入探讨了nginx内存管理的高效性和灵活性,为开发者提供了一种优化内存使用、提升系统性能的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于内存池里面大块内存插入的时候,有点小疑惑,网上关于nginx内存管理的帖子也很多,但是关于我这个问题很少有讲的非常明白

if !NGX_DEBUG_POOL

static void *ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
void *p;
ngx_uint_t n;
ngx_pool_large_t *large;

p = ngx_alloc(size, pool->log);
if (p == NULL) {
    return NULL;
}

n = 0;

for (large = pool->large; large; large = large->next) {
    if (large->alloc == NULL) {
        large->alloc = p;
        return p;
    }

//关于“3”这个值,大于3采用头插法,小于3采用尾插法,这样的好处就是你最近插入的点,查找的效率快很多。但是为什么这个值是3,个人认为有可能是经验值

         if (n++ > 3) {
                      break;
                }
    }
large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
if (large == NULL) {
    ngx_free(p);
    return NULL;
}

large->alloc = p;
large->next = pool->large;
pool->large = large;

return p;

}

else

static void *
ngx_palloc_large(ngx_pool_t *pool, size_t size)
{
void *p;
ngx_pool_large_t *large;

p = ngx_alloc(size + sizeof(ngx_pool_large_t), pool->log);
if (p == NULL) {
    return NULL;
}

large = (ngx_pool_large_t *)((u_char *)p + size);
if (large == NULL) {
    ngx_free(p);
    return NULL;
}

large->alloc = p;
large->next = pool->large;
pool->large = large;

return p;

}

endif

“`

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值