我使用的是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/

10-13 07:54