2014-07-09 4 views
0

Я немного подумал об управлении виртуальной памятью и пришел к выводу, что могут быть два типа фрагментации памяти. Первое происходит на стороне физической памяти, где страницы не могут быть освобождены, поскольку используются некоторые байты. В основном последние байты будут освобождены рано или поздно, а затем страница физической памяти снова станет свободной и не будет отображена.Есть ли повторное использование адресов виртуальной памяти в Linux?

Но что происходит с указателем (виртуальным адресом), возвращаемым malloc. Предположим, что 32-битная система. Программа «randomly» выделяет и освобождает память, но никогда не используется больше, чем некоторый MByte. Предположим далее, что программа никогда не освободит память в том порядке, в котором она выделена. Таким образом, указатель «вершина кучи» никогда не может быть уменьшен, так как свобода никогда не появится в конце кучи. Я предполагаю, что malloc должен всегда отображать память в конец пространства памяти кучи. Это означает, что значение указателя будет увеличиваться с каждым вызовом.

Раньше или позже возвращенный указатель достигнет наивысшего возможного адреса (например, 0xffffffff), и становится невозможным дальнейшее добавление памяти, в то время как в системе достаточно свободных страниц, поскольку большинство страниц были освобождены. Это всего лишь вопрос наивысшего возможного значения указателя.

Для решения этого потребуется алгоритм, который поддерживает немаркированные адресные пространства и позволяет им расти, поскольку больше памяти освобождается в начале или в конце пространства. Существует ли такой алгоритм, реализованный malloc?

ответ

0

Я предполагаю, что malloc должен всегда отображать память в конец пространства памяти кучи.

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

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

0

Я коротко посмотрел на распределитель плиты. Это, по-видимому, больше связано с управлением страницей памяти, используемым внутри ядра. Мой вопрос связан с пространством пользователя и тем фактом, что всякий раз, когда выделена память, ему нужно получить адрес в адресном пространстве кучи вызывающего процесса. Что происходит с этим адресным пространством, когда оно ограничено, как указано в 32-битной системе.

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