我使用的是带有PAGE_SIZE 4 kb的linux2.6.38-8-generic。
我正在尝试以下代码:
#define PAGE_SIZE 4096
int main(void)
{
static unsigned *b;
while (1) {
b = (unsigned)sbrk(PAGE_SIZE);
*b = 0;
printf("[%x]\n", b);
}
}
结果:
我认为从堆中分配连续内存(向上增长)可能会导致堆栈崩溃(向下增长)。绝不应该进入内核区域。由于内核和MMU的各种限制。
那为什么我的操作系统有时会挂起?
答案 0 :(得分:1)
我在具有4GB RAM的VM上尝试了这一点,并且能够在内核dmesg
日志中捕获以下内容
[ 257.630016] Out of memory: Kill process 1853 (test-sbrk) score 868 or sacrifice child
[ 257.630021] Killed process 1853 (test-sbrk) total-vm:3511196kB, anon-rss:3507052kB, file-rss:60kB
在这种情况下,sbrk()
选择我们的应用程序进行数千次oom-killer
调用终止,系统恢复并继续运行。
偶尔的系统挂起很可能是由于:
其他一些系统进程无法分配内存。
OR
oom-killer
最终会终止其他一些流程而不是
(因为oom-killer
启发式地确定要终止的进程。)