假設有50 MB分配,並且有這個for循環在每次迭代中分配內存。當以下for循環運行時會發生什麼。請求內存超過available
對(INT I = 0;我< 20;我++){
int *p = malloc(5MB);
}
我問這個問題進行了採訪。有人可以指導我,並指導我學習必要的主題,以瞭解這些情況。
假設有50 MB分配,並且有這個for循環在每次迭代中分配內存。當以下for循環運行時會發生什麼。請求內存超過available
對(INT I = 0;我< 20;我++){
int *p = malloc(5MB);
}
我問這個問題進行了採訪。有人可以指導我,並指導我學習必要的主題,以瞭解這些情況。
如果這是一個利用虛擬內存的系統,那麼情況顯然比malloc簡單地失敗並返回空指針複雜。在這種情況下,malloc調用將導致在虛擬地址空間中分配內存頁面。當這個內存被訪問時將導致一個頁面錯誤,控制權將被給予os內存管理器,並且這將把虛擬內存頁面映射到物理內存的頁面。當可用的物理內存已滿時,內存管理器通常會處理進一步的頁面錯誤,方法是將當前物理內存中的數據寫入磁盤備份(或者,如果已經由磁盤文件支持,則丟棄該數據),然後重新映射現在可用於最初導致頁面錯誤的虛擬內存頁面的物理內存。任何嘗試訪問以前寫入磁盤備份的虛擬地址頁都會導致類似的過程發生。
維基百科包含此流程的合理基本概述(http://en.wikipedia.org/wiki/Paging),包括不同操作系統的一些實現細節。更多詳細信息可從其他許多來源獲得,例如。 intel體系結構軟件開發手冊(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)
根據malloc的文檔(例如http://www.cplusplus.com/reference/cstdlib/malloc/),您將得到一個指向5MB內存塊的指針(注意malloc的參數應該是所需的字節數,而不是MB),前10次如果存在與從可用的50MB中取出的malloc'ed空間相關聯的開銷,則可能是9次),並返回指向該空間的指針。繼此之後,5MB大小的內存將無法使用,並且malloc將失敗,返回一個空指針。
感謝您的回覆。我在malloc中提到了5MB,只是爲了讓計算變得簡單。 – user1225752
50MB是指物理內存還是可用地址空間? (假設這是在具有虛擬內存的系統上)。面試問題不一定有這樣的簡單答案。 – millimoose
@millimoose:謝謝你的回覆。對不起,我沒有提到這50 MB是指物理內存。而且該系統還具有虛擬內存。我在回答中提到了虛擬內存,即虛擬內存將處理多餘的內存分配。面試官表示滿意,但希望我詳細解釋。你能向我展示一些這方面的進一步的指示。 – user1225752