Slab alokace (z anglického slab - bar, plate [1] ) je mechanismus správy paměti navržený pro efektivnější alokaci paměti a odstranění výrazné fragmentace . Základem tohoto algoritmu je uložit přidělenou paměť obsahující objekt určitého typu a znovu použít tuto paměť, až bude příště přidělena pro objekt stejného typu. Tato technika byla poprvé představena v SunOS Jeffem Bonwickem [2] a nyní je široce používána v jádrech mnoha unixových operačních systémů, včetně FreeBSD a Linuxu .
Základní myšlenka způsobu alokace slab je založena na pozorováních ukazujících, že některé datové objekty jádra jsou často vytvářeny a ničeny, když už nejsou potřeba. S každou alokací paměti pro objekty tohoto typu se tedy nějaký čas stráví hledáním nejvhodnějšího místa pro tento objekt. Uvolnění paměti po zničení objektu navíc přispívá k větší fragmentaci paměti , což klade na jádro další tlak na reorganizaci paměti.
V případě distribuce slab, kdy programátor používá určitá systémová volání, jsou předem určeny oblasti paměti vhodné pro uložení datových objektů určitého typu a velikosti. Slam alokátor ukládá informace o umístění těchto traktů, známé také jako cache. Pokud tedy přijde požadavek na přidělení paměti pro datový objekt určité velikosti, může okamžitě vyhovět požadavku s již přiděleným slotem. Zničení objektů však paměť neuvolní, pouze otevře slot, který je slab alokátorem umístěn na seznam volných slotů. Příští volání k přidělení paměti stejné velikosti vrátí paměťový slot, který se aktuálně nepoužívá. Tento proces eliminuje potřebu hledání vhodného umístění paměti a výrazně snižuje fragmentaci paměti. V tomto kontextu je slab jedna nebo více souvislých stránek v paměti obsahujících předem alokované části paměti.
Pochopení rozložení desek vyžaduje definování následujících pojmů:
Když program vytvoří mezipaměť, přidělí jí řadu objektů. Jejich počet závisí na velikosti přidružených desek. Deska může být v jednom z následujících stavů:
Zpočátku systém označí každou desku jako „prázdnou“. Když proces požaduje nový objekt jádra, systém se pokusí najít volné místo pro tento objekt v částečně obsazené mezipaměti slab pro daný typ objektu. Pokud takové místo neexistuje, systém přidělí nový slab ze sousedních fyzických stránek a předá je do mezipaměti. Do této desky je umístěn nový objekt a toto místo je označeno jako „částečně obsazené“.
Hlavní výhodou slab algoritmu je, že paměti je alokováno přesně tolik, kolik je potřeba. Nedochází tedy k fragmentaci vnitřní paměti. Alokace je rychlá, protože systém vytváří objekty s předstihem a snadno je alokuje z desky.
Slab - množství paměti, díky kterému může cache růst nebo zmenšovat. Představuje alokaci paměti do mezipaměti a její velikost je obvykle násobkem velikosti stránky paměti. Slab musí obsahovat seznam volných bufferů a také seznam bufferů, které byly přiděleny (v případě velkého slab).
Navrženo pro mezipaměti, které ukládají objekty, které mají alespoň 1/8 velikosti stránky paměti stroje. Velké slaby jsou strukturovány odlišně od malých slabů, aby se lépe vešly do paměťových stránek, čímž se zabrání fragmentaci. Slab obsahuje seznam řadičů vyrovnávacích pamětí, což jsou řadiče pro každou vyrovnávací paměť, kterou lze alokovat (vyrovnávací paměť je paměť, kterou bude používat uživatel slab alokátoru).
Obsahují objekty, které nepřesahují 1/8 velikosti stránky paměti zařízení. Měly by být optimalizovány odděleně od logické struktury, aby se zabránilo použití řadičů vyrovnávací paměti (které by byly stejně velké jako data v nich, což by způsobilo mnohem větší paměťovou zátěž). Malé slaby zabírají přesně jednu stránku a mají strukturu, která jim umožňuje vyhnout se ukládání do vyrovnávací paměti. Poslední část stránky obsahuje „hlavičku desky“, což jsou informace potřebné k uložení desky. Počínaje první adresou stránky je k dispozici tolik vyrovnávacích pamětí, kolik lze alokovat bez použití slab záhlaví na konci stránky.
Místo obvyklého použití řadičů vyrovnávací paměti se k uložení seznamu volných linek používá vyrovnávací paměť. To vám umožní obejít se bez použití regulátorů vyrovnávací paměti v malých slabech.