我正试图模拟记忆力的消耗.所以这就是我的想法:
我的问题是第2步:是否有减少内核将分配的堆大小的技巧?我可以编写另一个分配大量RAM的程序,但可能有更聪明的方法吗?
您可以使用ulimit系统调用删除最大进程内存大小.该命令可从shell获得.有问题的选项是-v(最大内存大小),因此例如将进程限制为最大2GB:
ulimit -v 2097152
Run Code Online (Sandbox Code Playgroud)
然后从该shell启动进程.
如果你使用-Hulimit选项,那么它设置一个硬限制,一旦设置就不能增加(root可以增加限制).
如果要从程序进行控制,可以使用以下setrlimit方式进行系统调用:
#include <sys/types.h>
#include <sys/resource.h>
struct rlimit the_limit = { 2097152 * 1024, RLIM_INFINITY };
if (-1 == setrlimit(RLIMIT_AS, &the_limit)) {
perror("setrlimit failed");
}
Run Code Online (Sandbox Code Playgroud)
这将软限制2GB设置为,您可以通过更改RLIM_INFINITY值来设置硬限制.请注意,如果您是root用户,则只能增加硬限制.
此限制适用于可用于进程的内存总量,而不仅仅是可用作堆的内存.
可以使用该-d选项限制堆内存.setrlimit呼叫的等效名称是RLIMIT_DATA.此限制仅适用于内存分配 - 例如malloc,mmap,静态数据.