【问题标题】:Increase heap size of a running process增加正在运行的进程的堆大小
【发布时间】:2018-03-10 18:20:38
【问题描述】:

我是 linux 编程新手,我想知道是否可以增加正在运行的进程的堆大小。如果可能的话,请帮助我如何正确地做到这一点。感谢任何人的帮助。

【问题讨论】:

标签: c process operating-system


【解决方案1】:

堆只是内存。它没有什么特别之处。任何内存都可以成为堆。显示堆区域的图表是教学性的,而不是真实的。

“Heap”之所以是“Heap”,只是因为内存是由堆管理器分配的。虽然大多数程序只有堆管理器,但也可以有多个堆管理器。

因此堆大小由堆管理器控制。大多数简单的堆管理器让用户无法控制堆大小。当堆管理器需要内存来响应分配调用时,它会分配更多内存。

一些堆管理器给用户函数调用允许他分配一个扩展堆大小。

【讨论】:

    【解决方案2】:

    只需使用malloc()calloc() 之类的函数来动态分配内存。要释放内存并将其返回到堆中,请使用free()。这些函数将根据需要通过扩展或收缩来管理堆的大小。

    例子:

    堆中的一切都是匿名的。你不能直接访问内存。每个访问都是间接的。所以将malloc()返回的分配内存地址存储在一个指针中。

    int *ptr = malloc(sizeof(int));
    

    我们可以使用*ptr 来访问内存的内容。

    *ptr = 3;
    printf("%d", *ptr);
    

    一旦你使用完内存。你释放它与

    free(ptr);
    

    根据 Peter van der Linden 关于 C 编程的书,

    堆的末尾由一个称为“break”的指针标记。当堆管理器需要更多内存时,它可以使用系统调用brksbrk 将中断推得更远。

    您通常不会自己显式调用brk,但如果您malloc 有足够的内存,最终会为您调用brk

    您的程序可能不会同时调用malloc()brk()。如果您使用 mallocmalloc 预计将单独控制何时调用 brksbrk

    堆最大大小的限制由系统的虚拟内存大小决定。

    这是图像的粗略复制:

    【讨论】:

    • 2018年的图真的很幼稚,真的错了。试试cat /proc/$$/maps
    猜你喜欢
    • 2011-05-09
    • 2015-08-14
    • 2011-05-06
    • 2021-04-02
    • 2017-08-12
    • 1970-01-01
    • 2016-03-06
    • 2012-06-17
    • 2011-06-30
    相关资源
    最近更新 更多