2010-12-21 93 views
18

不完全知道如何短語的稱號,但問題是:如何實現內存堆

我在節目開始聽到程序員分配的連續內存的一大段,然後在必要時處理它。這與每次需要內存時簡單地進入操作系統形成對比。 我聽說這樣做會更快,因爲它可以避免不斷向操作系統請求連續內存塊的成本。

我相信JVM只是這樣做,維護自己的內存部分,然後從中分配對象。

我的問題是,如何實際執行此?

感謝, dragonwrenn

+0

「去操作系統」是什麼意思?堆完全以用戶模式實現,並且每個堆分配都不需要系統調用,除非需要分配更多頁。或者你在想什麼不一樣的東西? – wj32 2010-12-21 04:32:10

+2

「我如何實現內存管理器」這個問題很好,但你必須確保你真的需要這個。如果你是爲了訓練或者只是爲了好玩 - 好吧。如果您確定內存分配是您程序中的瓶頸,那麼您應該首先考慮重新設計程序,以便分配更大的塊。只有在你做完這些之後,你才能找到自己的內存管理器。 – sharptooth 2010-12-21 07:05:34

回答

14

大多數C和C++編譯器已經提供了堆內存管理器作爲標準庫的一部分,因此您不需要執行任何操作,以避免每次請求都觸發操作系統。

如果你想提高性能,有很多改進的分配器,你可以簡單地鏈接和去。例如Hoard,小麥在現在被刪除的答案中提到了(實際上它很不錯 - 小麥,爲什麼你刪除它?)。

如果你想編寫自己的堆管理器作爲一個學習鍛鍊,這裏有它需要做的基本的東西:

  • 請求的大內存塊從OS
  • 保持一個鏈表空閒塊
  • 的當分配請求進來:
    • 搜索列表中的塊是爲請求的大小加上旁邊存儲一些簿記變量不夠大。
    • 分裂掉塊的一個足夠大的塊當前請求,把剩下的放回空閒列表
    • 如果沒有塊是足夠大的,回去的OS,並要求另一大塊
  • 當解除分配請求到達
    • 讀頭找出大小
    • 新釋放的塊添加到空閒列表
    • 任選,查看是否存儲器立即FOL降脂也列在空閒列表上,並且兩個相鄰塊合併成一個更大的一個(稱爲合併堆)
+1

@Ziezi:謝謝你指出,現在修好了。 – 2017-05-28 19:49:09

6

你在程序足夠大,以維持其需要的開始分配的內存塊。然後你必須覆蓋新的和/或malloc,刪除和/或自由地將內存返回到這個緩衝區。

在實現這種解決方案時,您需要編寫自己的分配器(來自塊的源),並且最終可能會使用多個分配器,這通常是爲什麼您首先分配內存池的原因。

默認的內存分配器是一個很好的全分配器,但不是所有分配需求的最佳選擇。例如,如果您知道您將爲特定大小分配大量對象,則可以定義一個分配器來分配固定大小的緩衝區,並預分配多個對象以獲得某種效率。

3

這裏是典型的分配,以及最好的非多線程應用之一:

http://g.oswego.edu/dl/html/malloc.html

您可以從閱讀其設計的解釋學到很多東西。這樣說,除非你的程序有非常不尋常的分配模式,否則編寫你自己的分配器或使用自定義的分配器可能是一個非常糟糕的主意。特別是如果您嘗試更換系統malloc,則可能會將來自不同庫(或標準庫函數)的各種錯誤和兼容性問題鏈接到「malloc的錯誤版本」。

如果您發現自己需要針對少數特定任務進行專門分配,則無需替換malloc即可完成。我會建議查找GNU obstack和固定尺寸對象的對象池。這些涉及大多數專門分配可能具有實際實際用處的情況。

+0

斷章取義 - 你在SO上的參考文獻太好了。我一直想知道如何把它們作爲記憶來記住所有有限的事情:-(。 – 2010-12-21 06:47:50

1
  1. 是的,stdlib堆和操作系統堆/虛擬內存都相當麻煩。 OS調用非常慢,stdlib速度更快,但仍然存在一些「不必要的」鎖定和檢查,併爲分配的塊 (即除分配的內容之外還用於管理)添加了大量開銷。
  2. 在很多情況下,它可以通過使用靜態結構來完全避免動態分配, 。例如,有時候爲其定義一個64k的 靜態緩衝區來保存unicode文件名,比定義一個指針/ std:string更好(更安全),並且動態分配它。
  3. 當程序必須分配很多相同結構的實例時,它的 要快得多來分配大內存塊,然後在那裏存儲實例 (按順序或使用鏈接的自由節點列表) - C++有一個「安置新的」爲此。
  4. 在很多情況下,使用可變大小的對象時,可能的大小集合 實際上非常有限(例如類似於4 + 2 *(1..256)),因此可以使用幾個可能的大小 幾個如[3]的池,而不必收集垃圾,填補空白等。
  5. 它對於特定任務的定製分配器通常比標準庫中的一個(s) 快得多,甚至比速度優化,但太普遍的實現。
  6. 現代的CPU /操作系統支持「大型頁面」,它可以顯著提高記憶力 存取速度,當你明確地用大塊的工作 - 看http://7-max.com/