首页 文章

如何限制linux中c代码的堆大小

提问于
浏览
3

我想知道是否可以限制在Linux机器上执行的C代码的分配堆大小 .

有可能这样做吗?

这样做的目的是我动态分配~70KBytes的内存和~20KB的堆栈内存,除了其他全局变量和本地 . 动态分配是通过malloc()完成的 .

因此,为了确认问题不在于堆分配,我想限制将运行的C代码的堆内存 .

我在网上阅读了一些文章,发现如果我们使用malloc(),内存可能会被过度提交,但是如果我们使用calloc(),我们将只获得可用的内存而不需要过度承诺,因为calloc()必须初始化内存块在给出指针之前为零 . 但由于初始化开销,我不想使用calloc() .

2 回答

  • 2

    您可以使用(在您的程序中)setrlimit(2),可能使用 RLIMIT_AS (由Ouah's answer引用) .

    更好的是,让你的shell做到这一点 . 使用 bash ,它是 ulimit 内置 .

    确保你的程序确实正确并且完全处理 malloc 失败(测试 malloc 的每次返回对 NULL 指示其失败) .

    如果你没有测试 malloc 的结果,当它失败时,它会给出 NULL ,下一条指令很可能会取消引用一个空指针(或一些非常接近它的地址),这是undefined behavior并在Linux上给出segmentation violation .

    您可能应该考虑在调试阶段使用valgrind .

    顺便说一下,今天70千字节的内存很小(至少在Linux笔记本电脑,台式机甚至是平板电脑上) . 请注意C standard library可以在引擎盖下调用 malloc (例如, fopen 给出一个 FILE 句柄,它有一些缓冲区,可能通过 malloc 在内部获得)

    并且可以使用以下命令在Linux上禁用memory overcommit

    echo 0 > /proc/sys/vm/overcommit_memory
    

    以root身份运行 .

  • 1

    在POSIX系统上,您可以使用 setrlimit 函数来限制进程的虚拟内存大小 .

    从POSIX documentation

    RLIMIT_AS这是进程总可用内存的最大大小(以字节为单位) . 如果超出此限制,则malloc()和mmap()函数将失败,并将errno设置为[ENOMEM] . 此外,自动堆栈增长失败,具有上述效果 .

相关问题