无限调用sbrk的结果(PAGE_SIZE)

时间:2016-02-20 09:08:52

标签: c linux linux-kernel

我使用的是带有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);
    }
}

结果:

  1. 有时我的进程会被杀死并包含其他一些进程 (作为内存过程)
  2. 有时我的整个电脑都挂起了
  3. 我认为从堆中分配连续内存(向上增长)可能会导致堆栈崩溃(向下增长)。绝不应该进入内核区域。由于内核和MMU的各种限制。

    那为什么我的操作系统有时会挂起?

1 个答案:

答案 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启发式地确定要终止的进程。)