Miсrosoft открыл код системы распределения памяти mimalloc

Компания Miсrosoft открыла под лицензией MIT библиотеку mimalloc с реализаций системы распределения памяти, изначально созданной для runtime-компонентов языков Koka и Lean. Mimalloc адаптирован для использования в типовых приложениях без изменения их кода и может выступать в качестве прозрачной замены функции malloc. Поддерживается работа в Windows, macOS, Linux, BSD и других Unix-подобных системах.

Ключевой особенностью mimalloc является компактность реализации (менее, чем 3500 строк кода) и очень высокая производительность. В проведённых тестах mimalloc обогнал по производительности все конкурирующие библиотеки распределения памяти, включая jemalloc, tcmalloc, snmalloc, rpmalloc и Hoard.

Для оценки производительности использован набор уже существующих типовых тестов В некоторых тестах mimalloc опережает другие системы в разы, например, в тесте миграции объектов между разными потоками mimalloc оказался быстрее tcmalloc и jemalloc более чем в 2.5 раза. При этом в большинстве тестов также наблюдается более низкое потребления памяти, в некоторых ситуациях расход памяти удаётся снизить на 25%.

Высокая производительность достигается в основном за счёт применения сегментирования списка свободных блоков (free list sharding). Вместо одного большого списка в mimalloc применяется разделение на серию более мелких списков, каждый из которых привязывается к странице памяти. Подобный подход снижает фрагментацию и повышает локализацию данных в памяти. Под страницей памяти понимается сгруппированный набор близких по размеру блоков. На 64-разрядных системах размер страницы обычно составляет 64 КБ. В случае, если в странице не остаётся занятых блоков, она полностью освобождается с возвращением памяти операционной системе, что позволяет снизить затраты памяти и фрагментацию в длительно работающих программах.

Библиотеку можно подключить на этапе связывания или подгрузить для уже собранной программы («LD_PRELOAD=/usr/bin/libmimalloc.so myprogram»). В библиотеке также предоставляется API для интеграции функциональности в runtime и тонкого управления поведением, например, для подключения обработчиков отложенного освобождения памяти и монотонного увеличения счётчиков ссылок. Имеется возможность создания и использования в приложении нескольких «куч» (heap) для распределения по разным областям памяти. В том числе возможно освобождение кучи целиком, без перебора и отдельного освобождения размещённых в ней объектов.

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

Из особенностей mimalloc также отмечается не подверженность проблемам с раздутием при большой фрагментации. В наихудшем сценарии потребление памяти возрастает на 0.2% для метаданных и может достигать 16.7% для распределяемой памяти. Для исключения конфликтов при доступе к ресурсам в mimalloc применяются только атомарные операции.

Источник: http://www.opennet.ru/opennews/art.shtml?num=50939