Slab-allokering (från engelska slab- bar, plate [1] ) är en minneshanteringsmekanism utformad för att mer effektivt allokera minne och eliminera betydande fragmentering . Grunden för denna algoritm är att lagra allokerat minne som innehåller ett objekt av en viss typ, och återanvända detta minne nästa gång det tilldelas för ett objekt av samma typ. Denna teknik introducerades först i SunOS av Jeff Bonwick [2] och används nu flitigt i kärnorna i många Unix-operativsystem, inklusive FreeBSD och Linux .
Den grundläggande idén bakom sättet som plattan allokeras är baserad på observationer som visar att vissa kärndataobjekt ofta skapas och förstörs när de inte längre behövs. Sålunda, med varje tilldelning av minne för objekt av denna typ, ägnas en del tid åt att hitta den mest lämpliga platsen för detta objekt. Dessutom bidrar frigöring av minne efter att ett objekt har förstörts till mer minnesfragmentering , vilket lägger ytterligare stress på kärnan för att omorganisera minnet.
När det gäller skivdistributionen, när programmeraren använder vissa systemanrop, är minnesområdena som är lämpliga för att ta emot dataobjekt av en viss typ och storlek förutbestämda. Plattfördelaren lagrar information om platsen för dessa områden, även kända som cacher. Således, om en begäran kommer in för att allokera minne för ett dataobjekt av en viss storlek, kan den omedelbart tillfredsställa begäran med den redan allokerade luckan. Men att förstöra objekten frigör inte minnet, det öppnar bara luckan, som placeras på listan över lediga platser av plattfördelaren. Nästa anrop för att allokera minne av samma storlek returnerar en minnesplats som inte används för närvarande. Denna process eliminerar behovet av att hitta en lämplig minnesplats och minskar minnesfragmenteringen avsevärt. I detta sammanhang är en skiva en eller flera sammanhängande sidor i minnet som innehåller förtilldelade minnesbitar.
För att förstå plattfördelningen måste du definiera följande termer:
När ett program skapar en cache, allokerar det ett antal objekt till den. Deras antal beror på storleken på de tillhörande plattorna. Plattan kan vara i ett av följande tillstånd:
Inledningsvis markerar systemet varje platta som "tom". När en process begär ett nytt kärnobjekt, försöker systemet hitta ledigt utrymme för det objektet i den delvis upptagna skivcachen för den objekttypen. Om det inte finns någon sådan plats allokerar systemet en ny skiva från angränsande fysiska sidor och skickar dem till cachen. Ett nytt objekt placeras i denna platta och denna plats markeras som "delvis upptagen".
Den största fördelen med skivalgoritmen är att minnet allokeras exakt så mycket som krävs. Det finns alltså ingen intern minnesfragmentering. Allokeringen går snabbt eftersom systemet skapar objekt i förväg och enkelt allokerar dem från plattan.
Slab - mängden minne som cachen kan växa eller krympa på grund av. Det representerar allokeringen av minne till cachen, och dess storlek är vanligtvis en multipel av minnessidans storlek. Plattan måste innehålla en lista över lediga buffertar, samt en lista över buffertar som har tilldelats (vid en stor platta).
Designad för cacher som lagrar objekt som är minst 1/8 av sidstorleken i maskinens minne. Stora plattor är strukturerade annorlunda än små plattor för att passa bättre på minnessidor och på så sätt undvika fragmentering. Plattan innehåller en lista över buffertkontroller, som är kontrollerna för varje buffert som kan allokeras (bufferten är det minne som användaren av skivallokatorn kommer att använda).
Innehåller föremål som inte överstiger 1/8 av maskinens minnesstorlek. De bör optimeras separat från den logiska strukturen och undvika användningen av buffertkontroller (som skulle vara lika stor som data i dem, och därmed orsaka mycket mer minneskostnader). Små plattor tar upp exakt en sida och har en struktur som gör att de slipper buffra. Den sista delen av sidan innehåller "slab header", vilket är den information som behövs för att lagra plattan. Från och med den första adressen på sidan finns det så många buffertar som kan tilldelas utan att använda en skivhuvud i slutet av sidan.
Istället för den vanliga användningen av buffertkontroller används en buffert för att lagra en lista med lediga länkar. Detta gör att du klarar dig utan användning av buffertkontroller i små plattor.