我正在學習有關malloc
功能C.我知道如何與malloc返回內存在哪裏?
p = malloc(number_of_bytes);
請求內存後來當它不與
free(p);
自由慣了,但我想知道的東西有點比這更理論:我知道用虛擬內存有三種可能性:
一個虛擬地址可以沒有ph ysical存儲分配(在頁面文件或物理存儲器)
虛擬地址可以具有物理存儲在頁面文件
虛擬地址可以具有物理存儲物理內存
所以,我的問題是:
malloc
返回的內存在哪裏?
我正在學習有關malloc
功能C.我知道如何與malloc返回內存在哪裏?
p = malloc(number_of_bytes);
請求內存後來當它不與
free(p);
自由慣了,但我想知道的東西有點比這更理論:我知道用虛擬內存有三種可能性:
一個虛擬地址可以沒有ph ysical存儲分配(在頁面文件或物理存儲器)
虛擬地址可以具有物理存儲在頁面文件
虛擬地址可以具有物理存儲物理內存
所以,我的問題是:
malloc
返回的內存在哪裏?
它是具體實現。在Linux上使用GNU libc或musl-libc,malloc
通常會調用mmap(2)system call以從內核獲得更多虛擬內存。 free
通常標誌着一個存儲區是通過向malloc
但偶爾未來電話(大的內存區)可重用被釋放內存munmap
使用strace
並研究相關的源代碼(通常情況下,malloc
實現在Linux上的一些免費軟件標準C庫內)。我相信,musl-libc具有很好的可讀性實施malloc
瞭解更多關於processes,virtual address spaces,virtual memory和Advanced 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)。
另外,Linux使用延遲頁分配,所以'malloc'ed內存空間可能不會被物理內存或交換空間支持,直到程序實際寫入分配的內存爲止。在此之前,它可能只是佔用頁表中的地址空間,頁面標記爲「寫入時複製」。 –
通常它將被分配在虛擬內存中,如果有的話。所以我們假設它有一個,內存硬件由硬盤和RAM組成。如果物理內存(RAM)中沒有可用空間,則會將其分配到硬盤中的頁面文件中。
堆是對象的內存並被分配相同。爲了清楚這裏關於堆的概念,想象一個沒有操作系統和沒有虛擬內存的嵌入式應用程序,如果它是一個對象,它將被分配到物理內存(RAM)的堆區中,如果它不是分配在堆區外,但仍在物理內存(RAM)中。
它是在頁面文件上的物理內存?
在有虛擬內存管理malloc
操作系統沒有的,它在分配虛擬內存是如何映射到物理內存的想法,那就是完全由設計。 malloc
在比虛擬內存管理器更高的級別上運行。到malloc
由OS提供的地址空間中的所有內存都是相同的。
某些頁面可能以物理映射開始,僅在稍後才交換到文件中,然後根據需要返回到內存中。但是,操作系統對您的程序透明地執行了所有這些操作,因此malloc
不知道物理內存。
C++標記不合適 –
下面是'malloc'的內部實現的一些很好的解讀:[link](http://stackoverflow.com/q/3479330/335858)。 – dasblinkenlight