nginx內存管理--大塊內存空間申請 ngx_palloc_large

關於內存池裏面大塊內存插入的時候,有點小疑惑,網上關於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

“`

發佈了50 篇原創文章 · 獲贊 48 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章