極高效內存池實現 (cpu-cache)


視頻請看 : http://edu.csdn.net/course/detail/627

1.內存池的目的

  提高程序的效率
  減少運行時間
  避免內存碎片
2.原理
   要解決上述兩個問題,最好的方法就是內存池技術。具體方法就是,申請內存 :大小固定,提前申請,重復利用。
3.使用場合
  長時間運行的服務程序
  對速度要求高的程序
  對穩定性要求高的程序
4.內存池不能滿足所有的需求
  內存池是不能夠滿足所有人的需求的,那么考慮到通用性,健壯性,需要考慮到,當申請內存塊 大小不在內存池 中的情況
或者內存池中已經沒有內存塊了,所采取的措施:直接使用系統的申請,釋放函數。
內存池的設計 :
  內存池中有很多內存塊,內存池中有很多鏈表,每一個鏈表中存儲一種固定大小的內存塊,例如128字節鏈表中存儲的是大小都為
128字節的內存塊,依次類推,內存池中維護了很多個這樣的鏈表。
  這里我們要解決的第一個問題是,當我們申請內存是,首先要找到對應大小的鏈表,如果設計可以避免這個查找過程。
      從內存鏈表中申請內存過程中,不需要查找,直接返回可用內存(鏈表可輕松實現)
     解釋釋放內存的時候,如何快速的把內存塊放回到對應的鏈表中
     
下面針對上述問題做依次設計:
                   
 
首先在數據結構上進行申請的研究:
為了能滿足上面的申請,釋放可以快讀定位到鏈表,我們需要維護額外的數據結構才可以達到目標,思路如下:
在申請內存的時候需要多申請一部分作為系統使用,系統使用的內存結構中,包含了該內存塊所屬的內存鏈表指針,這樣就可以
快速度的釋放內存。
 
有了這個特殊的結構設計以后,我們就可以不通過查找定位到內存上。
看下面的圖:
首先考慮我們申請內存的過程:
 
char* p = new char[100];
實際上我們給出的輸入數據就是 100個字節的數據,如果我可以 MemeoryList* p = _listIndex[100];
這樣就可以直接的定位到對應的鏈表了。
 
如何結合 CPU-cache實現更加高度的內存池呢 ?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM