AMPS:內存管理(一)

  高效的內存管理是卓越的軟件產品的必備特徵,如果在分配和釋放內存時包含了代價高昂的查找、排序、重新組合操作,內存處理可能會成爲系統性能的瓶頸。AMPS內存管理子系統的設計目標如下:

  • 內存管理必須快且系統開銷小。
  • 在不引入垃圾收集器的前提下儘可能地減少內存泄露。
  • 內存分配後保持相對長的時間來減小釋放引起的系統開銷。
  AMPS通過以下方法達到如上目標:
   應用協議服務器通常以突然爆發的方式使用內存,他們通過使用較大的數據結構來完成數據處理,然後丟棄這些數據結構。比如說處理來自網絡的一條協議消息,消息進入系統後,通常進行解析、處理,有可能會修改,增加一些新的數據,或者刪除、更新一些數據,在每一個處理階段,都涉及動態分配內存,這些內存可能在消息離開系統之後才進行釋放,或者,每個獨立的內存對象在一個階段處理完成切換到另一階段時,內存可能被釋放,然而,如果在所有階段全處理完再釋放,這樣的做法優於前者,原因如下:
  1.   如果我們累積所有分配的小塊內存,然後一次性釋放,在本質少可以減少內存泄露,因爲我們不需要在多個地方進行釋放操作,從而避免了遺漏。
  2.   在一開始預分配一大塊內存,當消息進入系統後,通過建立的簡單,高效的分配器在這個buffer上面分配小的內存對象,這樣就不用擔心管理釋放內存的鏈表以及小對象分配引起的系統開銷。
 列舉一個協議消息的例子,當消息到達系統後,能過編程語言提供的內存分配函數分配一個大的buffer,定義一個指針指向buffer的開頭,這樣就形成了特定消息的內存管理對象,當消息開始並經過不同處理階段,應用程序使用一個特殊的API將內存管理對象當做參數來進行內存分配,分配函數只需通過簡單地移動指針來分配所需要的字節,並且返回分配前指針所在地址,應用程序在將來可通過這個指針來寫buffer,隨後的分配需要向前移動指針。有可能在消息還沒離開系統前,預先分配的大塊內存已經被使用完了,如果這種情況發生,我們必須分配一另一塊大的buffer,並將其拼接在前一個buffer之後,接着從這個新的buffer開始分配。另外,我們需要將在buffer上分配的內存塊對象掛到一個鏈表上,當系統不再需要此消息時,將鏈表釋放。因爲所有的分配都是從預先分配的buffer上進行分配,僅需要給指針增加一個要求的內存大小即可,分配相當高效。

   AMPS提供一個API來在創建上層的內存存管理對象,這個API返回一個對象做爲參數傳遞個另一個分配API,其分配和銷燬細節如上所示,在管理對象內部建立的buffer鏈表,通過內存管理對象提供的另一個API來釋放。

  

發佈了205 篇原創文章 · 獲贊 30 · 訪問量 143萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章