2010-12-08 4 views
3

Прежде всего, я заметил, что, когда память malloc и calloc, размер памяти отличается. Я работаю с наборами данных из нескольких ГБ. Это нормально для данных случайных.Вопросы памяти Malloc

Я ожидал, что смогу просто скомпилировать большой объем памяти и прочитать любые случайные данные, которые были в нем применены к поплавку. Однако, глядя на объем памяти в просмотре процесса, память явно не заявляется (по сравнению с calloc, где я вижу большой отпечаток стопы). Я запустил цикл, чтобы записать данные в память, а затем увидел, как поднимается память. Правильно ли я говорю, что память фактически не заявлена ​​до тех пор, пока я ее не инициализирую?

Наконец, после того, как я прошел 1024 * 1024 * 128 байтов (1024 МБ в средстве просмотра), я начал получать segfaults. Похоже, что Calloc инициализирует всю сумму до 1 ГБ. Почему я получаю segfaults при инициализации памяти в цикле for с помощью malloc с этим номером 128 МБ и почему размер памяти 1024 МБ?

Если malloc большой объем памяти, а затем прочитайте от него, что я получаю (поскольку просмотрщик процесса почти не имеет следа, пока я его не инициализирую)?

В конце концов, есть ли способ для размещения более 4 ГБ? Я тестирую производительность иерархии памяти.

Код для # 2:

long long int i; 
    long long int *test=(long long int*)malloc(1024*1024*1024); 
    for (i=0;i<1024*1024*128;i++) 
      test[i]=i; 

    sleep(15); 
+2

32-разрядная или 64-разрядная Linux? – 2010-12-08 00:22:59

+3

Linux использует «оптимистичную стратегию распределения памяти».Некоторая информация: http://linux.die.net/man/3/malloc – sje397 2010-12-08 00:24:07

ответ

2

1- Если вы работаете на 32-битной машине, у вас не может быть переменной с более чем 2 ГБ, выделенной для нее.

2 Если вы работаете на 64-разрядной машине, вы можете выделить столько, сколько RAM + Swap-память в целом, однако для выделения всего одной переменной требуется большой последовательный фрагмент памяти, который может быть недоступен. Попробуйте со связанным списком, где каждый элемент имеет только 1 МБ, и вы можете получить более высокую выделенную память.

3- Как отметил вас и Шарт, если вы не используете свою память, Linux не будет выделять ее.

6

Некоторые примечания:

  1. Как для комментариев, Linux фактически не выделять память, пока вы не используете его.
  2. Когда вы используете calloc вместо malloc, он обнуляет всю запрошенную память. Это эквивалентно его использованию.
1

Ваш №2 не работает с segfault либо потому, что sizeof(long long int) > 8, либо потому, что ваш malloc возвратил NULL. Это очень возможно, если вы запрашиваете 1 ГБ ОЗУ.

Подробнее о № 2. Из вашего комментария 128 МБ я понимаю, что вы не можете понять, что происходит. Поскольку вы объявляете указатель массива как long long int, размер каждого элемента массива составляет 8 байтов. 1024/8 == 128, поэтому ваш цикл работает. Так или иначе, когда я это пробовал.

1

Ваш цикл for в вашем примере кода на самом деле касается 1 ГБ памяти, так как он индексирует 128 * 1024 * 1024 long long s, и каждый long long составляет 8 байтов.

Смежные вопросы