Компания Microsoft откри под лицензия MIT библиотеку с реализации на системата за разпределение на памет, създадена първоначално за runtime-компоненти на езици и . Mimalloc е адаптиран за употреба в стандартни приложения без промяна в техния код и може да служи като прозрачна замяна на функцията malloc. Поддържа работа в Windows, macOS, Linux, BSD и други Unix-подобни системи.
Ключовата особеност на mimalloc е компактността на реализацията (по-малко от 3500 реда код) и много високата производителност. В mimalloc надмина по производителност всички конкурентни библиотеки за разпределение на памет, включително , , , и .
За оценка на производителността е използван набор от вече съществуващи В някои тестове mimalloc изпреварва другите системи многократно, например, в теста за миграция на обекти между различни потоци, mimalloc се оказа по-бърз от tcmalloc и jemalloc с повече от 2.5 пъти. В същото време в повечето тестове също се наблюдава по-ниска консумация на паметта, в някои ситуации успява да намали разходите за памет с 25%.

Високата производителност се постига основно чрез приложение на сегментиране на списъка със свободни блокове (free list sharding). Вместо един голям списък, в mimalloc се използва разделяне на серия от по-малки списъци, всеки от които се привързва към страница с памет. Подобен подход намалява фрагментацията и подобрява локализацията на данните в паметта. Под страницата с памет се подразбира групирана поредица от близки по размер блокове. В 64-битови системи размерът на страницата обикновено е 64 КБ. Ако в страницата няма заети блокове, тя се освобождава напълно с връщане на паметта на операционната система, което позволява да се намалят разходите за памет и фрагментация в дългосрочни програми.
Библиотеката може да се включи на етапа на свързване или да се зареди за вече компилирана програма ("LD_PRELOAD=/usr/bin/libmimalloc.so myprogram"). В библиотеката също така се предоставя за интегриране на функционалност в runtime и прецизно управление поведението, например, за свързване на обработчици за отложено освобождаване на паметта и монотонно увеличаване на броячи на референции. Налична е възможността за създаване и използване на повече от една „куча“ (heap) в приложението за разпределяне на различни области на паметта. Включително е възможно освобождаването на кучи изцяло, без да се преминава през отделното освобождаване на разположените в нея обекти.
Предвидена е възможността за компилиране на библиотеката в безопасен режим, при който на границата на блоковете се извършва заместване с специални проверочни страници на паметта (guard-page), както и се използва рандомизация на разпределението на блоковете и криптиране на списъците за освобождаване на блоковете. Подобни мерки позволяват блокиране на повечето типови техники за експлоатация на препълвания на буфера в купчината. При активиране на безопасния режим, производителността спада с около 3%.
От особеностите на mimalloc се забелязва също и неподвластността на проблеми свързани с раздуване при голяма фрагментация. В най-лошия сценарий, потреблението на памет се увеличава с 0.2% за метаданни и може да достигне 16.7% за разпределената памет. За избягване на конфликти при достъпа до ресурсите в mimalloc се прилагат само атомарни операции.
Източник: opennet.ru
