很多基礎的概念,將跨越軟件的層次而存在。比如slab,對于內核人員,我們都知道slab是buddy之上的一層。
因為buddy作為Linux內核最底層的內存管理器,它分配1頁,2頁,4頁,2^n頁,但是作為內核的堆用戶本身,經常只是調用kmalloc()申請一個小內存,或者調用kmem_cache_alloc()申請一個數據結構,2^n頁給它,會形成大量碎片浪費。所以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這種,也是一種本質上的事情。
編輯:jq
-
Web
+關注
關注
2文章
1304瀏覽量
74470 -
Linux
+關注
關注
88文章
11760瀏覽量
219033 -
數據庫
+關注
關注
7文章
4020瀏覽量
68349 -
管理器
+關注
關注
0文章
265瀏覽量
19522
原文標題:宋寶華:slab在內核內存管理和用戶態Memcached的雙重存在
文章出處:【微信號:gh_6fde77c41971,微信公眾號:FPGA干貨】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
Redis內存管理、持久化策略與慢查詢排查分析
【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配
rk基于linux/android內存管理
Linux內核模塊的加載機制
飛凌嵌入式ElfBoard-文件I/O的了解探究之Linux系統的文件管理機制
RusT-Thread:基于Rust面向資源受限嵌入式設備的操作系統的實踐 | 技術集結
求助,關于rt-smart用戶態線程實時性差的問題求解
qkey軟件包在內核V5.02下運行出錯是哪里的問題?
靈活高效ZBUFF — C內存數據操作庫:優化內存管理的利器
探究slab在內核內存管理和用戶態Memcached的雙重存在
評論