这个网站上有很多关于内存分配的问题,但我找不到一个专门解决我问题的问题。这个问题 似乎最接近,它让我看到了这篇文章,所以......我比较了它包含的三个演示程序在(虚拟)桌面 x86 Linux 系统和基于 ARM 的系统上的行为。
我的发现在这里详细介绍,但快速总结是:在我的桌面系统上,demo3
文章中的程序似乎malloc()
总是显示分配的内存量 - 即使禁用了交换。例如,它愉快地“分配”了 3 GB 的 RAM,然后在程序开始实际写入所有内存时调用 OOM 杀手。在禁用交换的情况下,OOM 杀手在写入malloc()
据称可用的 3 GB 中的仅 610 MB 后被调用。
演示程序的目的是演示 Linux 的这个有据可查的“特性”,所以这一切都不足为奇。但是我们基于 i.MX6 的嵌入式目标在工作中的行为是不同的,它malloc()
似乎在讲述它分配多少 RAM 的真相(?)下面的程序(从文章中逐字复制)总是在第二个循环时i == n
:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10000
int main (void) {
int i, n = 0;
char *pp[N];
for (n = 0; n < N; n++) {
pp[n] = malloc(1<<20);
if (pp[n] == NULL)
break;
}
printf("malloc failure after %d MiB\n", n);
for (i = 0; i < n; i++) {
memset (pp[i], 0, (1<<20));
printf("%d\n", i+1);
}
return 0;
}
所以我的问题,简而言之,是:为什么demo3
程序——或其他一些不幸的 OOM 杀手受害者——总是i == n
在我的桌面系统上很久以前就被杀死(暗示这malloc()
是一个骗子),但它只有在i == n
打开时才会被杀死我们的 i.MX6 ARM 目标(暗示这malloc()
可能是实话)?这种差异是 libc 和/或内核版本的功能,还是其他原因?如果在此目标上分配失败, 我是否可以得出结论,malloc()
将始终返回 NULL?
注意:每个系统的一些细节(请注意,overcommit_memory
两者overcommit_ratio
的值相同):
# Desktop system
% uname -a
Linux ubuntu 3.8.0-33-generic #48-Ubuntu SMP Wed Oct 23 17:26:34 UTC 2013 i686 i686 i686 GNU/Linux
% /lib/i386-linux-gnu/libc.so.6
GNU C Library (Ubuntu EGLIBC 2.17-0ubuntu5.1) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.7.3.
Compiled on a Linux 3.8.13 system on 2013-09-30.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/eglibc/+bugs>.
% cat /proc/sys/vm/overcommit_memory
0
% cat /proc/sys/vm/overcommit_ratio
50
# i.MX6 ARM system
# uname -a
Linux acmewidgets 3.0.35-ts-armv7l #2 SMP PREEMPT Mon Aug 12 19:27:25 CST 2013 armv7l GNU/Linux
# /lib/libc.so.6
GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.7.3.
Compiled on a Linux 3.0.35 system on 2013-08-14.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
libc ABIs: UNIQUE
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
# cat /proc/sys/vm/overcommit_memory
0
% cat /proc/sys/vm/overcommit_ratio
50
背景:我们正在尝试决定如何在面向媒体的嵌入式应用程序中处理内存不足的情况,并且想知道我们是否可以——对于这个特定的目标——信任malloc()
在分配失败时提醒我们。我使用桌面 Linux 应用程序的经验让我认为答案肯定不是,但现在我不太确定。