我想知道是否可以限制在Linux机器上执行的C代码的分配堆大小 .
有可能这样做吗?
这样做的目的是我动态分配~70KBytes的内存和~20KB的堆栈内存,除了其他全局变量和本地 . 动态分配是通过malloc()完成的 .
因此,为了确认问题不在于堆分配,我想限制将运行的C代码的堆内存 .
我在网上阅读了一些文章,发现如果我们使用malloc(),内存可能会被过度提交,但是如果我们使用calloc(),我们将只获得可用的内存而不需要过度承诺,因为calloc()必须初始化内存块在给出指针之前为零 . 但由于初始化开销,我不想使用calloc() .
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
以root身份运行 .
在POSIX系统上,您可以使用
setrlimit
函数来限制进程的虚拟内存大小 .从POSIX documentation: