【发布时间】:2018-03-10 18:20:38
【问题描述】:
我是 linux 编程新手,我想知道是否可以增加正在运行的进程的堆大小。如果可能的话,请帮助我如何正确地做到这一点。感谢任何人的帮助。
【问题讨论】:
-
是的,只是分配更多的内存
标签: c process operating-system
我是 linux 编程新手,我想知道是否可以增加正在运行的进程的堆大小。如果可能的话,请帮助我如何正确地做到这一点。感谢任何人的帮助。
【问题讨论】:
标签: c process operating-system
堆只是内存。它没有什么特别之处。任何内存都可以成为堆。显示堆区域的图表是教学性的,而不是真实的。
“Heap”之所以是“Heap”,只是因为内存是由堆管理器分配的。虽然大多数程序只有堆管理器,但也可以有多个堆管理器。
因此堆大小由堆管理器控制。大多数简单的堆管理器让用户无法控制堆大小。当堆管理器需要内存来响应分配调用时,它会分配更多内存。
一些堆管理器给用户函数调用允许他分配一个扩展堆大小。
【讨论】:
只需使用malloc() 或calloc() 之类的函数来动态分配内存。要释放内存并将其返回到堆中,请使用free()。这些函数将根据需要通过扩展或收缩来管理堆的大小。
例子:
堆中的一切都是匿名的。你不能直接访问内存。每个访问都是间接的。所以将malloc()返回的分配内存地址存储在一个指针中。
int *ptr = malloc(sizeof(int));
我们可以使用*ptr 来访问内存的内容。
*ptr = 3;
printf("%d", *ptr);
一旦你使用完内存。你释放它与
free(ptr);
根据 Peter van der Linden 关于 C 编程的书,
堆的末尾由一个称为“break”的指针标记。当堆管理器需要更多内存时,它可以使用系统调用
brk和sbrk将中断推得更远。您通常不会自己显式调用
brk,但如果您malloc有足够的内存,最终会为您调用brk。您的程序可能不会同时调用
malloc()和brk()。如果您使用malloc,malloc预计将单独控制何时调用brk和sbrk。
堆最大大小的限制由系统的虚拟内存大小决定。
这是图像的粗略复制:
【讨论】:
cat /proc/$$/maps