创见内存怎么样 创建服务器内存( 三 )


if (large->alloc == NULL) {
large->alloc = p;
return p;
}
if (n++ > 3) {// 为了避免过多的遍历,限制次数为 0
break;
}
}
// 当遍历的 ngx_pool_large_t 节点中 alloc 都有指向的内存时,从小块内存中分配一个 ngx_pool_large_t 节点用于挂载新分配的大内存
large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1);
if (large == NULL) {
ngx_free(p);
return NULL;
}
large->alloc = p;
large->next = pool->large;// 头插法 插入至大块内存链表中
pool->large = large;
return p;
}
第一次大块内存分配后的结构如下:


创见内存怎么样 创建服务器内存

文章插图
文章插图


创见内存怎么样 创建服务器内存

文章插图
文章插图

总结ngx_pool_t 内存分配方面
【创见内存怎么样 创建服务器内存】通过 current 和 d.next 来访问其他的内存池结构插入方式小块内存池通过尾插法插入至内存池链表的尾端大块内存通过头插法插入至large链表的首部限制次数小内存分配失败(failed)次数大于4次后就不再作为分配内存的池子了大内存只寻找 large 链表中前三节点是否可以挂载新分配的内存内存对齐,多处内存对齐减少内存跨 cache 的数量其实总体而言这是一个比较简单的内存池了,还是有一些内存浪费的地方,限制次数 可以说明这个情况,不过这也是在简单、高效和内存分配上的一个平衡了

经验总结扩展阅读