slab分配器形象地說就是先由夥伴機制申請空閒記憶體空間,然後slab分配器再把這個記憶體空間進行分割,按同樣大小來進行分割,最後再用一些資料結構來進行管理。上面只是形象地說法。我們平時把由slab進行分割後的記憶體我們稱之為快取記憶體記憶體。這樣看來就知道所謂的高速就是說不是每次分配和釋放記憶體都要找夥伴機制,可以先訪問這些高速記憶體的,和我們前面文章中提到的冷熱區是乙個作用的。我們會發現我們原來說的冷熱區和夥伴機制,都是以頁為單位進行分配的。這就有點限制了,為什麼我不可以再按小點的記憶體去分配呢?所以就產生了slab分配器了。
當我們從快取記憶體記憶體中分配物件時(這裡我們不再說記憶體頁了,我們該為物件,即記憶體物件),首先檢查對應處理器的快取記憶體記憶體陣列中是否有未使用的記憶體物件。什麼是處理器的快取記憶體記憶體陣列?--kmem_cache_t結構裡面也為每個處理器預留乙個高速緩衝記憶體陣列(struct array_cache),我們都是用其成員*array[nr_cpus]這個指標陣列裡面的每個成員都是指向struct array_cache結構變數,緊跟在struct array_cache結構後面的是連續存放的該struct array_cache結構指定個數的物件指標,這些指標指向的物件就是將來要被分配的空間。kmem_cache_t結構就是算是我們說的快取記憶體記憶體的描述結構。
如果我們發現對應處理器的快取記憶體記憶體陣列中有未使用的記憶體物件,直接把我們剛才說的struct arrary_cache結構指定個數的物件指標傳給呼叫者。如果沒有,那麼首先查詢共享快取記憶體記憶體陣列中是否有可用的物件,在快取記憶體記憶體描述結構(struct kmem_cache_t)中有乙個成員可以訪問到它,就是struct kmem_list3 lists中的share成員。其實這個是真正多個cpu的時候才會採取的方案。如果發現這裡有可用記憶體物件的話,我們先把記憶體物件的位址複製到對應處理器的快取記憶體記憶體陣列中,再從處理器的快取記憶體記憶體陣列中分配物件。
一般情況如果共享快取記憶體記憶體陣列中也沒有可用物件時,我們就去查詢部分空閒和全部空閒slab列表。struct kmem_list3 lists是快取記憶體記憶體描述結構struct kmem_cache_t的成員,這個鍊錶結構就是用來描述上述的slab列表。鍊錶結構描述了三種快取記憶體記憶體單位,由乙個struct slab結構管理的一組特定大小的記憶體物件叫做乙個快取記憶體記憶體單位,乙個記憶體單位包括一些大小一致的記憶體物件、一些色塊(不會被呼叫的,只是起到對齊的用途)、乙個struct slab結構、與每個記憶體物件一一對應的kmem_bufctl_t變數。每個快取記憶體記憶體單元都有或者沒有空閒物件。所以鍊錶結構(list)就根據快取記憶體記憶體單元中空閒物件的情況分成3類,list.slabs_partial(部分空閒)
list.slabs_full(沒有空閒)、list.slabs_free(全部空閒)。我們會直接看看list.slabs_free和list.slabs_partial鍊錶是否為空,如果不為空,我們就通過第乙個struct slab找到對應的快取記憶體記憶體單元,在其中複製一定數量的物件位址到對應處理器的快取記憶體記憶體陣列中,然後我們在到這個陣列裡去分配物件。如果上述的鍊錶都為空的,那麼就從夥伴系統中申請乙個新的快取記憶體記憶體單元,這樣就利用這個單元做上述一樣的動作。
上面說的是分配的過程,對於釋放,其實過程也是類似的,由於篇幅的原因,我這裡就不再細講了,讀者可以通過**自行進行總結。
下面我們先來介紹下快取記憶體記憶體的初始化函式,kmem_cache_init()。以下是它的具體**。
void __init kmem_cache_init(void)
sizes->cs_dmacachep=kmem_cache_create(names->name_dma,sizes->cs_size,arch_kmalloc_minallgn
,(arch_kmalloc_flags|slab_cache_dma|slab_panic),null,null);
//建立dma快取記憶體記憶體的描述結構kmem_cache_t的指標賦給cs_dmacachep。
sizes++;//這裡是指向malloc_sizes下乙個指標。
names++;//這裡是指向malloc_names下乙個指標。
}g_cpucache_up = full;//將所有cpu的cache使能。
register_cpu_notifier(&cpucache_notifier);//對於不是多處理器時,該函式為空。
記憶體分配和釋放
自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存標題所使用的記憶體指標...
記憶體分配和釋放
三 記憶體分配和釋放 自從學習了c語言,老師就教導我們說 對於動態記憶體的申請和釋放,一定要遵守 誰申請,誰釋放 的原則。在此原則的指導下,不僅是我 不僅是你,就連特級大師都設計了這樣怪怪的函式 函式說明 getwindowtext hwnd,lptstr,int 取得視窗標題。需要在引數中給出儲存...
C 中記憶體分配和釋放的函式
c語言的標準記憶體分配函式有 malloc,calloc,realloc,free等。c 的記憶體分配和釋放函式為new和delete。下面對alloca malloc calloc realloc等函式進行詳細說明。alloca是向棧申請記憶體,無需進行釋放。malloc分配的記憶體是位於堆中的,...