haproxy內(nèi)存池概述

內(nèi)存池按照類型分類,每個類型的內(nèi)存池都有一個名字,用鏈表記錄空閑的內(nèi)存塊,每個內(nèi)存塊大小相等,并按照16字節(jié)對齊。
haporxy用pool_head 結(jié)構(gòu)記錄內(nèi)存池

struct pool_head {    void **free_list;   /* 空閑鏈表 */
    struct list list;   /* 雙向鏈表,鏈接每種類型的內(nèi)存池 */
    unsigned int used;  /* 使用了多少內(nèi)存塊 */
    unsigned int allocated; /* 分配了多少內(nèi)存塊 */
    unsigned int limit; /* 內(nèi)存塊上限 */
    unsigned int minavail;  /* 最少保留幾個,回收時不會全部回收 */
    unsigned int size;  /* 內(nèi)存塊大小 */
    unsigned int flags; /* 能否共享,類型不同,但大小相同的,能否共享一個pool_head */
    unsigned int users; /* 內(nèi)存池有幾個使用者 */
    char name[12];      /* 內(nèi)存池名稱 */};

在程序執(zhí)行過程中,產(chǎn)生的內(nèi)存池,很有可能按照大小,排列成如下方式:
大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計算培訓(xùn),高端軟件開發(fā)培訓(xùn),項目經(jīng)理培訓(xùn)

內(nèi)存池的創(chuàng)建

haproxy創(chuàng)建內(nèi)存池時,會先檢查內(nèi)存池中,有沒有與所需大小相同的內(nèi)存池,有且內(nèi)存池可共享,將pool_head.users++。若沒有,則新創(chuàng)建一個內(nèi)存池。

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字節(jié)對齊
    align = 16;
    size  = (size + align - 1) & -align;    //pools是全局變量,內(nèi)存池的頭節(jié)點
    star