Przydział płyty - Slab allocation

Alokacja płyty to mechanizm zarządzania pamięcią przeznaczony do wydajnej alokacji pamięci obiektów. W porównaniu z wcześniejszymi mechanizmami zmniejsza fragmentację spowodowaną alokacjami i dezalokacjami. Ta technika służy do zachowywania przydzielonej pamięci zawierającej obiekt danych określonego typu do ponownego wykorzystania przy kolejnych alokacjach obiektów tego samego typu. Jest to analogiczne do puli obiektów , ale dotyczy tylko pamięci, a nie innych zasobów.

Alokacja płyt została po raz pierwszy wprowadzona w jądrze Solaris 2.4 przez Jeffa Bonwicka . Obecnie jest powszechnie używany przez wiele systemów operacyjnych uniksowych i podobnych do Uniksa, w tym FreeBSD i Linux .

Podstawa

Alokacja płyty sprawia, że ​​bardzo kosztowna (w czasie procesora) praktyka inicjalizacji i niszczenia obiektów danych jądra jest rzadka, co może przewyższyć koszt alokacji dla nich pamięci. Gdy jądro często tworzy i usuwa obiekty, ogólne koszty inicjalizacji mogą spowodować znaczne spadki wydajności. Buforowanie obiektów prowadzi do rzadszego wywoływania funkcji, które inicjują stan obiektu: gdy obiekt przydzielony do płyty zostanie zwolniony po użyciu, system alokacji płyty zwykle przechowuje go w pamięci podręcznej (zamiast wykonywać pracę polegającą na jego niszczeniu) gotowy do ponownego użycia następnym razem potrzebny jest obiekt tego typu (unika się w ten sposób pracy nad konstruowaniem i inicjalizacją nowego obiektu).

W przypadku alokacji płyty pamięć podręczna dla określonego typu lub rozmiaru obiektu danych ma pewną liczbę wstępnie przydzielonych „płytek” pamięci; w każdej płycie znajdują się fragmenty pamięci o stałym rozmiarze odpowiednie dla obiektów. Alokator slab śledzi te porcje, dzięki czemu po otrzymaniu żądania alokacji pamięci dla obiektu danych określonego typu zwykle może spełnić żądanie z wolnym gniazdem (fragmentem) z istniejącej płyty. Gdy alokator zostanie poproszony o zwolnienie pamięci obiektu, po prostu dodaje gniazdo do listy wolnych (nieużywanych) gniazd w płycie zawierającej. Następne wywołanie w celu utworzenia obiektu tego samego typu (lub przydzielenia pamięci o tym samym rozmiarze) zwróci to gniazdo pamięci (lub inne wolne gniazdo) i usunie je z listy wolnych miejsc. Proces ten eliminuje potrzebę wyszukiwania odpowiedniej przestrzeni pamięci i znacznie łagodzi fragmentację pamięci. W tym kontekście płyta to co najmniej jedna ciągła strona w pamięci zawierająca wstępnie przydzielone fragmenty pamięci.

Realizacja

Zrozumienie algorytmu alokacji płyt wymaga zdefiniowania i wyjaśnienia kilku pojęć:

  1. Cache : pamięć podręczna reprezentuje niewielką ilość bardzo szybkiej pamięci. Pamięć podręczna to miejsce do przechowywania określonego typu obiektów , takich jak semafory , deskryptory procesów , obiekty plików itp.
  2. Slab : slab reprezentuje ciągły fragment pamięci, zwykle składający się z kilku fizycznie przylegających do siebie stron. Płyta jest rzeczywistym kontenerem danych powiązanych z obiektami określonego rodzaju zawierającej pamięć podręczną.

Kiedy program konfiguruje pamięć podręczną, przydziela pewną liczbę obiektów do płyt powiązanych z tą pamięcią podręczną. Ta liczba zależy od wielkości skojarzonych płyt.

