Block underallokering
Blocksuballokering är en funktion i vissa datorfilsystem som gör att stora block eller allokeringsenheter kan användas samtidigt som man effektivt utnyttjar tomt utrymme i slutet av stora filer, utrymme som annars skulle gå förlorat för annan användning till intern fragmentering .
I filsystem som inte stöder fragment kallas den här funktionen också för tail merging eller tail packing eftersom det vanligtvis görs genom att packa "svansen", eller det sista partiella blocket, av flera filer i ett enda block.
Logisk grund
Filsystem har traditionellt delat upp disken i lika stora block för att förenkla deras design och begränsa fragmentering i värsta fall . Blockstorlekar är vanligtvis multiplar av 512 byte på grund av storleken på hårddisksektorerna . När filer allokeras av vissa traditionella filsystem kan endast hela block tilldelas enskilda filer. Men eftersom filstorlekarna ofta inte är multiplar av filsystemets blockstorlek, resulterar denna design i sig i att de sista blocken av filer (kallade tails ) endast upptar en del av blocket, vilket resulterar i vad som kallas intern fragmentering (inte att förväxla med extern fragmentering ). Detta slöseri med utrymme kan vara betydande om filsystemet lagrar många små filer och kan bli kritiskt när man försöker använda högre blockstorlekar för att förbättra prestandan. FFS och andra härledda UNIX-filsystem stöder fragment [ citat behövs ] som kraftigt mildrar denna effekt.
Suballokeringssystem
Blocksuballokering löser detta problem genom att dela upp ett slutblock på något sätt för att tillåta det att lagra fragment från andra filer.
Vissa blocksuballokeringsscheman kan utföra allokering på bytenivå; de flesta delar dock helt enkelt upp blocket i mindre (divisorn brukar vara någon potens av 2). Till exempel, om en 38 KiB- fil ska lagras i ett filsystem som använder 32 KiB-block, skulle filen normalt sträcka sig över två block, eller 64 KiB, för lagring; de återstående 26 KiB av det andra blocket blir oanvänt slack space. Med en 8 KiB-blocksuballokering skulle filen dock uppta bara 6 KiB av det andra blocket, lämna 2 KiB (av 8 KiB-suballokeringsblocket) slack och frigöra de andra 24 KiB av blocket för andra filer.
Svanspackning
Vissa filsystem har sedan dess designats för att dra nytta av detta oanvända utrymme och kan packa ändarna av flera filer i ett enda delat bakblock. Även om detta till en början kan verka som att det skulle öka filsystemets fragmentering avsevärt, kan den negativa effekten mildras med läsfunktioner på moderna operativsystem – när man hanterar korta filer kan flera svansar vara tillräckligt nära varandra för att kunna läsas tillsammans , och därför introduceras inte en disksökning . Sådana filsystem använder ofta heuristik för att avgöra om svanspackning är värt besväret i en given situation, och defragmenteringsprogram kan använda en mer utvecklad heuristik.
Effektivitet
I vissa scenarier där majoriteten av filerna är kortare än hälften av blockstorleken, till exempel i en mapp med små källkodsfiler eller små bitmappsbilder, kan tail packing öka lagringseffektiviteten ännu mer än dubbelt, jämfört med filsystem utan tail packning.
Detta leder inte bara till bevarande av diskutrymme, utan kan också införa prestandaökningar, eftersom mindre data behöver läsas på grund av högre referenslokalitet , vilket också leder till högre effektivitet i sidcache . Dessa fördelar kan dock förnekas av den ökade komplexiteten i implementeringen .
Från och med 2015 är de mest använda läs-skriva filsystemen med stöd för blocksuballokering Btrfs och FreeBSD UFS2 (där det kallas " block level fragmentation" ). En gång populära ReiserFS och Reiser4 inte längre vanliga. [ citat behövs ]
Flera skrivskyddade filsystem använder inte block alls och använder således implicit utrymme lika effektivt som att suballokera filsystem; sådana filsystem fungerar som arkivformat .
Se även
- Daniel Robbins (1 augusti 2001). "Avancerade filsystemimplementeringsguide, del 2" . Gemensamma trådar, IBM . Hämtad 14 december 2006 .