Microsoft откри кода на системата за разпределение на паметта mimalloc

Компания Microsoft откри под лицензия 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%.

Microsoft откри кода на системата за разпределение на паметта mimalloc

Високата производителност се постига основно чрез приложение на сегментиране на списъка със свободни блокове (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 се прилагат само атомарни операции.

Източник: opennet.ru

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster