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