slab機制解析

2021-10-01 21:20:21 字數 1237 閱讀 4948

2 原始碼解讀

slab是linux在夥伴系統之上的一種記憶體管理機制。夥伴系統最小的記憶體處理大小為4k(即一頁的記憶體大小),然而,實際使用記憶體過程中,很多都是小記憶體,為了提高記憶體申請釋放效率防止記憶體碎片的產生防止記憶體連續分配導致cpu快取命中率低,linux在夥伴系統之上設計出slab機制來解決這些問題。slab可以理解為它是linux核心的物件池

整個slab機制的資料結構如下圖。

注1 :page描述符中很多欄位是以union形式存在,所以最好結合原始碼檢視。

kmem_cache快取物件,每個kmem_cache對應一種object型別。各個字段意義如下:

kmem_cache_node是對於不同記憶體結點的快取結構體。主要由三個list_head,即三個儲存slab描述符的鍊錶。slab是一組連續的頁框,這些頁框用來分配object所需的記憶體。

slab描述符結合在page描述符中,也就是page描述符描述slab的時候,就是slab描述符。至少在4.0的原始碼中看到的是這樣。書本所說,slab描述符儲存在兩個地方:

當物件小於512mb時,或者當內部碎片為slab描述符和物件描述符在slab中留下足夠的空間時,slab分配器選擇第二種方案。如果slab描述符存放在slab外部,那麼快取記憶體描述符的flags欄位中的c***s_off_slab標誌置為1;否則它被置為0。

三個儲存slab描述符的鏈表字段意義如下:

三個鍊錶會隨著狀態遷移。

page為頁描述符字段,同時,當巢狀的slab描述欄位中的flags為pg_slab時,表明是乙個slab描述符。在page描述符結構體中有兩個關鍵字段s_mem和freelist。

整個page所指向的記憶體結構如下圖:

整個記憶體前面為freelist指向;後面為object陣列,s_mem指向object 1的起始位址;中間為物件描述符陣列。

物件申請釋放過程如下:

其實關於slab的物件申請和釋放遠遠比這個複雜,這種方式會造成cpu快取行命中率降低。slab採用著色機制來打亂物件的分配順序。

詳解slab機制 1 slab是什麼

目前有很多講slab的文章,要麼是純講原理畫一堆圖結合原始碼不深導致理解困難,要麼是純 注釋導致理解更困難,我在猛攻了一周時間後,細緻總結一下slab,爭取從原理到原始碼都能細緻的理解到並立刻達到清楚的使用。有了夥伴系統buddy,我們可以以頁為單位獲取連續的物理記憶體了,即4k為單位的獲取,但如果...

夥伴系統和slab機制

夥伴系統 linux核心中採用了一種同時適用於32位和64位系統的記憶體分頁模型,對於32位系統來說,兩級頁表足夠用了,而在x86 64系統中,用到了四級頁表。四級頁表分別為 頁全域性目錄 page global directory 頁上級目錄 page upper directory 頁中間目錄 ...

Linux頁框 夥伴演算法以及slab機制

無論是上層應用還是作業系統核心開發,記憶體問題都是我們所需要關注的。我們來看看linux核心管理和分配機制。夥伴演算法 夥伴演算法從物理連續的大小固定的段上進行分配。從這個段上分配記憶體,採用 2 的冪分配器來滿足請求分配單元的大小為 2 的冪 4kb 8kb 16kb 等 請求單元的大小如不適當,...