slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類(如程序描述符就是一類),每當要申請這樣乙個物件,slab分配器就從乙個slab列表中分配乙個這樣大小的單元出去,而當要釋放時,將其重新儲存在該列表中,而不是直接返回給夥伴系統。slab分配物件時,會使用最近釋放的物件記憶體塊,因此其駐留在cpu快取記憶體的概率較高。
用於描述和管理cache的資料結構是struct kmem_cache:
struct kmem_cache ;
/*
* the slab lists for all objects.
*/struct kmem_list3 ;
描述和管理單個slab的結構是struct slab
/*
* struct slab
* * manages the objs in a slab. placed either at the beginning of mem allocated
* for a slab, or allocated from an general cache.
* slabs are chained into three list: fully used, partial, fully free slabs.
*/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
* * purpose:
* - lifo ordering, to hand out cache-warm objects from _alloc
* - reduce the number of linked list operations
* - reduce spinlock operations
* * the limit is stored in the per-cpu structure to reduce the data cache
* footprint.
* */
struct array_cache ;
slab分配器涉及到了一些繁雜的概念,這些在後面再逐一結合**進行講解,在理解slab分配器的工作之前,必須先理解上述這些資料結構之間的聯絡,下圖給出了乙個清晰的描述。
Linux Slab分配器 一 概述
slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類 如程序描述符就...
Linux Slub分配器 一 概述
slab分配器一直處於核心記憶體管理的核心地位,儘管如此,它還是擁有自身的缺點,最明顯的兩點就是複雜性和過多的管理資料造成的記憶體上的開銷。針對這些問題,linux引入了slub分配器,slub分配器保留了slab分配器的所有介面,實際上slub分配器的模型和slab分配的模型是基本一致的,只不過在...
Linux slab 分配器詳解
投稿收藏 良好的作業系統效能部分依賴於操作 系統有效管理資源的能力。在過去,堆記憶體管理器是實際的規範,但是其效能會受到記憶體碎片和記憶體 需求的影響。現在,linux?核心使用了源自於 solaris 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配...