內(nèi)存緩沖池的實現(xiàn)_第1頁
內(nèi)存緩沖池的實現(xiàn)_第2頁
內(nèi)存緩沖池的實現(xiàn)_第3頁
內(nèi)存緩沖池的實現(xiàn)_第4頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、內(nèi)存池實現(xiàn) 話說一直想找一個別人寫好的使用,可惜沒什么人會拿這小東西發(fā)布,只好自寫一個。1.多級鏈表分配池我不知道這種設(shè)計的具體學名是什么,這部分的內(nèi)容也許你去看STL源碼分析的有關(guān)章節(jié)更合適一些,這里我只能用我粗陋的語言描述一下。內(nèi)存池,完全可以從字面上理解為從池子里申請內(nèi)存,釋放的時候還給池子。最簡單的內(nèi)存池應該是fix_pool吧,即每次分配出來的內(nèi)存塊大小是固定的。這種池子的管理結(jié)構(gòu)是一個鏈表,鏈表的每一個節(jié)點為固定大小的內(nèi)存塊。分配的時候,直接返回鏈表的第一個節(jié)點,節(jié)點不足時,從系統(tǒng)申請大塊內(nèi)存分成多個節(jié)點加入鏈表;釋放的時候更簡單,將釋放的內(nèi)存加入鏈表頭。假設(shè)fix_pool的fi

2、x size = 128,那么內(nèi)存池可以為128byte以下的任意大小的請求進行分配,但是這樣做相當浪費呢,于是unfix_pool就在此基礎(chǔ)上出現(xiàn)了。由多個分配大小不同的fix_pool所組成的內(nèi)存池就叫做多級鏈表分配池,我是這么定義的。常規(guī)上會定義8,16,24,32,.,112,120,128這些分配大小,共16級。分配或者釋放的時候,判斷請求的大小在哪一級別上,用該級別的fix_pool鏈表進行分配或者釋放。2.泄漏檢測當所有的分配都經(jīng)過你的手的時候,泄漏檢測什么的再簡單不過了。找個地方把分配的東西記錄下來,釋放的時候把記錄去掉。程序退出的時候還存在的分配記錄就是泄漏了。我個人選用的方

3、法是給每一個分配請求多分配一些內(nèi)存,用來記錄分配的信息,并將這部分信息用雙向鏈表串起來。釋放的時候?qū)︶尫诺闹羔樧鲆幌轮羔樒凭涂梢哉业叫畔⒂涗洸⒁瞥鲭p向鏈表。這個方法的開銷是常數(shù)級的,不過無法處理重復刪除的問題。3.operater new要把你的內(nèi)存池應用到每一個角落,需要定義operator new和operator delete。 void* operator new(size_t) throw(std:bad_alloc); void operator delete(void* p);但是這還不夠,誰也不想

4、看到一堆泄漏信息而找不到泄漏的位置,因此還需要定義帶附加參數(shù)的operator。對于placement new而言,operator new和operator delete是必須的,無法省略。void* operator new(size_t, const char* file, int line, const char* function);void* operator new(size_t, const char*, int, co

5、nst char*);void operator delete(void* p);void operator delete(void* p);為了能用上新的operator,需要在頭文件中重新定義new,并包含進每一個cpp文件。/op_new.h#define DEBUG_NEW new(_FILE_, _LINE_, _FUNCTION_)#define new DEBUG_new不過重定義new會和自行使用placement new的地方?jīng)_突,如stl容器庫,

6、這時候要undef new后才能編譯沖突組件。#undef new#include <vector>#include "op_new.h"4.線程安全我沒聽說過new/delete,malloc/free是線程不安全的,所以在內(nèi)存池的allocate/deallocate接口處直接加了鎖。想降低開銷的同學可以使用spin lock,而不是mutex。5.benchAMD5000+ X2, memory 2G,測試分配大概900M 1     for(int x=0

7、; x<REPEAT; +x) 2      3         clock_t t1 = clock(); 4         for(int i=0; i<15990000; +i) 5    

8、      6             size_t size = rand() % 121; 7             char* p = new charsize; 

9、;8             bufs.push_back(p); 9         10         tm = tm + clock() - t1;11     

10、    printf("time alloc %dn", tm);12 13         t1 = clock();14         for(int i=0; i<bufs.size(); +i)15    

11、0;    16             char* p = bufsi;17             delete  p;18         19 

12、;        t2 = t2 + clock() - t1;20         printf("time free %dn", t2);21         bufs.clear();22     repeat=1win32下分配效率提升大概50%,釋放效率提升170%;linux下技不如人,輸了。repeat=15,應該存在內(nèi)存碎片這種東西了win32下分配效率提升100%,釋放效率提升140%;linux下分配效率提升大概15%左右,釋放效率提升50%以上。猜測結(jié)論: linux的內(nèi)存分配機制很高效。我的實現(xiàn)可能寫得不怎樣,或者內(nèi)存池已經(jīng)out了。補充:由eXile推薦的tcmalloc,進行了性能測試,linux平臺repeat=1tcmalloc和系統(tǒng)分配半斤八兩,難出其右。repeat=15tcmalloc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論