日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ptmalloc,tcmalloc和jemalloc内存分配策略研究

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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默認后分配內存先釋放,因為內存回收是從top chunk開始的。
  • 避免多線程頻繁分配和釋放內存,會造成頻繁加解鎖。
  • 不要分配長生命周期的內存塊,容易造成內碎片,影響內存回收。
  • 總結

    以上是生活随笔為你收集整理的ptmalloc,tcmalloc和jemalloc内存分配策略研究的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。