
330
|
第九章
經由匿名映射分配記憶體有以下好處:
• 與碎裂無關。當程式不再需要一個匿名記憶體映射時,映射會被解除,而且記憶體
會被立即釋回系統。
• 匿名記憶體映射的尺寸是可調整的,具有可調整的存取權限,而且可以像一般映射
(見第 4 章)那樣收到警告訊息。
• 每個記憶體分配存在於獨立的記憶體映射中。不需要管理全域性的堆積。
相較於堆積,匿名記憶體映射還有兩項缺點:
• 每個記憶體映射的大小是系統頁面尺寸的整數倍。因此,如果一個記憶體分配的大
小不是頁面尺寸的整數倍,則會造成 slack space
5
的浪費。slack space 與小型的記憶
體分配比較有關,相較於記憶體分配的大小,這會浪費比較多的空間。
• 相較於從堆積把記憶體釋回系統(並未涉及任何核心的互動),建立一個新的記憶體
映射會導致更多的開銷。記憶體分配的規模越小,此現象越顯著。
為了讓優點有發揮的空間,同時避開缺點,
glibc
的
malloc()
實作會使用資料區段來滿足
小型的分配需求,以及使用匿名記憶體映射來滿足大型的分配需求。分配需求是大型或
小型,取決於一個可設定的門檻值(見第 9 章〈進階記憶體分配〉一節),而且不同的
glibc
版本可能會有所差異。當前的門檻值為 128 KB:記憶體分配小於或等於 128 KB
者來自堆積,然而大於 128 KB 的記憶體分配則來自匿名記憶體映射。
建立匿名記憶體映射
或許是因為你想要為特定的分配需求使用記憶體映射(而非堆積)、或許是因為你要撰
寫自己的記憶體分配系統,你可能會想要手動建立你自己的匿名記憶體映射—無論是哪 ...