Mar*_*ark 19 c linux memory-management
我想编写一个程序来消耗所有可用的内存来理解结果.我听说linux一旦无法分配内存就开始查杀进程.
任何人都可以帮我这样的程序.
我写了以下内容,但内存似乎没有用尽:
#include <stdlib.h>
int main()
{
while(1)
{
malloc(1024*1024);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
nos*_*nos 13
您应该写入已分配的块.如果你只是要求内存,linux可能只是分配内存预留,但在访问内存之前不会分配任何内容.
int main()
{
while(1)
{
void *m = malloc(1024*1024);
memset(m,0,1024*1024);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你真的只需要在每个页面上写1个字节(通常在x86上为4096个字节).
Zac*_*sch 10
Linux"过度提交"内存.这意味着物理内存仅在进程首次尝试访问进程时提供给进程,而不是在malloc首次执行时进行.要禁用此行为,请执行以下操作(以root身份):
echo 2 > /proc/sys/vm/overcommit_memory
Run Code Online (Sandbox Code Playgroud)
然后尝试运行您的程序.
小智 5
默认情况下,Linux 使用我喜欢称之为“机会分配”的东西。这是基于观察到许多实际程序分配的内存比实际使用的多。Linux 使用它来将更多的东西放入内存:它只在使用时分配内存页,而不是在使用 malloc(或 mmap 或 sbrk)分配时。
如果你在循环中做这样的事情,你可能会取得更大的成功:
memset(malloc(1024*1024L), 'w', 1024*1024L);
Run Code Online (Sandbox Code Playgroud)