這半年來在工作上負責開發一個在Linux核心中的記憶體管理模組,主要用來處理視訊記憶體的需求。在開發的過程閱讀了不少資料,我將其中不錯的文章整理一下,或許對剛接觸的朋友會有點幫助:
- Memory management reference(MMR):這個網站非常適合新手入門記憶體管理。其中的幾篇入門文章寫得尤其好。從overview可以知道記憶體管理的技術範圍,從allocation可以知道malloc()/free()的基本實作手法與優缺點,從recycling則可以知道常見的garbage collection機制。
- Inside memory management(IMM):閱讀過MMR的基礎文章後,就可以從不同的角度去獨立學習。這篇文章講的是如何在Linux上實現一組最簡單的malloc()/free()。
- Buddy memory allocation(BMA):IMM這篇文章實現了簡單的記憶體配置,但馬上也面臨到嚴重的external fragmentation的問題,減緩的手法之一是透過buddy memory allocation,wikipedia上的說明非常清楚,實作的話可以參考對岸好手雲風的設計。
- Slab allocator:BMA的方式一定程度的減緩了external fragmentation,但卻也令小塊記憶體配置頻繁時的internal fragmentation的情況變得嚴重,解決手法很多,slab allocator試著解決這個問題,並提升了效能。實作方式可以參考libumem。
- What every programmer should know about memory:如果你想要深入學習記憶體管理技術,那麼從記憶體的硬體模組、計算機架構、作業系統的角度切入是不可或缺的,但是從頭閱讀數本教科書然後截取出跟記憶體相關章節有點累人,好在glibc的維護者寫了一篇好文章,介紹程式設計師所應該知道的基礎。
- 閱讀Linux source code:我是在有了前面這些基礎後,重新看Linux相關書籍與記憶體管理技術才有較深入的理解,包括MMU、page cache、hot-n-cold page、slab framework、swap...,畢竟Linux kernel hacker對很多名詞與概念都已經熟到相當程度,所以設計的許多機制都經過了好幾層的思考,在一頭栽入龐大的架構之前,先鍛鍊好基礎吧!
當然,記憶體管理的相關研究非常的多,永遠都有值得研究的新東西,在不同的workload下,不同的手法會有驚人的差異,沒有哪個手法是絕對性的勝利。另外,當garbage collection、multicore、分散式系統...引入後,都會讓記憶體管理的議題變得更複雜,好的記憶體管理手法往往扮演提升系統效能的核心角色。上述幾篇文章頂多只能算是進入到記憶體"配置"的大門,其他有趣的記憶體管理技術,待小弟有更多經驗後,再跟大家分享。:-)
留言
張貼留言