如何在 linux 中限制 c 代码的堆大小
How to limit heap size for a c code in linux
我想知道是否可以限制在 linux 机器上执行的 C 代码分配的堆大小。
可以这样做吗?
这样做的目的是动态分配 ~70KBytes 的内存和~20KBytes 的堆栈内存,除了其他全局变量和局部变量。动态分配是通过malloc()完成的。
所以为了确认问题不在于堆分配,我想限制 C 代码的堆内存,这将是 运行。
网上看了一些文章,发现如果使用malloc(),内存可能会overcommitted,但是如果使用calloc(),我们只会得到可用的内存,不会overcommitment,因为calloc()有在给出指针之前将内存块初始化为零。但由于初始化开销,我不想使用 calloc()。
在 POSIX 系统上,您可以使用 setrlimit
函数来限制进程的虚拟内存大小。
来自 POSIX documentation:
RLIMIT_AS
This is the maximum size of total available memory of the process, in
bytes. If this limit is exceeded, the malloc() and mmap() functions
shall fail with errno set to [ENOMEM]. In addition, the automatic
stack growth fails with the effects outlined above.
您可以使用(在您的程序中)setrlimit(2), probably with RLIMIT_AS
(as cited by ).
更好的是,让您的 shell 做到这一点。对于 bash
,它是 ulimit
内置的。
确保您的程序确实正确且完整地处理了所有地方的 malloc
故障(测试 malloc
的每个 return 与 NULL
表明其故障)。
如果你不测试 malloc
的结果,当它失败时,它给出 NULL
并且下一条指令很可能会取消引用空指针(或某些地址非常接近),即 undefined behavior and on Linux giving a segmentation violation.
您可能应该考虑在调试阶段使用 valgrind。
顺便说一句,70 KB 的内存在今天已经很小了(至少在 Linux 笔记本电脑、台式机甚至平板电脑上是这样)。请注意,C standard library 可能会在幕后调用 malloc
(例如,fopen
给出一个 FILE
句柄,它有一些缓冲区,可以通过 malloc
)
并且 memory overcommit 可以使用以下命令在 Linux 上禁用
echo 0 > /proc/sys/vm/overcommit_memory
作为 root 运行。
我想知道是否可以限制在 linux 机器上执行的 C 代码分配的堆大小。
可以这样做吗?
这样做的目的是动态分配 ~70KBytes 的内存和~20KBytes 的堆栈内存,除了其他全局变量和局部变量。动态分配是通过malloc()完成的。
所以为了确认问题不在于堆分配,我想限制 C 代码的堆内存,这将是 运行。
网上看了一些文章,发现如果使用malloc(),内存可能会overcommitted,但是如果使用calloc(),我们只会得到可用的内存,不会overcommitment,因为calloc()有在给出指针之前将内存块初始化为零。但由于初始化开销,我不想使用 calloc()。
在 POSIX 系统上,您可以使用 setrlimit
函数来限制进程的虚拟内存大小。
来自 POSIX documentation:
RLIMIT_AS
This is the maximum size of total available memory of the process, in bytes. If this limit is exceeded, the malloc() and mmap() functions shall fail with errno set to [ENOMEM]. In addition, the automatic stack growth fails with the effects outlined above.
您可以使用(在您的程序中)setrlimit(2), probably with RLIMIT_AS
(as cited by
更好的是,让您的 shell 做到这一点。对于 bash
,它是 ulimit
内置的。
确保您的程序确实正确且完整地处理了所有地方的 malloc
故障(测试 malloc
的每个 return 与 NULL
表明其故障)。
如果你不测试 malloc
的结果,当它失败时,它给出 NULL
并且下一条指令很可能会取消引用空指针(或某些地址非常接近),即 undefined behavior and on Linux giving a segmentation violation.
您可能应该考虑在调试阶段使用 valgrind。
顺便说一句,70 KB 的内存在今天已经很小了(至少在 Linux 笔记本电脑、台式机甚至平板电脑上是这样)。请注意,C standard library 可能会在幕后调用 malloc
(例如,fopen
给出一个 FILE
句柄,它有一些缓冲区,可以通过 malloc
)
并且 memory overcommit 可以使用以下命令在 Linux 上禁用
echo 0 > /proc/sys/vm/overcommit_memory
作为 root 运行。