Fragmentering (datateknik)

Fragmentering i ett filsystem innebär att data som hör ihop inte finns samlat på disken. Om en fil (data) ligger samlad kan den läsas allteftersom hårddisken snurrar runt, men om den är uppdelad på flera ”spår” eller ”cylindrar” måste läs- och skrivhuvudet flytta sig medan filen läses, en mycket långsammare operation. Fragmentering av minnesrymden kan i sin tur betyda att tillräckligt mycket minne finns tillgängligt, men inte i så stora block som ett program skulle behöva.

För att korrigera fragmentering i ett filsystem använder man en process kallad defragmentering. Moderna filsystem använder också olika strategier för att motverka fragmentering.

Det finns tre olika men besläktade sorters fragmentering: extern fragmentering, intern fragmentering, och datafragmentering. Olika lagringsmedier uppvisar en eller flera av dessa svagheter, vilket leder till reducerad effektiv lagringskapacitet.

Extern fragmentering 
Extern fragmentering uppstår när det lediga lagringsutrymmet blir uppdelat i allt mindre delar som inte ligger jämte varandra. Detta sker naturligt då minnesområden av varierande storlekar allokeras, frigörs och återallokeras. Moderna minneshanterare och filsystem är konstruerade för att kunna motverka fragmentering.

Problemet uppkommer eftersom ett behov av ett mindre minnesblock kan tillfredsställas genom ett sådant minnesblock var som helst, medan allokeringen av detta minnesblock kan förhindra att blocken före och efter används då ett större enhetligt block behövs, också om de tillsammans skulle vara tillräckligt många.

Resultatet blir att trots att det finns ledigt minnesutrymme, är det utrymmet i praktiken obrukbart eftersom det är uppdelat i så små bitar att de är oanvändbara för många ändamål. I värsta fall blir varje program i en situation där det inte kan frigöra tidigare allokerat minne innan det får ett större minnesblock, som alltså aldrig kommer att ske.

Termen "extern" syftar på att de på grund av fragmentering otillgängliga minnesområdena inte är allokerade.

Extern fragmentering i ett filsystem kan ge upphov till långsamma söktider, eftersom filer inte lagras i efter varandra följande sektorer utan istället utspritt över diskens hela yta. I de flesta moderna operativsystem finns program som kan användas för att i viss mån defragmentera hårddisken, det vill säga göra den mindre fragmenterad.

Extern fragmentering i arbetsminnet är svårare att åtgärda. Vissa skräpsamlare kan slå ihop små oanvända minnesblock till större minnesblock som då kan användas för större allokeringsenheter. Problemet hanteras mer allmänt genom att skilja mellan den fysiska adressen till minnesblock och en virtuell adress till dem. På så sätt kan ett program hantera minnesblock som i verkligheten ligger spridda som om de låg efter varandra, så länge den virtuella minnesrymden inte är fragmenterad. Den virtuella minnesrymden å sin sida görs så stor att det alltid finns lediga enhetliga områden (detta är en viktig orsak till övergången från 32-bitsarkitekturer till 64-bitsarkitekturer). Kopplingen mellan virtuell och fysisk adress sköts genom en särskild enhet inom centralprocessorn.

Intern fragmentering 
Intern fragmentering uppstår när lagringsutrymme begärs och allokeras, men sedan inte används. Även om det kan verka vara slösaktigt att göra så, accepteras det ofta i gengäld mot ökad effektivitet eller enkelhet. Termen "intern" syftar på att de oanvända minnesområdena ligger inom allokeringsenheterna.

Till exempel börjar filer i de flesta filsystem alltid i början av ett diskblock, eftersom detta förenklar filsystemets organisation och gör det lättare att förlänga filer – en väldigt vanlig operation. Allt utrymme mellan filens sista byte och slutet av diskblocket som byten befinner sig i är intern fragmentering. Ju större blocken är, desto större blir den interna fragmenteringen, speciellt om filerna är små.

Till skillnad från andra typer av fragmentering är intern fragmentering inom allokeringsenheterna omöjlig att förhindra, den är ett pris man betalar för att effektivera minneshanteringen. Filsystem avsedda för små filer kan hantera denna fragmentering genom att packa ”svansarna” på flera filer i samma block, separat från resten av filen. ReiserFS använder denna teknik.

Då den interna fragmenteringen gäller allokerat utrymme som spänner över flera allokeringsenheter kan operativsystemet låta bli att allokera fysiskt utrymme för allokeringsenheter som inte alls används: en allokerad virtuell adress kopplas ihop med ett visst minnesblock först då någonting de facto skrivs i detta block. I Unix' filsystem sägs filer ha hål om block på hårddisken inte allokerats för hela filen.

Se även
 Defragmentering

Minneshantering