%20%E6%98%AF%E5%90%A6%E7%B8%BD%E6%98%AF%E6%9C%83%E5%88%AA%E9%99%A4%E5%85%B6%E8%99%9B%E6%93%AC%E8%A8%98%E6%86%B6%E9%AB%94%E5%92%8C%E5%AF%A6%E9%AB%94%E8%A8%98%E6%86%B6%E9%AB%94%E4%B9%8B%E9%96%93%E7%9A%84%E6%98%A0%E5%B0%84%EF%BC%9F.png)
假設我們想透過使用從堆中分配一個塊malloc
。當分配大尺寸記憶體時,在內部malloc
調用mmap
;當分配小尺寸記憶體時,在內部malloc
調用brk
。
sbrk()
注意,使用或時堆是連續的brk()
假設我的分配規模相對中等,並且在內部malloc
調用brk
。
假設我打電話malloc(small); malloc(medium); free(medium)
根據這篇文章Unix 一組令人困惑的低階記憶體分配方法的歷史
如果您 free()d 正確地在中斷頂部建立一塊未使用的空間,則 malloc() 和公司最終可能會呼叫
brk()
或sbrk()
縮小程式的中斷並將記憶體傳回給作業系統。
由於空閒中區塊是最後一個(小分配區塊是倒數第二個),因此記憶體將傳回給作業系統。
以下是我的問題:
我對「記憶體將歸還給作業系統」這句話的理解是:該空閒區塊的虛擬記憶體和實體記憶體之間的對應被刪除,其他行程可以使用該空閒區塊原來佔用的實體記憶體。我的理解正確嗎?
這次我呼叫
malloc(medium); malloc(small); free(medium)
既然最後還有分配區塊,那麼空閒區塊在虛擬記憶體和實體記憶體之間的映射還存在嗎?其他進程可以使用這個空閒區塊的實體記憶體嗎?
答案1
還有其他機制可以將實體記憶體重新用於其他目的,特別是在這種情況下交換 - 如果記憶體壓力足夠高,則可以交換進程的實體記憶體以為其他內容騰出空間。
如今,將記憶體返還給作業系統的主要好處是作業系統可以知道該內存不會再次使用,因此它可以丟棄相應的物理內存,而無需任何進一步的儀式。 (看我對相關SO問題的回答了解詳情。
虛擬記憶體和實體記憶體之間的映射有些不穩定;請參閱上面關於交換的觀點。在您的場景中,分配給進程的虛擬位址空間無法更改,因為無法減少程式中斷,並且核心必須假設映射到它的任何實體記憶體都是「珍貴的」並且包含重要資料。但這並不意味著核心不能重新利用物理記憶體;而是意味著核心不能重新利用物理記憶體。這僅意味著它必須確保在此過程中儲存的資料不會遺失。