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)存池,很有可能按照大小,排列成如下方式:
內(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