Делает звонящий свободный или удаляют когда-либо память выпуска назад к “системе”

Если бы глобальная горячая клавиша была бы достаточна, то RegisterHotKey добился бы цели

37
задан jww 14 April 2018 в 03:44
поделиться

7 ответов

Для malloc не так много накладных расходов, поэтому вы вряд ли сможете добиться экономии времени выполнения. Однако есть веская причина реализовать распределитель поверх malloc, а именно - иметь возможность отслеживать утечки памяти. Например, вы можете освободить всю память, выделенную программой при ее выходе, а затем проверить, вызывает ли ваш распределитель памяти баланс (то есть такое же количество вызовов для выделения / освобождения).

Для вашей конкретной реализации нет причин для free (), поскольку malloc не освобождает системную память, и поэтому он будет освобождать память только вашему собственному распределителю.

Другая причина для использования пользовательского распределителя - это что вы можете выделять много объектов одинакового размера (т. е. у вас есть некоторая структура данных, которую вы выделяете много). Вы можете вести отдельный список свободных мест для этого типа объектов и освобождать / выделять только из этого специального списка. Преимущество этого заключается в том, что это позволяет избежать фрагментации памяти.

12
ответ дан 27 November 2019 в 05:01
поделиться

Это полностью зависит от реализации. В Windows программы VC ++ могут возвращать память обратно в систему, если соответствующие страницы памяти содержат только свободные блоки.

5
ответ дан 27 November 2019 в 05:01
поделиться

Я думаю, что у вас есть вся необходимая информация, чтобы ответить на свой вопрос. pmap показывает память, которая в данный момент используется процессом. Итак, если вы вызовете pmap до того, как процесс достигнет пикового объема памяти, то он не покажет пиковую память. если вы вызовете pmap непосредственно перед завершением процесса, он покажет пиковую память для процесса, который не использует mmap. Если процесс использует mmap, то при вызове pmap в точке, где используется максимальная память, будет отображаться пиковое использование памяти, но эта точка может быть не в конце процесса (это может произойти где угодно).

Это применимо только к вашей текущей системе (т. Е. На основе документации, которую вы предоставили бесплатно, а также mmap и malloc), но, как было заявлено на предыдущем плакате, их поведение зависит от внедрения.

4
ответ дан 27 November 2019 в 05:01
поделиться

Это немного варьируется от реализации к реализации.

Думайте о своей памяти как о большом длинном блоке, когда вы выделяете ему, вы забираете немного своей памяти (помечено как «1» ниже):

111

Если я выделю больше памяти с помощью malloc, она получит часть от системы:

1112222

Если я теперь освобожу '1':

___2222

Она не будет возвращена в систему, потому что два впереди из него (а память дана как непрерывный блок). Однако, если конец памяти освобожден, эта память возвращается в систему. Если бы я освободил «2» вместо «1». Я бы получил:

111

бит, на котором было «2», будет возвращен в систему. Основное преимущество освобождения памяти состоит в том, что этот бит затем можно перераспределить, а не получать больше памяти из системы. например:

33_2222
3
ответ дан 27 November 2019 в 05:01
поделиться

Вот некоторые «преимущества» того, чтобы никогда не возвращать память обратно в систему:

  • Если вы уже использовали много памяти, очень вероятно, что вы сделаете это снова, и
    • когда вы освобождаете память, ОС должна делать довольно много документов
    • , когда она вам снова понадобится, ваш распределитель памяти должен повторно инициализировать все свои структуры данных в только что полученной области.
  • Освободить память, которая не требуется, выгружается на диск, где на самом деле это не имеет большого значения
  • . Часто, даже если вы освобождаете 90% памяти, фрагментация означает, что на самом деле может быть освобождено очень мало страниц, поэтому для искать пустые страницы не очень хорошо
1
ответ дан 27 November 2019 в 05:01
поделиться

Я считаю, что распределитель памяти в glibc может возвращать память обратно в систему, но будет это или нет, зависит от ваших шаблонов распределения памяти.

Скажем так. вы делаете что-то вроде этого:

void *pointers[10000];
for(i = 0; i < 10000; i++)
    pointers[i] = malloc(1024);
for(i = 0; i < 9999; i++)
    free(pointers[i]);

Единственная часть кучи, которую можно безопасно вернуть в систему, - это «кусок дикой природы», который находится в конце кучи. Это можно вернуть в систему с помощью другого системного вызова sbrk, и распределитель памяти glibc сделает это, когда размер этого последнего фрагмента превысит некоторый порог.

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

3
ответ дан 27 November 2019 в 05:01
поделиться

Многие менеджеры памяти могут выполнять операции TRIM, возвращая полностью неиспользуемые блоки памяти. к ОС. Однако, как уже упоминалось в нескольких сообщениях, это полностью зависит от реализации.

Но, допустим, я никогда не прошу выделения размера больше, чем, скажем, 50 байт, и я запрашиваю много таких 50-байтовых объектов при пиковой нагрузке на систему. Что тогда?

Это зависит от вашего шаблона распределения. Освобождаете ли вы ВСЕ небольших выделений? Если это так и если диспетчер памяти обрабатывает выделение небольшого блока, это может быть возможно. Однако, если вы выделяете много мелких предметов, а затем высвобождаете только все, кроме нескольких разбросанных предметов, вы можете фрагментировать память и сделать невозможным TRIM-блоки, так как каждый блок будет иметь только несколько разрозненных распределений. В этом случае вы можете захотеть использовать другую схему распределения для временных и постоянных выделений, чтобы вы могли вернуть временные выделения обратно в ОС.

1
ответ дан 27 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

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