GLIBC記憶體池管理 分箱管理

2021-09-16 14:30:40 字數 2151 閱讀 7169

1. glibc記憶體管理核心結構

1.1. malloc_chunk

struct malloc_chunk ;

struct malloc_chunk,該結構是glibc中記憶體管理的最小單元,每個使用者分配的最小記憶體塊必須為「2 * (user_size + offsetof(struct malloc_chunk, fd_nextsize))」,且與sizeof(size_t)的大小進行對齊。在32位機上size_t為4個位元組,64位機上為8個位元組。

1.2. malloc_state

struct malloc_state

;malloc_state結構是glibc進行記憶體分箱管理的核心基礎結構。

在多執行緒環境中,為了提高記憶體管理效率,glibc對其提供了不同的管理策略,主要有:主線程管理和執行緒管理,即main_arena(該結構是乙個全域性靜態變數,存放在記憶體資料段)和thread_arena(主要為執行緒提供記憶體管理機制)。這樣glibc就會以main_arena為核心,將所有記憶體管理記憶體管理arena與main_arena進行管理起來(用乙個雙向鍊錶進行管理)。

注:arena是malloc_state結構

1.3. 記憶體管理arena是否是無限增大?

答案是否定的,arena的大小將會受到系統cpu核數的限制,一般為:核數 * sizeof(size_t)。

1.4. arena記憶體管理原理

對程序內的每個arena必須保證其原子操作,這樣就會對每個arena在進行記憶體分配和釋放時進行加鎖保護。在多執行緒環境中,記憶體分配策略為:當使用者請求一塊記憶體時,glibc首先會從main_arena開始,先獲取該arena的鎖,如果成功則基於該arena進行記憶體分配,否則繼續向下個arena進行查詢。如果所有arena查詢完畢均不能滿足使用者請求的記憶體大小,則glibc將會利用chunk_top(下文介紹)來為使用者分配記憶體。

2. arena記憶體分箱管理

從malloc_state結構中可知,該結構包含fastbinsy,top,bins和binmap等核心結構。

2.1. fastbinsy

fastbinsy字面意思就是快速箱子,在記憶體管理過程中除了tcache外,它的優先順序最高。工作原理:在使用者請求記憶體時,arena將會從其對應的fastbinsy中進行查詢,看如果滿足使用者請求,則直接將其返回給使用者使用。在fastbinsy中,其記憶體大小一般為128bytes(64位機中)。

2.2. bins

bins是乙個大小為128的大陣列,並將其分為4類:bins[0]被稱為unsorted bin;bins[2-63]被稱為samll bin;bins[64-127]被稱為large bin。

2.3. top

在乙個程序中,top扮演堆頂的角色,在linux中堆是向上增長,即想要堆進行增長就必須通過sbrk系統呼叫增加top的大小。

3. glibc正真的記憶體池

從上面基礎知識介紹後 ,開始glibc記憶體池介紹。在glibc記憶體分箱管理前提下,每次使用者請求malloc的記憶體塊,經過free後並不是立馬huan還給作業系統,而是直接快取在arena中,如:fastbinsy、samll bin、large bin和unsorted bin(該順序是按照分配和釋放的優先順序來排列)。

malloc過程優先順序:fastbinsy——>samll bin——>large bin——>unsorted bin——>top(最後一步為增長堆空間滿足使用者請求)

free過程優先順序:fastbinsy——>samll bin——>large bin——>unsorted bin——>top(釋放堆空間)

從上面的優先順序順序可知,從系統重新獲取記憶體的優先順序最低,這樣可以減少系統呼叫造成的效能開銷;將記憶體還給系統的優先順序也是最低的,只有滿足當前釋放的記憶體大於或等於top所對應的記憶體大小(即:user_size >= top_chunk_size),在glibc中top chunk大小一般為128kb。

4. glibc堆空間增加與減少

在多執行緒主線程的堆空間主要通過sbrk系統呼叫進行擴充套件和縮減;而其他執行緒的堆空間主要通過mmap和munmap進行擴充套件和縮減。

4. malloc_trim

通過呼叫malloc_trim(0),可以將glibc快取的記憶體直接還給作業系統。malloc_trim函式是直接修改top chunk的大小,將所有arena中fastbinsy對應的chunk塊與相鄰空閒chunk塊進行合併,然後一次性返還給系統。

時間箱管理

時間箱管理是敏捷方法中的一條實踐,其含義是在專案中的某些活動的完成時間必須在規定的時間內完成。該實踐有助於提高整個專案的工作效率,避免帕金森現象。在敏捷方法裡時間箱管理的具體體現包括 1 每次迭代必須在固定的時間內完成,比如2周或1個月等,本次迭代必須交付乙個質量得到充分檢驗的 可以執行的軟體版本,...

時間箱管理

時間箱管理是敏捷方法中的一條實踐,其含義是在專案中的某些活動的完成時間必須在規定的時間內完成。該實踐有助於提高整個專案的工作效率,避免帕金森現象。在敏捷方法裡時間箱管理的具體體現包括 1 每次迭代必須在固定的時間內完成,比如2周或1個月等,本次迭代必須交付乙個質量得到充分檢驗的 可以執行的軟體版本,...

glibc記憶體管理方式

程式設計師接觸的記憶體空間和系統接觸的物理記憶體空間是有所區別的。對於一般程序來講,他面對的是乙個線性虛擬記憶體空間 位址從0到最大值。每乙個程序面對的虛擬記憶體空間都是一樣的,都享有全部的記憶體位址。虛擬記憶體空間是線性的,但並不意味著是連續的。部分位址段的虛擬空間可以是缺失的 不是所有位址都可以...