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),以便程序在常規內存被耗盡時仍可以恢復。
- 有非常易於使用的標準實現。
池式內存的缺點是:
- 內存池只適用於操作可以分階段的程序。
- 內存池通常不能與第三方庫很好地合作。
- 如果程序的結構發生變化,則不得不修改內存池,這可能會導致內存管理系統的重新設計。
- 您必須記住需要從哪個池進行分配。另外,如果在這裏出錯,就很難捕獲該內存池。