haproxy内存池概述
内存池按照类型分类,每个类型的内存池都有一个名字,用链表记录空闲的内存块,每个内存块大小相等,并按照16字节对齐。
haporxy用pool_head 结构记录内存池
struct pool_head { void **free_list; /* 空闲链表 */ struct list list; /* 双向链表,链接每种类型的内存池 */ unsigned int used; /* 使用了多少内存块 */ unsigned int allocated; /* 分配了多少内存块 */ unsigned int limit; /* 内存块上限 */ unsigned int minavail; /* 最少保留几个,回收时不会全部回收 */ unsigned int size; /* 内存块大小 */ unsigned int flags; /* 能否共享,类型不同,但大小相同的,能否共享一个pool_head */ unsigned int users; /* 内存池有几个使用者 */ char name[12]; /* 内存池名称 */};
在程序执行过程中,产生的内存池,很有可能按照大小,排列成如下方式:
内存池的创建
haproxy创建内存池时,会先检查内存池中,有没有与所需大小相同的内存池,有且内存池可共享,将pool_head.users++。若没有,则新创建一个内存池。
struct pool_head *create_pool(char *name, unsigned int size, unsigned int flags){ struct pool_head *pool; struct pool_head *entry; struct list *start; unsigned int align; //按照16字节对齐 align = 16; size = (size + align - 1) & -align; //pools是全局变量,内存池的头节点 star