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