Miсrosoft відкрив код системи розподілу пам'яті mimalloc

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

Ключовою особливістю mimalloc є компактність реалізації (менш ніж 3500 рядків коду) і дуже висока продуктивність. У проведених тестах mimalloc обігнав за продуктивністю всі конкуруючі бібліотеки розподілу пам'яті, включаючи jemalloc, tcmalloc, snmalloc, rpmalloc и Зберігання.

Для оцінки продуктивності використано набір вже існуючих типових тестів У деяких тестах mimalloc випереджає інші системи в рази, наприклад, у тесті міграції об'єктів між різними потоками mimalloc виявився швидше tcmalloc і jemalloc більш ніж у 2.5 рази. При цьому в більшості тестів також спостерігається нижче споживання пам'яті, у деяких ситуаціях витрата пам'яті вдається знизити на 25%.

Miсrosoft відкрив код системи розподілу пам'яті 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% для пам'яті, що розподіляється. Для унеможливлення конфліктів при доступі до ресурсів у мімольок застосовуються тільки атомарні операції.

Джерело: opennet.ru

Додати коментар або відгук