Linux 記憶體管理: Kmalloc(2)

發表於2015-09-22

上一篇文章中簡單說了下slab分配器下kmalloc是如何分配記憶體的。在看cache_alloc_refill這個函式的時候邏輯上還有一些困惑。

主要是關於 batchcount = ac->batchcount; 的問題。在預設初始化的時候即在kmem_cache_init中系統的cache都會呼叫到__kmem_cache_create中setup_cpu_cache的有這樣一段程式碼:

那麼我是不是就可以認為ac->batchcount的值就是1了呢?那麼 ac_put_obj的時候只放一個obj到array中。每次都這樣,那麼在__cache_alloc中

它的意義又何在呢? 因為batchcount為1的話,每次放入一個obj到array 設定avail從0到1,但是get一個obj後,avail又為0了。當然這樣效率很低。
後來才發現是自己程式碼沒看全- -, 我們看這樣一段程式碼它在kmem_cache_init初始化後,呼叫的

這個函式就是把slab_caches連結串列上的所有cache都呼叫enable_cpucache(cachep, GFP_NOWAIT)一遍!

對我們看到了limit 、shared 、 batchcount的新初始化.

而具體實現在

我們就看看do_ccupdate_local做了什麼

這樣就和函式cache_alloc_refill接起來了
我們可以看看實際的核心開啟slab的資訊:

或許你看ubuntu系統的時候發現limit batchcount值為0 ,其實它是用了slub分配器.在slub.c中

這裡順便說明一下關於slab、slub、slob的簡單區別:(具體如何實現的請參考核心程式碼slab.c /slub.c/slob.c)
slab是slub和slob的基礎。

SLOB的目標是針對嵌入式系統的,主要是適用於那些記憶體非常有限的系統,比如32MB以下的記憶體,它不太注重large smp系統,雖然最近在這方面有一些小的改進

SLUB allocator,用於替代 slab 程式碼。通過取消了大量的佇列和相關開銷、簡化 slab 的結構,SLUB 承諾提供更好的效能和更好的系統可伸縮性,並且可以同時保持現有的 slab 分配器介面

說了這麼多,我們用個圖來簡單描述下slab機制:

相關文章