TLSF算法分析(内存分配算法详解)
注:本文的大部分內容摘錄自論文《TLSF: a New Dynamic Memory Allocator for Real-Time Systems》,可以通過“科學上網”訪問如下鏈接閱讀原文:http://www.gii.upv.es/tlsf/files/ecrts04_tlsf.pdf。
什么是TLSF
TLSF是Two Level Segregated Fit memory allocator的縮寫,是一種動態內存分配算法。名稱中有兩個關鍵詞,Segregated Fit和Two Level。
首先我們來了解什么是Segregated Fit。在內存分配算法中,空閑內存塊的管理是算法的核心。根據尋找空閑內存塊的策略,可以將內存分配算法分為以下幾種:
- Sequential Fit:將所有的空閑內存塊,放入到一個單向/雙向鏈表中。這是最基礎的管理策略。算法非常簡單,但尋找空閑內存塊的效率依賴于鏈表的大小。
- Segregated Fit:將所有的空閑塊,放入到一組鏈表中,每一個鏈表中只包含某一個大小范圍的空閑塊。例如最典型的dlmalloc算法。
- Buddy System: Segregate Fit算法的變種,具有更好的切割和合并效率,又很多變種,如Binary Buddies,Fibonacci Buddies, Weighted Buddies等。通常這類算法的內部碎片化問題比較嚴重。
- Indexed Fit:通過一些高階的數據結構來索引(Index)空閑的內存塊。例如基于平衡樹的“Best Fit”算法。
- Bitmap Fit: Indexed Fit算法的變種,通過一小段內存的位圖來標記對應的內存是空閑的還是使用中。
所以TLSF是一種通過一組鏈表來管理不同大小內存塊的內存分配算法。
為什么稱為Two Level?
基本的Segregated Fit算法是使用一組鏈表,每個鏈表只包含特定長度范圍來的空閑塊的方式來管理空閑塊的,這樣鏈表數組的長度可能會很大。如下圖,TLSF為了簡化查找定位過程,使用了兩層鏈表。第一層,將空閑內存塊的大小根據2的冪進行分類,如(16、32、64…)。第二層鏈表在第一層的基礎上,按照一定的間隔,線性分段。比如2的6次方這一段,分為4個小區間【64,80),【80,96),【96,112),【112,128).每一級的鏈表都有一個bitmap用于標記對應的鏈表中是否有內存塊。比如第一級別bitmap的后4bit位0100,即2的6次方這個區間有空閑塊。對應的第二級鏈表的bitmap位0010及【80,96)這個區間有空閑塊,即下面的89 Byte。
給定一個內存塊的大小,確定在兩級鏈表中的位置(f,s)的算法如下:
其中2的SLI次冪表示第二級鏈表的區間大小,比如上圖中,區間大小為16,即2的4次方。這樣大小為460字節的空閑快在鏈表中的位置為f=8,s=12,如下圖:
TLSF適用環境
實時系統RTOS對內存分配算法有以下兩個要求:
- 內存分配/釋放的執行時間可預期,可接受的。由于RTOS對指令的執行時間有嚴格要求,所以常常采用靜態內存分配的方法,以獲得一個可以預期的執行時間。
- 內存分配算法的碎片化程度要低,這是由于RTOS往往長時間執行,碎片化程度高會導致內存分配失敗。
TLSF算法的目標運行系統是:
- 可信的執行環境,Trusted Environment,應用不會故意破壞數據或者竊取數據。
- 有限的物理內存。
- 沒有物理MMU來支持虛擬內存。
為了在這樣的環境下運行,TLSF算法使用了如下的策略:
- Immediate coalescing,立即合并,當內存塊被釋放后,立即與相鄰的空閑內存塊合并,以獲得一個更大的空閑塊,插入到鏈表的相應位置。這樣可以減少碎片化。
- Splitting threshold,分割閾值,最小可分配的內存塊大小為16字節,應用一般不會分配一些基本的數據結構,如int、char等。限定最小可分配大小為16字節,這樣可以在空閑的內存塊中存儲一些管理信息。
- Good-fit strategy,TLSF會盡可能的返回一個最小的、能夠滿足需求的內存塊。
- Same strategy for all block sizes,對于不同大小的內存請求,TLSF只有一個分配策略,實現相對簡單,執行時間可以預期。相應的dlmalloc根據所請求的內存大小不同,有多達4種內存分配策略。
- Memory is not cleaned-up,分配個應用的內存沒有被請0.
TLSF的特點在于:
- 可以預期的分配執行時間,無論對于多達的內存分配請求,TLSF可以在限定的時間內完成分配。
- 碎片化程度低。
未完待續
總結
以上是生活随笔為你收集整理的TLSF算法分析(内存分配算法详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grep 命令详解_grep命令详解
- 下一篇: python读取txt文件(多种方法)「