ptmalloc,tcmalloc和jemalloc内存分配策略研究
轉載:https://cloud.tencent.com/developer/article/1173720
?
操作系統內存布局
各種malloc的內存分配管理方式離不開操作系統的內存布局策略。
32位經典內存布局
32位系統下經典內存布局如上,程序起始的1GB地址為內核空間,接下來是向下增長的棧空間和由0x40000000向上增長的mmap地址。而堆地址是從底部開始,去除ELF、數據段、代碼段、常量段之后的地址并向上增長。但是這種布局有幾個問題,首先是容易遭受溢出攻擊;其次是,堆地址空間只有不到1G有木有?如果mmap內存比較少地址很浪費有木有?所以后來就有了另一種內存布局。
32位默認內存布局
這幅圖描述地比較清楚也比較完整。首先是加入了幾種Random offset隨機偏移,導致內存溢出攻擊不那么容易了,其次是堆仍然向上,但是mmap向下增長。但是這樣的話棧空間就不是動態增長的了,所以現在的操作系統都有棧大小限制來著(Windows好像默認是2MB對吧?Linux可以ulimit –s查看)。這種內存布局地址利用度比較高。
64位內存布局
64位系統的尋址空間比較大,所以仍然沿用了32位的經典布局,但是加上了隨機的mmap起始地址,以防止溢出攻擊。反正一時半會是用不了這么大的內存地址了,所以至少N多年不會變了(話說要生產出40TB+的內存條,把堆內存地址用光,一時半會也搞不定吧)。
總結
縱觀各種內存布局,對于大內存各種malloc基本上都是直接mmap的。而對于小數據,則通過向操作系統申請擴大堆頂,這時候操作系統會把需要的內存分頁映射過來,然后再由這些malloc管理這些堆內存塊,減少系統調用。而在free內存的時候,不同的malloc有不同的策略,不一定會把內存真正地還給系統,所以很多時候,如果訪問了free掉的內存,并不會立即Run Time Error,只有訪問的地址沒有對應的內存分頁,才會崩掉。
Ptmalloc
Ptmalloc采用主-從分配區的模式,當一個線程需要分配資源的時候,從鏈表中找到一個沒加鎖的分配區,在進行內存分配。
小內存分配
在ptmalloc內部,內存塊采用chunk管理,并且將大小相似的chunk用鏈表管理,一個鏈表被稱為一個bin。前64個bin里,相鄰的bin內的chunk大小相差8字節,稱為small bin,后面的是large bin,large bin里的chunk按先大小,再最近使用的順序排列,每次分配都找一個最小的能夠使用的chunk。
Chunk的結構如上所示,A位表示是不是在主分配區,M表示是不是mmap出來滴,P表示上一個內存緊鄰的chunk是否在使用,如果沒在使用,則size of previous chunk是上一個chunk的大小,否則無意義(而且被用作被分配出去的內存了),正式根據P標記位和size of previous chunk在free內存塊的時候來進行chunk合并的。當然,如果chunk空閑,mem里還記錄了一些指針用于索引臨近大小的chunk的,實現原理就不復述了,知道大致作用就行。
在free的時候,ptmalloc會檢查附近的chunk,并嘗試把連續空閑的chunk合并成一個大的chunk,放到unstored bin里。但是當很小的chunk釋放的時候,ptmalloc會把它并入fast bin中。同樣,某些時候,fast bin里的連續內存塊會被合并并加入到一個unsorted bin里,然后再才進入普通bin里。所以malloc小內存的時候,是先查找fast bin,再查找unsorted bin,最后查找普通的bin,如果unsorted bin里的chunk不合適,則會把它扔到bin里。
大內存分配
Ptmalloc的分配的內存頂部還有一個top chunk,如果前面的bin里的空閑chunk都不足以滿足需要,就是嘗試從top chunk里分配內存。如果top chunk里也不夠,就要從操作系統里拿了。
還有就是特別大的內存,會直接從系統mmap出來,不受chunk管理,這樣的內存在回收的時候也會munmap還給操作系統。
簡而言之,就是:**
**小內存: [獲取分配區(arena)并加鎖] -> fast bin -> unsorted bin -> small bin -> large bin -> top chunk -> 擴展堆
大內存: 直接mmap
總結
釋放的時候,幾乎是和分配反過來,再加上可一些chunk合并和從一個bin轉移到另一個bin的操作。并且如果頂部有足夠大的空閑chunk,則收縮堆頂并還給操作系統。
介于此,對于ptmalloc的內存分配使用有幾個注意事項:
總結
以上是生活随笔為你收集整理的ptmalloc,tcmalloc和jemalloc内存分配策略研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 餐厅点餐系统源码(带电脑端和手机端)
- 下一篇: 五大黑科技资源网站,你想要的这里都有