C malloc: необъяснимое использование памяти - PullRequest
2 голосов
/ 11 июля 2009

Когда я компилирую и запускаю следующий код: (используя gcc на cygwin)

int *a = malloc(1024*1024*100*sizeof(int));
while(1)
;

Диспетчер задач в Windows XP показывает использование памяти этим процессом как 2232K, который по моему мнению должен был быть около 400000K.

Когда я компилирую и запускаю следующий код: (используя gcc на cygwin)

int *a = malloc(1024*1024*400*sizeof(int));
while(1)
;

использование памяти уменьшается до 1388K;

Итак, вместо того, чтобы показывать увеличение, это на самом деле показывает снижение.

Что может объяснить это?

Ответы [ 6 ]

7 голосов
/ 11 июля 2009

Вы распределили память, сделав ее доступной, но еще не использовали ее (чтение или запись из / в нее). Менеджер памяти, возможно, еще не выделил физическую память вашей программе, просто сказал, что вы можете ее иметь. Если вы напишите что-то в только что выделенной памяти (например, заполнив ее нулями - посмотрите на это в memset), я ожидаю, что использование памяти будет в большей степени соответствовать вашим ожиданиям.

4 голосов
/ 11 июля 2009

Второй malloc выделит 1600MiB (проверьте ваши единицы). Я предполагаю, что это больше, чем ваша система может вместить в одном процессе, поэтому второй malloc завершается неудачно. По какой-то причине у вас слишком много других приложений в приложении, что приводит к высокому использованию памяти, даже если malloc не удалось.

Напечатайте a, чтобы быть уверенным.

3 голосов
/ 11 июля 2009

К сожалению, потребление памяти не так просто, как одного. Существует множество способов отслеживания памяти (и она немного отличается в разных операционных системах).

Например, в Windows, вот некоторые из различных типов использования памяти

  • Виртуальная память
  • Физическая память
  • Запоминание памяти
  • Зарезервированная память
  • Общая память

Не могли бы вы дать нам более подробную информацию о том, о каком именно номере вы говорите?

Одно возможное объяснение состоит в том, что вы смотрите на использование физической памяти процессом. Операционная система обычно выделяет адрес виртуальной памяти, но не фиксирует его в физической памяти, пока он не будет фактически использован вашим процессом.

Один из способов проверить это - настроить цикл for, который записывает каждый элемент в массиве, а затем проверить использование памяти приложением.

0 голосов
/ 14 июля 2009

http://en.wikipedia.org/wiki/Copy-on-write

Другое использование в функции calloc. Это можно реализовать, заполнив страницу физической памяти нулями. Когда память выделена, все возвращаемые страницы ссылаются на страницу с нулями и помечаются как копируемые при записи. Таким образом, объем физической памяти, выделенной для процесса, не увеличивается до тех пор, пока данные не будут записаны. Обычно это делается только для больших выделений.

0 голосов
/ 11 июля 2009

Если у вас включена оптимизация и а не используется, переменная и распределение будут удалены. Вы можете избежать этого, объявив переменную как volatile.

0 голосов
/ 11 июля 2009

Вопрос о выделении памяти с использованием malloc с gcc в cygwin обсуждается в http://www.cygwin.com/cygwin-ug-net/setup-maxmem.html.

Также было бы хорошо проверить возврат от malloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...