內存管理內幕閱讀筆記

http://www.ibm.com/developerworks/cn/linux/l-memory/

 

 基於 UNIX 的系統有兩個可映射到附加內存中的基本系統調用:

  • brk: brk() 是一個非常簡單的系統調用。 還記得系統中斷點嗎?該位置是進程映射的內存邊界。 brk() 只是簡單地 將這個位置向前或者向後移動,就可以向進程添加內存或者從進程取走內存。
  • mmap: mmap(),或者說是“內存映像”,類似於 brk(),但是更爲靈活。首先,它可以映射任何位置的內存, 而不單單隻侷限於進程。其次,它不僅可以將虛擬地址映射到物理的 RAM 或者 swap,它還可以將 它們映射到文件和文件位置,這樣,讀寫內存將對文件中的數據進行讀寫。不過,在這裏,我們只關心 mmap 向進程添加被映射的內存的能力。 munmap() 所做的事情與 mmap() 相反。

在設計一個分配程序時, 要面臨許多需要折衷的選擇,其中包括:

  • 分配的速度。
  • 回收的速度。
  • 有線程的環境的行爲。
  • 內存將要被用光時的行爲。
  • 局部緩存。
  • 簿記(Bookkeeping)內存開銷。
  • 虛擬內存環境中的行爲。
  • 小的或者大的對象。
  • 實時保證。

 使用池式內存分配的益處如下所示:

  • 應用程序可以簡單地管理內存。
  • 內存分配和回收更快,因爲每次都是在一個池中完成的。分配可以在 O(1) 時間內完成,釋放內存池所需時間也差不多(實際上是 O(n) 時間,不過在大部分情況下會除以一個大的因數,使其變成 O(1))。
  • 可以預先分配錯誤處理池(Error-handling pools),以便程序在常規內存被耗盡時仍可以恢復。
  • 有非常易於使用的標準實現。

池式內存的缺點是:

  • 內存池只適用於操作可以分階段的程序。
  • 內存池通常不能與第三方庫很好地合作。
  • 如果程序的結構發生變化,則不得不修改內存池,這可能會導致內存管理系統的重新設計。
  • 您必須記住需要從哪個池進行分配。另外,如果在這裏出錯,就很難捕獲該內存池。
 
發佈了182 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章