我使用的是linux2.6.38-8-generic,页面大小为4kb。
我正在尝试以下代码:
#define PAGE_SIZE 4096
int main(void)
{
static unsigned *b;
while (1) {
b = (unsigned)sbrk(PAGE_SIZE);
*b = 0;
printf("[%x]\n", b);
}
}
结果:
有时我的进程会被终止,包括一些其他进程
(作为内存不足进程)
有时我的电脑会挂起
我认为从堆中分配连续内存(向上增长)可能会导致堆栈崩溃(向下增长)。它绝不应该进入内核区域。由于内核和mmu的各种限制。
那为什么我的操作系统有时会挂起来?
最佳答案
我在一个带有4GB内存的虚拟机上进行了测试,并能够在内核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
调用的应用程序终止,系统将恢复并继续运行。偶尔的系统挂起很可能是由于:
其他系统进程无法分配内存。
或者
oom-killer
最终终止了另一个进程(当
oom-killer
试探性地确定要终止哪个进程时。)关于c - 无限调用sbrk(PAGE_SIZE)的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35521179/