Miсrosoft адкрыў код сістэмы размеркавання памяці mimalloc

Кампанія Miсrosoft адкрыла пад ліцэнзіяй MIT бібліятэку mimalloc з рэалізацый сістэмы размеркавання памяці, першапачаткова створанай для runtime-кампанентаў моў Koka и Нахіліцеся. 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/XNUMX% для размеркаванай памяці. Для выключэння канфліктаў пры доступе да рэсурсаў у mimalloc прымяняюцца толькі атамарныя аперацыі.

Крыніца: opennet.ru

Дадаць каментар