簡體   English   中英

malloc在哪里返回內存?

[英]Where does malloc return memory?

我正在學習C語言中的malloc函數。我知道如何使用

p = malloc(number_of_bytes);

並在以后不使用時將其釋放

free(p);

但是我想了解的理論要比這還多:我知道使用虛擬內存有三種可能性:

  1. 虛擬地址不能分配任何物理存儲(在頁面文件或物理內存中)

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

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

所以,我的問題是:

malloc返回的內存在哪里(我的意思是,它在頁面文件上還是在物理內存上(可能是堆?))?

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

在具有虛擬內存管理功能的操作系統上, malloc不知道其分配的虛擬內存如何映射到物理內存,而這完全是設計使然。 malloc在比虛擬內存管理器更高的級別上運行。 在操作系統提供的地址空間中malloc所有內存是相同的。

某些頁面可能以物理映射開始,然后稍后才換成文件,然后根據需要重新換回內存。 但是,操作系統對您的程序透明地完成所有這些操作,因此malloc不知道物理內存。

它是特定於實現的。 在具有GNU libcmusl-libc的 Linux上, malloc通常調用mmap(2) 系統調用以從內核獲取更多虛擬內存。 free通常將內存區域標記為可被將來對malloc調用重用,但偶爾(對於大內存區域)使用munmap釋放內存

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

閱讀有關進程虛擬地址空間虛擬內存高級Linux編程的更多信息

另請參見proc(5)並考慮cat /proc/$$/mapscat /proc/self/maps

專門在Linux上,也請閱讀有關Linux內存過量使用的信息 這是我不喜歡且正在禁用的功能...

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

要調試與malloc相關的問題(尤其是內存泄漏 ),請使用valgrind (以及最近的GCC編譯器的-fsanitize= debugging選項 )。

通常,如果有,它將分配在虛擬內存中。 因此,我們假設它有一個,並且存儲硬件由硬盤和RAM組成。 如果物理內存(RAM)中沒有可用空間,它將在硬盤內的頁面文件中分配。

堆是對象的內存,並且分配相同。 只是為了澄清有關堆的概念,想象一個沒有操作系統,沒有虛擬內存的嵌入式應用程序,如果它是一個對象,它將分配在物理內存(RAM)的堆區域中,如果不是,它將分配在堆區域之外,但仍在物理內存(RAM)中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM