麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 既然有了tcmalloc或者ptmalloc這樣的庫,為什么還要自己寫內存池呢?

既然有了tcmalloc或者ptmalloc這樣的庫,為什么還要自己寫內存池呢?

來源:千鋒教育
發布人:xqq
時間: 2023-10-13 06:23:29 1697149409

一、有了tcmalloc或者ptmalloc這樣的庫,還要自己寫內存池的原因

1、可以定制化

自己編寫內存池可以滿足更加個性化的需求,有效降低內存使用,避免內存碎片問題。通常一個應用程序擁有自己獨特的內存使用模式,自己編寫內存池可以為特定的應用程序場景量身定制。

2、內存分配效率更高

自己編寫內存池可以直接申請一大塊內存空間,有效減少申請內存的次數和時間。內存池中的內存可以被重復利用,降低內存申請和釋放造成的成本。

3、可以減少鎖的爭用

在多線程環境下,TCMalloc和ptmalloc庫的內部實現會使用同步機制來保證并發訪問的正確性,會造成鎖的爭用現象。自己編寫內存池可以減少同步機制的使用,提高訪問速度。

4、可以更好的控制

自己編寫的內存池可以比庫更好地控制內存分配和釋放的行為,例如在某一個時間停止分配內存等操作。

二、tcmalloc介紹

1、簡介

TCMalloc 是 Google 對 C 的 malloc() 和 C++ 的 operator new 的自定義實現,用于在我們的 C 和 C++ 代碼中進行內存分配。 TCMalloc 是一種快速、多線程的 malloc 實現。

? TCMalloc為每個線程分配了緩存,這個緩存是線程私有的,可以減少多線程程序競爭。對于小對象的內存分配,首先會去請求線程緩存,不用加鎖,如果緩存不能滿足的話,需要去向后面的內存存儲結構中獲取,此時需要加鎖獲取,因為其他線程可能正在獲取內存空間,但是大部分情況下線程緩存就可以滿足內存請求,所以幾乎不需要鎖。對于大對象的內存分配,TCMalloc嘗試著使用細粒度和高效的自旋鎖。另外一個TCMalloc的好處是小對象內存分配效率高。例如,分配n個8 byte的對象時,使用大約8n * 1.01byte的空間,只有百分之一的空間浪費。ptmalloc2分配內存的方法為每個對象使用一個4 byte的標頭,并且將大小四舍五入為8 byte的倍數,最終使用16n byte。

2、TCMalloc架構

我們可以將TCMlloc分為三部分:front-end;middle-end;back-end。 它們的職責分別是:

Front-end:是一個緩存,提供內存快速分配和重分配內存給應用程序的功能。它主要有2部分組成:Per-thread cache和Per-CPU cache。Middle-end:負責給front-end提供緩存。當front-end緩存不足時,首先從middle-end中獲取。它由Central free list組成。Back-end:負責從系統獲取內存。當middle-end中的內存不足時,從back-end中獲取。它主要設計page heap的內容。

3、小對象和大對象分配

TCMalloc維護了一份空間大小映射表,當分配小對象內存空間時,會從這個表里尋找合適大小的內存,點這里能都看到。例如,12字節的分配將會尋找16字節大小的內存空間。空間大小級別是為了在向上取最小滿足的內存空間時減少浪費。

? 如果分配的內存空間大于1MB,那么直接從后端分配,因此,大對象內存空間不會緩存在front-end和middle-end中。大對象分配時會向上取最小滿足頁大小的內存空間。

Middle-end負責為 Front-end提供內存以及把多余的內存放回Back-end。Middle-end是由Transfer cache和Central free list組成。盡管Transfer cache和Central free list經常被認為是一個東西,但它們是有區別的。當Front-end訪問Middle-end時需要先加鎖然后再獲取內存,這會造成線性訪問的時間消耗。

三、內存池介紹

1、基本概念

(Memory Pool)是一種內存分配方式,又被稱為固定大小區塊規劃(fixed-size-blocks allocation)。通常我們習慣直接使用new、malloc等API申請分配內存,這樣做的缺點在于:由于所申請內存塊的大小不定,當頻繁使用時會造成大量的內存碎片并進而降低性能。

