Linux Slab分配器 一 概述

2021-08-26 22:55:05 字數 1105 閱讀 3344

slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類(如程序描述符就是一類),每當要申請這樣乙個物件,slab分配器就從乙個slab列表中分配乙個這樣大小的單元出去,而當要釋放時,將其重新儲存在該列表中,而不是直接返回給夥伴系統。slab分配物件時,會使用最近釋放的物件記憶體塊,因此其駐留在cpu快取記憶體的概率較高。

用於描述和管理cache的資料結構是struct kmem_cache

struct kmem_cache ;

struct kmem_list3 ;
描述和管理單個slab的結構是struct slab

struct slab ;
還要介紹的乙個資料結構就是struct array_cache。struct kmem_cache中定義了乙個struct array_cache指標陣列,陣列的元素個數對應了系統的cpu數,和夥伴系統中的每cpu頁框快取記憶體類似,該結構用來描述每個cpu的本地快取記憶體,它可以減少smp系統中對於自旋鎖的競爭。在每個array_cache的末端都用乙個指標陣列記錄了slab中的空閒物件,分配物件時,採用lifo方式,也就是將該陣列中的最後乙個索引對應的物件分配出去,以保證該物件還駐留在快取記憶體中的可能性。實際上,每次分配記憶體都是直接與本地cpu快取記憶體進行互動,只有當其空閒記憶體不足時,才會從kmem_list中的slab中引入一部分物件到本地快取記憶體中,而kmem_list中的空閒物件也不足了,那麼就要從夥伴系統中引入新的頁來建立新的slab了,這一點也和夥伴系統的每cpu頁框快取記憶體很類似。

struct array_cache ;
slab分配器涉及到了一些繁雜的概念,這些在後面再逐一結合**進行講解,在理解slab分配器的工作之前,必須先理解上述這些資料結構之間的聯絡,下圖給出了乙個清晰的描述

Linux Slab分配器(一)概述

slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類 如程序描述符就...

Linux Slub分配器 一 概述

slab分配器一直處於核心記憶體管理的核心地位,儘管如此,它還是擁有自身的缺點,最明顯的兩點就是複雜性和過多的管理資料造成的記憶體上的開銷。針對這些問題,linux引入了slub分配器,slub分配器保留了slab分配器的所有介面,實際上slub分配器的模型和slab分配的模型是基本一致的,只不過在...

Linux slab 分配器詳解

投稿收藏 良好的作業系統效能部分依賴於操作 系統有效管理資源的能力。在過去,堆記憶體管理器是實際的規範,但是其效能會受到記憶體碎片和記憶體 需求的影響。現在,linux?核心使用了源自於 solaris 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配...