2015-11-25 73 views
0

我正在學習有關malloc功能C.我知道如何與malloc返回內存在哪裏?

p = malloc(number_of_bytes); 

請求內存後來當它不與

free(p); 

自由慣了,但我想知道的東西有點比這更理論:我知道用虛擬內存有三種可能性:

  1. 一個虛擬地址可以沒有ph ysical存儲分配(在頁面文件或物理存儲器)

  2. 虛擬地址可以具有物理存儲在頁面文件

  3. 虛擬地址可以具有物理存儲物理內存

所以,我的問題是:

malloc返回的內存在哪裏?

+0

C++標記不合適 –

+2

下面是'malloc'的內部實現的一些很好的解讀:[link](http://stackoverflow.com/q/3479330/335858)。 – dasblinkenlight

回答

3

它是具體實現。在Linux上使用GNU libcmusl-libc,malloc通常會調用mmap(2)system call以從內核獲得更多虛擬內存。 free通常標誌着一個存儲區是通過向malloc但偶爾未來電話(大的內存區)可重用被釋放內存munmap

使用strace並研究相關的源代碼(通常情況下,malloc實現在Linux上的一些免費軟件標準C庫內)。我相信,musl-libc具有很好的可讀性實施malloc

瞭解更多關於processesvirtual address spacesvirtual memoryAdvanced Linux Programming

又見proc(5)和思考的cat /proc/$$/maps輸出和cat /proc/self/maps

在Linux中,也對Linux memory overcommit閱讀。這是我不喜歡的功能,我正在禁用...

請注意ASLR。您可以禁用它(例如在GDB下具有可重現的觀察點)。

爲了調試malloc有關的問題(特別是memory leaks)使用valgrind(和,最近GCC的編譯器,其-fsanitize=debugging options)。

+0

另外,Linux使用延遲頁分配,所以'malloc'ed內存空間可能不會被物理內存或交換空間支持,直到程序實際寫入分配的內存爲止。在此之前,它可能只是佔用頁表中的地址空間,頁面標記爲「寫入時複製」。 –

0

通常它將被分配在虛擬內存中,如果有的話。所以我們假設它有一個,內存硬件由硬盤和RAM組成。如果物理內存(RAM)中沒有可用空間,則會將其分配到硬盤中的頁面文件中。

堆是對象的內存並被分配相同。爲了清楚這裏關於堆的概念,想象一個沒有操作系統和沒有虛擬內存的嵌入式應用程序,如果它是一個對象,它將被分配到物理內存(RAM)的堆區中,如果它不是分配在堆區外,但仍在物理內存(RAM)中。

5

它是在頁面文件上的物理內存?

在有虛擬內存管理malloc操作系統沒有的,它在分配虛擬內存是如何映射到物理內存的想法,那就是完全由設計。 malloc在比虛擬內存管理器更高的級別上運行。到malloc由OS提供的地址空間中的所有內存都是相同的。

某些頁面可能以物理映射開始,僅在稍後才交換到文件中,然後根據需要返回到內存中。但是,操作系統對您的程序透明地執行了所有這些操作,因此malloc不知道物理內存。