Firma Microsoft otworzyła kod systemu alokacji pamięci mimalloc

Microsoft otworzył bibliotekę na licencji MIT mimallok z implementacji systemu alokacji pamięci pierwotnie stworzonego dla komponentów wykonawczych języków Koka и Lean. Mimalloc jest przystosowany do stosowania w standardowych aplikacjach bez zmiany ich kodu i może pełnić funkcję przejrzystego zamiennika funkcji malloc. Obsługuje pracę w systemach Windows, macOS, Linux, BSD i innych systemach typu Unix.

Kluczową cechą mimalloc jest jego kompaktowa implementacja (mniej niż 3500 linii kodu) i bardzo wysoka wydajność. W wykonane testy mimalloc przewyższał wszystkie konkurencyjne biblioteki alokacji pamięci, w tym jemallok, tcmalloc, snmalloc, obramowanie и Skarb.

Aby ocenić wydajność, zestaw istniejących standardowe testy W niektórych testach mimalloc jest wielokrotnie szybszy niż inne systemy, np. w teście migracji obiektów pomiędzy różnymi wątkami mimalloc okazał się ponad 2.5 razy szybszy niż tcmalloc i jemalloc. Jednocześnie w większości testów obserwuje się również mniejsze zużycie pamięci, w niektórych sytuacjach zużycie pamięci można zmniejszyć o 25%.

Firma Microsoft otworzyła kod systemu alokacji pamięci mimalloc

Wysoką wydajność osiąga się głównie dzięki zastosowaniu darmowego dzielenia list. Zamiast jednej dużej listy mimalloc używa szeregu mniejszych list, z których każda jest powiązana ze stroną pamięci. Takie podejście zmniejsza fragmentację i zwiększa lokalizację danych w pamięci. Strona pamięci to pogrupowany zestaw bloków o podobnym rozmiarze. W systemach 64-bitowych rozmiar strony wynosi zazwyczaj 64 KB. Jeśli na stronie nie ma już zajętych bloków, jest ona całkowicie zwalniana, a pamięć wraca do systemu operacyjnego, co zmniejsza koszty pamięci i fragmentację w długotrwałych programach.

Bibliotekę można włączyć na etapie łączenia lub załadować dla już zmontowanego programu („LD_PRELOAD=/usr/bin/libmimalloc.so mójprogram”). Biblioteka także zapewnia API do integracji funkcjonalności ze środowiskiem wykonawczym i precyzyjną kontrolą zachowania, na przykład do łączenia leniwych procedur obsługi zwalniania pamięci i monotonicznego zwiększania liczników referencji. Możliwe jest utworzenie i użycie kilku „stert” w aplikacji w celu dystrybucji w różnych obszarach pamięci. Możliwe jest także całkowite uwolnienie sterty, bez konieczności przechodzenia przez nią i osobne uwalnianie umieszczonych w niej obiektów.

Możliwe jest zbudowanie biblioteki w trybie awaryjnym, w którym na granicach bloków zostaną podstawione specjalne strony sprawdzające pamięć (strony ochronne), zastosowano randomizację rozkładu bloków i szyfrowanie list zwolnionych bloków. Takie środki umożliwiają blokowanie najpowszechniejszych technik wykorzystywania przepełnień bufora opartych na stercie. Po włączeniu trybu awaryjnego wydajność spada o około 3%.

Wśród cech mimallocu należy zauważyć również, że nie jest on podatny na problemy z wzdęciami ze względu na duże rozdrobnienie. W najgorszym przypadku zużycie pamięci wzrasta o 0.2% w przypadku metadanych i może osiągnąć 16.7% w przypadku pamięci rozproszonej. Aby uniknąć konfliktów podczas uzyskiwania dostępu do zasobów, mimalloc używa wyłącznie operacji atomowych.

Źródło: opennet.ru

Dodaj komentarz