堆是否与C中的进程相关?

时间:2014-10-03 18:06:21

标签: c linux

我正在阅读malloc()和calloc()如何能够从堆中分配内存,我遇到了一个网站(http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html),该网站上写着"如果你没有释放内存,它将是一个内存泄漏,内存不可用于其他进程分配内存"。但到目前为止,我一直在考虑堆内存是按进程进行的,并且一个进程的堆内存不会与其他进程混合使用。堆内存。任何人都可以告诉我我的理解是否正确吗?

4 个答案:

答案 0 :(得分:6)

你是对的,堆内存是每个进程。但是,同一系统上的所有进程都从同一个固定池分配内存,该内存仅限于系统的物理内存和虚拟内存系统上的交换文件。这就是为什么如果一个进程持有它不需要的内存,它可能会使同一台计算机上的另一个进程缺乏内存。

在具有虚拟内存的系统上,这并不一定意味着其他进程将耗尽内存,但这意味着为这些其他进程获取更多内存需要将其他进程交换内存。可能是您的泄漏流程或其他必须交换的流程。

在没有虚拟内存管理的系统上,在一个进程中泄漏内存会导致其他进程根本无法分配内存。

答案 1 :(得分:1)

那么,内存必须来自某个地方 - 物理RAM。因此,对于进程的生命周期,如果不释放该内存,则会为其分配物理RAM。

因此,虽然堆确实属于该进程,并且您没有“窃取另一个进程的堆”,但您仍然在使用物理内存。

答案 2 :(得分:1)

你部分正确。当"泄漏"进程结束时,它声明的内存被释放并可供其他进程使用 - 但在运行时间内,一个泄漏的进程'堆将继续占用越来越多的可用内存,从而减少其他进程存储堆的可用性。

传统上,堆是动态分配的,可以按需增长或缩小。

答案 3 :(得分:1)

计算机安装了一定量的物理内存(RAM)。操作系统为自己分配一些RAM,并跟踪RAM的其余部分。当进程请求内存时,操作系统可以为该进程分配内存。在正常情况下,进程无法访问彼此的内存空间。但是,可用的总内存量是有限的,因此当一个进程mallocs / callocs内存并且没有释放它时,对系统的影响是操作系统可用于分配给其他进程的内存较少。