對於slab對象分配和釋放的理解

是時候該寫下一些東西了,雖然接觸的時間不長,可幫助別人講解有助於理清思路,並且把好的東西拿出來與人分享也是一件愉快的事,我寫的東西徹底不一樣於書本,引文都是個人理解和感覺不會照書抄,寫的不對的地方但願有人指點,固步自封是對技術進步的最大阻力。緩存

分析slab 源碼也有幾天了,更深層次的東西我還摸不出來,但一些框架和思想我卻有了本身的理解。長話短說,這不是一篇介紹源碼的博文,只是一些思想,有助於你在看書時理清思路,避免被書中的繁瑣的步驟搞暈。框架

在多cpu系統裏,若是多個cpu 對一塊高速緩存爭用是件很麻煩的事情,要不停得上鎖釋放鎖,還要排隊,很浪費時間,所以一塊緩衝區中劃分了多個小的區域,每個區域屬於一個cpu全部——本地高速緩存。並且還單獨劃分一個區域,全部cpu能夠共享的區域,叫作共享本地高速緩存。並且把每一個cpu 所屬的高速緩存中的三種中slab(free ,partial_free,full)連接起來,造成3個鏈表。對象

當分配器接到分配對象的請求時,先從本地高速緩存分配對象,若是本地高速緩存空閒對象爲0,那麼就要從共享本地高速緩存中分配,若是這個緩存空閒對象仍是爲0,那麼就要從partial_full 和free 鏈表中查找空閒對象,若是不存在這樣的鏈表,就要利用夥伴系統從內存中分配若干頁框,建立一個slab ,而後分配對象。內存

 

當分配器接收到釋放對象的請求時,要遵循原則——屬於哪一個slab 的對象就歸還給哪一個slab 。因此在歸還時要選擇歸還在本地緩存的slab中,若是空閒對象已達到上限,那麼就要騰空batchconut 個對象給共享本地高速緩存,達到能夠把對象歸還到本地緩存中的目的 ,若是共享本地高速緩存空閒對象也達到上限,那麼就要把一些slab從本地緩存中拿走(多是一個,多是多個。)歸還給分配器,分配器如何對待,要看具體狀況。若是釋放了batchcount 個對象後:源碼

  1. 整個slab 中全部對象都空閒,並且cachep->list.free_bojects > cachep_free_limit 就銷燬這個slab ,把頁框歸還給內存。it

  2. 整個slab 中全部對象都空閒,可是cachep->list.free_bojects < cachep_free_limit 就把該slab 加入到cachep->lists.slabs_free中,請求

  3. 整個slab 中有一些對象被使用,那麼就加入到cache->lists.slabs_partial鏈表中。im

有人可能會疑惑,此時slab 屬於哪一個緩存,我也不知道,只知道被加入了slab 分配器管轄的鏈表中。技術

在slab 分配器內請求和釋放的層次:鏈表

請求:本地高速緩存——共享本地高速緩存————slab分配器(slab分配器主管3個鏈表)——夥伴系統分配頁框

釋放:本地高速緩存——騰空batchcount個空閒對象(不成功)————slab分配器

下面這張圖對於分配和釋放過程描述的已經很詳盡了,畢竟我不能把全部東西都講出來,由於你們不是小學生,有些東西要靠本身動腦去思考

相關文章
相關標籤/搜索