slab內存管理分享

 

1.什麼是slab

Slab 是中內存管理算法,最先是由sun的工程師提出,主要是基於一下因數考慮:算法

 

1:內核函數常常傾向於反覆請求相同的數據類型。好比:建立進程時,會請求一塊內存來存放mm結構。

2:不一樣的結構使用不一樣的分配方法能夠提升效率。一樣,若是進程在撤消的時候,內核不把mm結構釋放掉,而是存放到一個緩衝區裏,之後如有請求mm存儲空間的行爲就能夠直接從緩衝區中取得,而不需從新分配內存.

3:前面咱們曾分析過,若是夥伴系統頻繁分配,釋放內存會影響系統的效率,以此,能夠把要釋放到的內存放到緩衝區中,直至超過一個閥值才把它釋放至夥伴系統,這樣能夠在必定程度上緩減減夥伴系統的壓力

4:爲了緩減「內碎片」的產生,一般能夠把小內存塊按照2的倍數組織在一塊兒,這一點和夥伴系統相似數組

 

 

2.slab算法的具體思想

 

slab的思想是將內存分紅大小不等的slabs chunks(先分紅大小相等的slabs,而後每一個slab被分紅大小相等chunks,不一樣slabchunk大小是不相等的)。chunk的大小依次從一個最小數開始,按某個因子增加,直到達到最大的可能值。緩存

 若是最小值爲400B,最大值是1MB,因子是1.20,各個slabchunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B 多線程

分配對象時根據對象的大小選擇合適的slab,在對應的slab中分配一個對象,若是對應的slab沒有空閒的空間時,則再向系統請求一個slab,在分配。函數

釋放對象時根據直接將對象只須要將對應的slab中的對象置爲空閒狀態便可。性能

這種思想能夠靈活的運用,其主要的目的就是根據對內存區的使用頻率來對它分類,建立一組特定大小的專用緩衝區進行處理,以免內碎片的產生。對於較少使用的內存區,能夠建立一組通用緩衝區來處理(如咱們的代碼中的大內存分配),即便這種處理模式產生碎片,也對整個系統的性能影響不大。優化

 

Linux 內核對slab的運用:spa

 

1.什麼是slab

Slab 是中內存管理算法,最先是由sun的工程師提出,主要是基於一下因數考慮:線程

 

1:內核函數常常傾向於反覆請求相同的數據類型。好比:建立進程時,會請求一塊內存來存放mm結構。

2:不一樣的結構使用不一樣的分配方法能夠提升效率。一樣,若是進程在撤消的時候,內核不把mm結構釋放掉,而是存放到一個緩衝區裏,之後如有請求mm存儲空間的行爲就能夠直接從緩衝區中取得,而不需從新分配內存.

3:前面咱們曾分析過,若是夥伴系統頻繁分配,釋放內存會影響系統的效率,以此,能夠把要釋放到的內存放到緩衝區中,直至超過一個閥值才把它釋放至夥伴系統,這樣能夠在必定程度上緩減減夥伴系統的壓力

4:爲了緩減「內碎片」的產生,一般能夠把小內存塊按照2的倍數組織在一塊兒,這一點和夥伴系統相似對象

 

 

2.slab算法的具體思想

 

slab的思想是將內存分紅大小不等的slabs chunks(先分紅大小相等的slabs,而後每一個slab被分紅大小相等chunks,不一樣slabchunk大小是不相等的)。chunk的大小依次從一個最小數開始,按某個因子增加,直到達到最大的可能值。

 若是最小值爲400B,最大值是1MB,因子是1.20,各個slabchunk的大小依次是:slab1 - 400B slab2 - 480B slab3 - 576B

分配對象時根據對象的大小選擇合適的slab,在對應的slab中分配一個對象,若是對應的slab沒有空閒的空間時,則再向系統請求一個slab,在分配。

釋放對象時根據直接將對象只須要將對應的slab中的對象置爲空閒狀態便可。

這種思想能夠靈活的運用,其主要的目的就是根據對內存區的使用頻率來對它分類,建立一組特定大小的專用緩衝區進行處理,以免內碎片的產生。對於較少使用的內存區,能夠建立一組通用緩衝區來處理(如咱們的代碼中的大內存分配),即便這種處理模式產生碎片,也對整個系統的性能影響不大。

 

Linux 內核對slab的運用:

 

Memcache slab的運用:

 

 

 

3.使用slab的優缺點

優勢:減小內存碎片,提升訪問效率。

缺點:通用的slab實現,會浪費約1/2的空間(好比咱們的memcache中的slab);

 

 

4.slab malloc/free 對比

應用層Slab的實現,其實是徹底基於malloc來實現的。簡單說使用slab分配內存就是減小malloc的調用次數,減小調用malloc的次數所帶來的好處就是slab的價值或者其提升性能的關鍵點。因此瞭解malloc的機制是理解slab的存在做用的必要條件。

少調用malloc:減小內存碎片, 減小頁請求次數, 減小破壞高速緩存的次數, 減小free 減小頁換入喚出(swap

相關性能消耗點:內存合併,頁調整, 高速緩存寫入

其中的具體細節有興趣能夠本身去研究。

 

5.咱們的slab

在具體看代碼以前,咱們先來看一組數據:

下圖中是使用slab(圈中數據)和malloc/free(框中數據)分配相同次數相同大小的內存時間消耗對比。這些數據過小,而且內存充足不足以徹底反映實際狀況,可是能夠證實slab在性能上的提高。

 

 

 

6.能夠進行的優化和改進

更具咱們的須要,咱們能夠增長一些優化策略,使咱們的內存利用率最高。可是不一樣優化策略都須要額外的數據,這些數據可能須要額外的線程進行統計和分析,相對而言,可能內存利用率上升了,可是系統效率可能會降低。因此這是一個雙刃劍,能夠更加個人資源和須要選擇一個平衡點。

1.重分配

2.峯值釋放

3.制定單線程多線程容許模式

相關文章
相關標籤/搜索