Управление памятью всегда является компромиссом между выделением памяти под все объекты с минимизацией изменения в виде cow принципа, что позволяет максимальное не блокируемое взаимодействие потоков с общей памятью и минимизацией утечек памяти. COW подход используется в языках с передачей сообщений и очень легковесными потоками - что позволит получить высокую производительность. Но память не освобождается в таких случаях до полного завершения всех процессов, потенциально имеющих возможность обратится к этой памяти, и нет возможности произвести утряску памяти без остановки всех процессов.
Для минимизации случаев, когда память уже не используется, но она освобождалась не в том порядке как выделялась, что часто бывает, так как память под результат выделяется в конце выполнения подпрограммы. Идея в том чтобы перед выполнением запомнить состояние выделения память или передать в функцию, перед окончанием выполнения, указатели на выделенные в ходе исполнения данные и переместить результат как можно ближе к предыдущей границе выделения памяти как было перед запуском под программы. Это позволяет более экономно использовать память, как пример с минимальными изменениями текущей логики выделения вызвать realloc для результата после освобождения всех ненужных объектов из памяти, что бы она пыталась переместить данные ближе к предыдущей границе (возможно, это потребует изменить внутреннюю семантику функции, так как возможно если памяти достаточно функции реального перемещения не выполняет), также это поможет, если использовалось динамическое увеличение буфера для работы при котором всегда при нехватке памяти выделялось в два раза больше, чем нужно для работы. Такая простая утряска решит проблему когда из-за большого количества повторных выделений и перемещений у нас память занята меленькими не занятыми областями, а результат далеко расположен по сравнению с изначальным выделением.
No comments:
Post a Comment