2010-11-01 69 views
4

Malloc從稱爲堆的進程的虛擬內存區域之一分配內存。 堆的初始大小是什麼(在執行開始之後和任何malloc調用之前)?說,如果堆從X虛擬地址開始,並結束於Y虛擬地址我想知道X和Y之間的區別。物理頁面在malloc和免費通話期間如何分配和釋放?

我已閱讀前面詢問的重複問題的答案。

How do malloc() and free() work?

書面答覆是所有虛擬地址的情況下,但我想知道的物理頁是如何分配的。 我不確定,但我認爲這個初始大小(X-Y)在操作系統中沒有相應的頁表項。如果我錯了,請糾正我。

現在,假設有一個請求分配(和使用)10個字節的內存,一個新的頁面將被分配。那麼,從這個頁面或每次分配一個新頁面時,所有對內存的進一步請求都會得到滿足?誰來決定呢?

當內存將被釋放(使用免費()),那麼在什麼時候這個分配的物理頁面將被釋放並標記爲可用?我知道虛擬地址和物理頁面不會立即釋放,因爲釋放的內存量可能會非常少。那麼在什麼時候物理地址和虛擬地址之間的對應關聯會被終止?

如果我的問題聽起來很奇怪,那麼我很抱歉。我只是一個新手,並試圖理解內部。

+0

請更改您的標題以反映您問題的具體情況。 – 2010-11-01 15:50:46

回答

4

通常情況下,你能想到的物理頁爲被臨時分配。如果你的程序正在使用的內存被交換到磁盤,那麼在任何時候你的虛擬地址和物理內存之間的關聯都可以被丟棄,並且該物理內存用於別的東西。

如果稍後程序訪問該內存,操作系統將爲該虛擬頁面分配一個新的物理頁面,將數據從頁面文件複製回物理內存,並完成內存訪問。

因此,要回答您的問題,當您的程序不再使用其中分配的分配之前,物理頁面可能會被標記爲可用。或之後,因爲malloc並不總是將內存釋放回操作系統。你真的不能預測這些東西。

這一切都發生在內核中,從C的角度看它是不可見的,就像內存的CPU緩存從C中不可見一樣。直到你的程序由於交換而大量減速時纔會看不見。顯然,如果你禁用交換文件,那麼事情會發生一些變化:而不是由於交換而導致你的程序變慢,某些程序將無法分配內存,否則某些東西會被OOM殺手所殺。

3

在每個操作系統,Linux,Mac,Windows等中,頁面的分配方式各不相同。在大多數/所有實現中,都有一個內核機制來定義它的分配方式。

http://www.linuxjournal.com/article/1133

+0

這是一個古老的文章! – 2010-11-01 14:01:16

2

操作系統如何處理這個問題與操作系統相關。在大多數情況下(如果不是全部的話),操作系統至少會在表格中注意到有一個分配。您可能會感到困惑,因爲某些情況下,某些操作系統在訪問之前不會提交內存。 (關鍵字:overcommit;如果您想要我的意見,它應該是每個進程設置,而不是全局設置,並且默認提交內存)。

現在將釋放的內存返回給操作系統,這取決於分配器。它不能返回任何小於一頁的內容,因此當頁面包含分配的內存時,它不會被返回。取決於如何分配,可能還有其他限制;例如在Unix上傳統上使用sbreak()時,只能返回最新分配的頁面(即,如果返回一個頁面,所有分配的頁面也將返回)。 Unix上更現代的方法使用mmapped內存來處理大塊,理由是可以按照需要返回mmapped內存。對於小的分配塊,通常認爲不值得檢查中間的頁是否可以返回,因此不使用mmap內存。