標籤:

什麼是tlsf內存分配演算法? 它和普通的內存分配演算法有什麼區別?

什麼是tlsf內存分配演算法? 據說它經常被用在是實時性能比較敏感的領域,比如遊戲或者遊戲引擎中,因為它的速度比較快. 那麼問題來了:

1.它的演算法具體是怎樣的? 憑什麼就快?

2.既然它很快,為什麼主流操作系統自帶的內存分配器不使用tlsf呢?

3.他有哪些缺點?


講真,問題出在題主誤會了什麼叫「實時系統」。不要以為遊戲/遊戲引擎這是實時系統。即便是實時渲染,也不是實時系統。

TLSF的優點是分配在常數時間,這對實時系統來說是有明顯優勢的。不管分配多少,返回的時間有保證。注意,是有保證,快不快是另一回事。實時系統要的是可預期,不是快。而一般的系統優先的是快,預期不預期無所謂。所以適用度不同。

另外,這玩意已經有開源實現了,搞吧。OlegHahm/tlsf


它用2層鏈接記錄空閑塊,第一層是2的冪次方,如16,32,64,128。如果只用這個,內存浪費會比較嚴重,如分配65位元組需要分配128位元組。因此引入第二層鏈表,比如64這級,再分為4個區間,64-80,80-96,96-112,112-128,這樣保證效率的同時提高內存利用率。

這個演算法的好處是穩定,無論申請多少空間的內存,分配所消耗的時間是差不多的,因此可以預估分配內存需要多少時間,多用於實時要求高的系統。其他內存演算法則不一定,可能有時候很快,有時候運行久了空閑內存塊很多時需要較長時間遍歷。


google一下,不難吧。

下面是論文鏈接

http://www.gii.upv.es/tlsf/files/ecrts04_tlsf.pdf


因為它不如malloc快


推薦閱讀:

C++派生類的成員或友員只能通過派生類對象來訪問基類的受保護成員?
變數名儲存在那裡,變數的儲存機制是什麼?
編程中你們都習慣怎麼使用大括弧?
C++中char是如何在地址中存儲的?
C++中為什麼說在構造器或析構器中使用異常處理會可能產生嚴重的問題?

TAG:演算法 | 編程 | C |