Malloc Memory Вопросы - PullRequest
       21

Malloc Memory Вопросы

4 голосов
/ 08 декабря 2010

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

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

Наконец, после того, как я пропустил 1024 *1024* 128 байт (1024 МБ в средстве просмотра процесса), я начал получать ошибки сегмента. Однако Calloc, похоже, инициализирует полный объем до 1 ГБ. Почему при инициализации памяти в цикле for с malloc с этим значением 128 МБ возникают ошибки segfaults и почему объем памяти составляет 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);

Ответы [ 4 ]

7 голосов
/ 08 декабря 2010

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

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

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

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

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

1 голос
/ 08 декабря 2010

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

1 голос
/ 08 декабря 2010

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

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

...