Płyty mogą istnieć w jednym z następujących stanów :

  1. pusty  – wszystkie obiekty na płycie oznaczone jako wolne
  2. częściowy  – płyta składa się zarówno z obiektów używanych, jak i swobodnych
  3. pełna  – wszystkie obiekty na płycie oznaczone jako używane

Początkowo system oznacza każdą płytę jako „pustą”. Gdy proces wywołuje nowy obiekt jądra, system próbuje znaleźć wolną lokalizację dla tego obiektu na częściowej płycie w pamięci podręcznej dla tego typu obiektu. Jeśli taka lokalizacja nie istnieje, system przydziela nową płytę z sąsiednich stron fizycznych i przypisuje ją do pamięci podręcznej. Nowy obiekt zostanie przydzielony z tej płyty, a jego lokalizacja zostanie oznaczona jako „częściowa”.

Alokacja odbywa się szybko, ponieważ system z góry buduje obiekty i łatwo je alokuje z płyty.

Płyty

Płyta to wielkość, o jaką pamięć podręczna może się powiększać lub zmniejszać. Reprezentuje jeden przydział pamięci do pamięci podręcznej z maszyny i którego rozmiar jest zwykle wielokrotnością rozmiaru strony . Płyta musi zawierać listę wolnych buforów (lub bufctls), a także listę buforów, które zostały przydzielone (w przypadku dużego rozmiaru płyty).

Duże płyty

Są to pamięci podręczne, które przechowują obiekty, które mają co najmniej 1/8 rozmiaru strony dla danego komputera. Powodem, dla którego duże płyty mają inny układ niż małe płyty, jest to, że umożliwia to lepsze pakowanie dużych płyt w jednostki wielkości strony, co pomaga w fragmentacji. Płyta zawiera listę bfctls, które są po prostu kontrolerami dla każdego bufora, który może zostać przydzielony (bufor to pamięć, której użyłby użytkownik alokatora płyty).

Małe płyty

Małe płyty zawierają obiekty, które są mniejsze niż 1/8 rozmiaru strony dla danego komputera. Te małe płyty należy zoptymalizować dalej od logicznego układu, unikając używania bfctls (które byłyby tak samo duże jak same dane i powodowałyby znacznie większe zużycie pamięci). Mała płyta to dokładnie jedna strona i ma zdefiniowaną strukturę, która pozwala uniknąć bfctls. Ostatnia część strony zawiera „nagłówek płyty”, czyli informacje potrzebne do zachowania płyty. Zaczynając od pierwszego adresu tej strony, istnieje tyle buforów, ile można przydzielić bez uruchamiania nagłówka płyty na końcu strony.

Zamiast używać bufctls, używamy samych buforów, aby zachować wolne linki do list. Pozwala to ominąć bufctl małej płyty.

Systemy wykorzystujące alokację płyt

  • AmigaOS (wprowadzony w AmigaOS 4 )
  • DragonFly BSD (wprowadzony w wydaniu 1.0)
  • FreeBSD (wprowadzony w 5.0)
  • GNU Macha
  • Haiku (wprowadzony w wersji alfa 2)
  • Horizon ( mikrojądro Nintendo Switch )
  • HP-UX (wprowadzony w 11i)
  • Linux (wprowadzony w jądrze 2.2, niektóre dystrybucje używają metody alokacji SLUB zamiast SLAB, ale SLAB ma lepszą wydajność NUMA) — W systemie Linux alokacja slab zapewnia rodzaj frontonu do alokatora strefowego dla tych sekcji jądra, które wymagają więcej elastyczna alokacja pamięci niż standardowy rozmiar strony 4 KB
  • NetBSD (wprowadzony w 4.0)
  • Solaris (wprowadzony w 2.4)
  • Perl 5 kompilator używa przydzielania płycie wewnętrznego zarządzania pamięcią
  • Memcached wykorzystuje alokację płyt do zarządzania pamięcią
  • iluminaci

Zobacz też

Uwagi

Zewnętrzne linki