內存池則是在真正使用內存之前,先申請分配一定數量的、大小相等(一般情況下)的內存塊留作備用。當有新的內存需求時,就從內存池中分出一部分內存塊,若內存塊不夠再繼續申請新的內存。這樣做的一個顯著優點是,使得內存分配效率得到提升。在內核中有不少地方內存分配不允許失敗。作為一個在這些情況下確保分配的方式,內核開發者創建了一個已知為內存池(或者是“mempool”)的抽象。一個內存池真實地只是一類后備緩存,它盡力一直保持一個空閑內存列表給緊急時使用。

2、實現示例

內存池的實現有很多,性能和適用性也不相同,以下是一種較簡單的C++實現—GenericMP模板類。在這個例子中,使用了模板以適應不同對象的內存需求,內存池中的內存塊則是以基于鏈表的結構進行組織。GenericMP模板類定義:

template class GenericMP{public:static VOID *operator new(size_t allocLen){assert(sizeof(T) == allocLen);if(!m_NewPointer)MyAlloc();UCHAR *rp = m_NewPointer;m_NewPointer = *reinterpret_cast(rp); //由于頭4個字節被“強行”解釋為指向下一內存塊的指針,這里m_NewPointer就指向了下一個內存塊,以備下次分配使用。return rp;}static VOID operator delete(VOID *dp){*reinterpret_cast(dp) = m_NewPointer;m_NewPointer = static_cast(dp);}private:static VOID MyAlloc(){m_NewPointer = new UCHAR[sizeof(T) * BLOCK_NUM];UCHAR **cur = reinterpret_cast(m_NewPointer); //強制轉型為雙指針,這將改變每個內存塊頭4個字節的含義。UCHAR *next = m_NewPointer;for(INT i = 0; i < BLOCK_NUM-1; i++){next += sizeof(T);*cur = next;cur = reinterpret_cast(next); //這樣,所分配的每個內存塊的頭4個字節就被“強行“解釋為指向下一個內存塊的指針, 即形成了內存塊的鏈表結構。}*cur = 0;}static UCHAR *m_NewPointer;protected:~GenericMP(){}};templateUCHAR *GenericMP::m_NewPointer;GenericMP模板類應用class ExpMP : public GenericMP{BYTE a[1024];};int _tmain(int argc, _TCHAR* argv[]){ExpMP *aMP = new ExpMP();delete aMP;}

延伸閱讀1:ptmalloc簡介

ptmalloc是glibc默認的內存管理器。我們常用的malloc和free就是由ptmalloc內存管理器提供的基礎內存分配函數。ptmalloc有點像我們自己寫的內存池,當我們通過malloc或者free函數來申請和釋放內存的時候,ptmalloc會將這些內存管理起來,并且通過一些策略來判斷是否需要回收給操作系統。

聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 好想吃你的馒头| 亚洲午夜成激人情在线影院| 国产免费爽爽视频在线观看| 精品国产www| 欧美黄色免费看| 啊灬啊灬啊灬快灬深用力| 亚洲综合三区| 男人的天堂黄色| 国产人成在线视频| 中文字幕无码久久精品| 好男人社区神马在线观看www| 奇米影视7777久久精品| 1111| 午夜dj影院| 欧美综合自拍亚洲综合图| 久草资源| 欧美超清videos1080p| 天堂8在线天堂资源bt| 又黄又爽又色又刺激的视频| 99香蕉国产精品偷在线观看| 亚洲免费网站观看视频| a级毛片高清免费视频就| 女人说疼男人就越往里| 好痛太长太深弄死我了视频| 日本高清乱理论片| 欧美三级在线免费观看| 久久精品亚洲| 午夜dj在线观看免费视频| 4444www免费看| 产国语一级特黄aa大片| 毛片福利视频| 乱亲乱族| 久久精品国产99久久99久久久| 亚洲午夜久久久精品电影院| 亚洲欧洲精品成人久久曰影片| 啊灬啊灬啊灬快灬深用口述| 国产一卡二卡| 男人j插入女人p| 泰国午夜理伦三级| 国产精品亚洲成在人线| 岛国在线播放v片免费|