Я вижу полностью другое поведение при выполнении части программы, которая пытается превысить RSS на различных машинах. Код - что-то как:
...
char** s = (char**)malloc(10000*sizeof(char*));
for (i = 0; i < 10000; i++){
s[i] = (char*)malloc(1000*1000*sizeof(char));
if (s[i] == NULL) {
printf("cannot allocate memory for s[%d]",i);
exit(1);
}
}
int j = 0;
while(1){
for (i = 0; i < 10000; i++){
for (j = 0; j < 1000*1000; j++) {
s[i][j] = 1;
}
if ((i % 100) == 0) printf("i = %d\n", i);
}
}
for (i = 0; i < 10000; i++)
free(s[i]);
free(s);
...
Вышеупомянутый код пытается выделить приблизительно 10 ГБ памяти с помощью malloc. Первые две машины я попробовал этот код работавшего ядро Linux 2.6 и последнее, выполняют ядро Linux 2.4. Вот поведения, которые я вижу на этих машинах:
Machine1: память выделяется с помощью памяти, принимают на себя непосильные обязательства, но при присвоении значений ячейкам памяти в цикле с условием продолжения, она только выделяет столько, сколько RSS позволяет. Таким образом Уничтожитель OOM уничтожает процесс, когда i=3800 печатается, который составляет приблизительно 4 ГБ памяти, которую имеет эта машина.
Machine2: память выделяется с помощью памяти, принимают на себя непосильные обязательства, и цикл с условием продолжения продолжается навсегда, выделяя страницы от виртуальной памяти. Процесс идет немного медленнее после того, как я = 3800 печатаюсь, который нормален.
machine3: это машины имеет только 2 ГБ памяти. Память не может даже быть выделена. Походит по фиксации, не установлен, или ядро 2.4 не поддерживает страницы виртуальной машины выделения с помощью malloc! Таким образом в первом для цикла это выходит при выделении памяти поскольку я = 2138
Мое желаемое действие является тем, происходящим в machine2. Кто-либо знает который (ядро?) опции должны быть установлены позволить ОС выделять страницы виртуальной памяти с помощью malloc и запускать подкачку страниц, в то время как необходимая память превышает RSS?
Спасибо
Вы не сможете выделить 100 ГБ на 32-битную машину и обратитесь к нему, используя регулярные указатели, которые используют ваш код. Тот факт, что машина 1 завершает процесс, когда он попадает в приблизительно 4 ГБ и машину 2, не рекомендуется, что машина 2 работает в 64-битной ОС.