malloc ведет себя по-другому на различных машинах

Я вижу полностью другое поведение при выполнении части программы, которая пытается превысить 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?

Спасибо

5
задан Pirooz 2 February 2010 в 03:11
поделиться

1 ответ

Вы не сможете выделить 100 ГБ на 32-битную машину и обратитесь к нему, используя регулярные указатели, которые используют ваш код. Тот факт, что машина 1 завершает процесс, когда он попадает в приблизительно 4 ГБ и машину 2, не рекомендуется, что машина 2 работает в 64-битной ОС.

5
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: