很多基礎的概念,將跨越軟體的層次而存在,比如slab,對于內核人員,我們都知道slab是buddy之上的一層,

因為buddy作為Linux內核最底層的記憶體管理器,它分配1頁,2頁,4頁,2n頁,但是作為內核的堆用戶本身,經常只是呼叫kmalloc()申請一個小記憶體,或者呼叫kmem_cache_alloc()申請一個資料結構,2n頁給它,會形成大量碎片浪費,所以slab找buddy要了2^n頁后,內部切割為同樣size的object,再給kmalloc和kmem_cache_alloc()拿走,

它的邏輯如下:
這樣一種軟體本質意義上的需求,不會因為只是內核就需要,比如同樣的slab演算法,也被著名的用戶態軟體Memcached需要著,
Memcached是一種分布式記憶體物件快取系統,用于動態Web等應用以減輕資料庫的負載,它在記憶體中快取資料和物件,使用key-value對形式存盤,它的網站首頁
https://memcached.org/
顯示了它的基本用法邏輯:

Memcached的原理也類似內核態page cache的原理:

比如你查詢一個資料庫,可以先看看Memcached里面有沒有命中,命中就直接從Memcached的記憶體里面拿到值了,沒有的時候才需要去查資料庫,查到后,可以把結果放入Memcached,這樣下次再訪問同樣資料,不再需要進行資料庫的查詢動作,
Memcached也同樣采用slab分配演算法來組織資料的存放,里面可以組織不同大小的chunks:

正如Linux內核的每一種不同slab里面的object的大小不一樣,
我們安裝1個Memcached:
$ sudo apt-get install memcached
然后啟動起來,你馬上看到memcached列印說自己創建了各種不同chunk size的slab:

當然,還有更多的相似性,比如Memcached里面的物件,也是LRU演算法替換,所以LRU這種,也是一種本質上的事情,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/295870.html
標籤:嵌入式
