Filesystem -=-=-=-=-=-= I came, I saw, I deleted all your files. Jedna z prvních funkcí, které OS dělaly je file system. Ten má za úkol namnožit jeden disk na mnoho souborů. UNIX jako první měl hiearchickou strukturu na rozdíl od MSDOSu ale nemá více disku pod písmenky, ale každý filesystém se připojuje do nějakého podadresáře hlavního filesystému. (na tento systém už částečně přešly i Windows, které místo adresáře / mají "tento počítač" :) Na filesystém je opět kladeno několik protichůdných požadavků - Rychlost - Úspornost - Bezpečnost - Aby nebyly příliš malé omezení na velikost FS a souborů Jeden ze způsobů je rozdělit disk na bloky určité velikosti a ty přidělovat souborům. Je ale nutné někde držet tabulku komu který blok patří. FAT Mezi nejklasičtější řešení patří FAT. Na disku se vyhradí místo, kde každý blok má svoje číslo. To označuje následující blok. Pokud chcete načíst soubor a víte jeho první bok, načtete první blok a pomocí tohoto čísla se dostanete na další atd. až na konci je jakási zarážka. Nepoužité bloky jsou potom označeny speciálním číslem. Tato struktura má ale překvapivě všechny záporné vlastnosti: Je pomalá - pro načtení každého bloku potřebujete jeden přístup do fat. Jsou metody, které jich potřebují mnohem méně. Alokace volných bloků znamená, že musíte projít celou FAT a najít nepoužité bloky. Není možné bloky udržovat ve stejném seznamu jako soubory, protože by to přinášelo velkou fragmentaci (bloky se nemusí uvolňovat a přidávat do seznamu tak, jak jdou fyzicky za sebou). A je téměř nemožné používat nějaké chytřejší alokační algoritmy zabraňující fragmentaci Je nebezpečná - Je velmi snadné tabulku poškodit. Přepsáním několika KB disku můžete ztratit veškteré informace o rozložení disku. Je možné udržovat dvě kopie FAT, ale to zase zdržuje. Také je náchylná k crosschainům, lostchainům apod. Je omezená - to asi všichni znáte. Napřed v DOSu FAT omezili na 32MB, pak na 2GB apod. Je to dané tím, že je třeba určit velikost ukazatelů a to omezuje počet bloků. Je marnotratná - FAT je přinejmenším omezena tím, že se musí celá vejít do paměti (jinak není možný žádný efektivní algoritmus na vyhledání volných bloků) (mimochodem FAT32 se už do RAM nevejde). To omezuje počet bloků na disku a zvětšuje je. To přináší další plýtvání. Je mnoho přirozených cest jak tuto strukturu vylepšit: 1) udělat dvě kopie - zvýší to bezpečnost ale zhorší všechny ostatní paramety 2) umístit ji doprostřed disku, aby byla blíž datům - zvýší rychlost a bezpečnost (většinou se přepisuje začátek disku) a ostatní neovlivní. To používá třeba OS/2 3) rozdělit disk na části (groups). To přináší mnoho zajimavých vylepšení: 1) částečně odpadají limity na velikost disku, protože group se může chovat do jisté míry jako oddělená parition. 2) je možné zrychlyt alokaci bloků, protože je možné védst informaci o počtu volných bloku v každé části a pokoušet se alokovat pouze tam, kde to má smysl. Navíc je možné tyto informace využít v algoritmech zabraňujících fragmentaci 3) Je možné udržovat "lokalitu dat". Tedy adresář, jeho soubory a záznamy o rozložení ukládat pokud možno do stejné části. To zvyšuje rychlost (informace jsou blízko dat) a snižuje fragmentaci 4) zvyšuje to bezpečnost, protože přemazáním části disku poškodíte maximálně pár group To je první z rozšíření, které má ext2fs v Linuxu UNIXový filesystém Inode UNIXy zase používají úplně jiný způsob uložení informací o souborech. Volné místo na disktu je spravováno pomocí bitmapy - každý blok ma bit, pokud je nastaven na 1, je použitý, jinak je volný. To zrychluje postup vyhledávání volného místa. Ve Vivafs navíc mají bitmapu po čtyřech a osmi blocích, která ještě urychluje vyhledávání ale zase zvyšuje marnostratnost. V případě, že je disk rozdělen do částí, jsou bitmapy dostatečně malé, aby je bylo možné projít. Každý soubor je v UNIXu represenotván číslem Inode. Každá inoda má pevně danou pozici v inodové tabulce. Každá inoda obsahuje informace o velikosti souboru, přístupových právech apod. Navíc ale obsahuje přímo několik odkazů na bloky souboru, takže několik prvních KB souboru lze načíst bez dalších přístupů na disk. Pak obsahuje odkaz na indirect block. To je blok obsahující pouze odkazy na další bloky s daty. Takže několik dalších MB souboru lze načíst s jedním přístupem navíc. Pak obsahuje odkaz na dva double a triple indirect bloky. Ty obsahují odkazy na indirect bloky a tak soubor může mít i několik GB. Inodová tabulka inonoda 2 data +-------+ +----------+ +----------+ |ino0 | | parametry| +-------------->| blok0 | |ino1 | | souboru | | +------------>| blok1 | |ino2 +----->|(práva...)| | | | blok2 | |ino3 | | | | | +--------+ | blok3 | ...... |direct bl.+------+ | |direct b|>| blok4 | |direct bl.+--------+ |direct b|>| ..... | |indirect b+---------->|direct b|>| | |dindirect | | ..... | | | |tindirect | | | | | +----------+ Tento způsob je velmi rychlý, je také poměrně bezpečný - protože tabulky jsou rozdistribuovány a pomocí inodvých tabulek lze opravit bitmapy a naopak. Jeho hlavní omezení je v tom, že velikosti tabulek na inody jsou pevně dané a tak se může stát, že dojdou. V Linuxu se mi to ale ještě nestalo. Existují filesystémy co Inode tabulku održují v B stromech a tak může neomezeně růst a zmenšovat se za celkem malou cenu v rychlosti. Na druhou stranu to ale zmenšuje bezpečnost, protože Inode tabulka se může snadno rozpadnout. Adresáře Adresáře v UNIXu jsou vpodstatě jenom převodní tabulky mezi jménem souboru a adresářem. Adresáře se běžně udžřují jako normální soubory obsahující záznamy za sebou. Má to ale nevýhodu, že když nějaký soubor smažete, vytvoří se díra a tak některé adresáře zabírají zbytečně mnoho místa. Jiná metoda jak udržovat adresáře jsou bstromy a nebo hashovací tabulky. To umožňuje mnohem rychlejší proheldávání adresářů (V UNIXU se to většinou obcházi tak, že při prvním přistupu se adresář nahraje do paměti a tam se zahashuje). Takové uložení adresářů používá Amiga. Nevýhoda ale zase je, že vypsání souborů v adresáři je pomalé. Na Amize se to také řešilo tak, že se adresář navíc ukládal normálně. Vypisování v Inodových filesystémech je také pomalé. Protože pokud potřebujete nejenom jméno ale i některé další informace (délku souboru apod.) je nutné načíst i inody jednotlivých souborů. Proto je directory cache v UNIXu důležitá. Superblock Superblock je blok obsahující informace o filesystému - o jaký typ se jedná, jak je velký a další parametry. V DOSu se jmenuje MBR. Protože se jedná o velmi důležitá data, UNIXové filesystémy mají hned několik kopií tohoto superblocku. Ext2fs dělá na začátku každé groupy jeden. Klasické UNIXové informace ukládají do superblocku ještě jednu šikovnou informaci - jestli je vpořádku. Při pripojení filesystému se nastaví flag, že filesystém je používán. Potom, co se filesystém odmountuje, flag se zpátky snuluje. Navíc v případě, že při přístupu k filesystému se vyskytla chyba, nastaví flag, že filesystém je vadný. Při rebootu se potom tyto flagy zkontrolují a v případě, že filesystém není v pořádku, zkontroluje se. Hard linky a symbolické linky Inodový přístup v UNIXových filesystémech má jednu zajímavou výhodu - je možné vytvořit více adresářových položek pro jednu inodu a tak jednomu souboru dát dvě jména. To se v UNIXu často používá. Inoda potom zaniká pouze v případě, že žádná adresářová položka už na ni neukazuje. Musí tedy mít čítač odkazů na ni. Toto řešení má ale jedno omezení - není možné tyto linky provádět mezi filesystémy. Většina UNIXů navíc neumožňuje hard linkovat adresáře. To odstraňuje soft link. To je soubor se speciálním flagem obsahující pouze cestu na nový soubor. Při otevření tohoto souboru se tento link následuje a otevře se soubor jiný. To narozdíl od hard linku umožňuje dělat libovolně. Chová se ale trochu jinak - je o něco pomalejší, nastavením přístupových práv pro link se nezmění přístupová práva původního souboru a pokud smažete původní soubor, inoda se uvolní a link přestane fungovat. Někeré zajímavé vylepšení Extend based alokace Jiné vylepšení inodového systému je neukládat ukazatele na jednotlivé bloky ale na bloky bloků (soubor začína blokem 10, je sfragmentován po bloce 18, začíná na 22 a končí na 40). Při nízké fragmentaci (na Ext2fs je většinou pod 10%) by to mohlo úplně zamezit indirect a double indirect blokům. Probém tohoto řešení je to, že se špatně implementují děravé soubory z POSIXu. (UNIXové filesystémy většinou umožňují udělat do souboru díru, která čte jako samé nuly. V tohoto uložení to vyžaduje předělání celé tabulky v případě, že díra vzniká uprostřed) Do Ext2 se do budoucna plánuje, že bude podporovat obojí. Po založení souboru bude používat tento způsob a potom, co do něj někdo vytvoří díru (nestává se to často) Inoda se překonvertuje. Sparse bitmap Sparse bitmap je jiný formát uložení alokačních informací. Výchází také z uvahy, že soubory jsou často málo fragmentované. Narozdil od extend alokace ale neukládá intervaly, ale bitmapy. Není možné uložit bitmapu celého disku (kde 1 znamená, že zrovna tam je soubor uložen a 0 že není). Tato bitmapa by byla většinou nulová a tak by zabírala zbytečně mnoho místa. Sparse bitmap se zkládá z položek, kde každá obsahuje část této bitmapy. Obsahuje začátek bitmapy a velikost této části (0-256) pak následuje bitmapa. Tento způsob uložení je mnohem optimálnější, než normální direct a indirect bloky. Stejně jako v extendové alokaci jsou problémy s dírama v souborech. Narozdíl ale od extendů lépe podporuje "trochu sfragmentované soubory". Tento způsob uložení používá Vsta. Poslední implementační problém je to, že vytváření a práce s těmito bitmapama je poněkud pomalá a tak při dnešním poměru výkon CPU/výkon disku se často nevyplácí. Defragmentační algoritmy Jedním z největších problémů filesystému je fragmentace. Tu ale lze omezit vhodnou heruistikou. Existuje mnoho způsobů například. Nejjdenodušší asi je pre-alokace. Při zápisu do souboru se naalokuje hned několik dalších bloků. To zamezí tomu, aby jiný soubor nenaalokoval bloky těsně za tímto souborem a nezamezil jeho růstu. Navíc to urychlí alokaci, protože se neprovádí tak často. (Tento algoritmus používá většina FS - Ext2, nebo i Windows :) Dalším vylepšením je to, že na začátku se pro soubor najde malá díra a v případě že soubor z ní vyroste, najde se díra větší. To zařídí, aby malé soubory učině zaplácaly malé díry a velké soubory se sice na začátku jednou, nebo dvakrát sfragmentují ale vzhledem k jejich velikosti to nevadí. Při použití bitmap se nabízí další jednoduché vylepšení - pokusit se alokovat (a prealokovat) tak, aby se v bitmapě vyskytovalý buď 00, nebo FF. To způsobí, že díry ve filesystému jsou dostatečně velké. Při alokaci je pak dobré se napřed dívat po 00 a teprve když se žádná nenajde hledat nulový bit. To způsobí, že u "špatně" zaplňených bloků systém bude prostě čekat, až se tento blok uvolní tak dlouho, jak jen to bude možné. Je samozřejmě i mnoho dalších algoritmů. Ext2fs v Linuxu implementuje všechny zmíněné a výsledek je docela dobrý. Za 5 let používání Linuxu a po několika reinstalacích je fragmentace mého disku asi 8%. Takže defragmentační program vůbec není třeba. Komprese Další z možných vylepšení filesystému je komprese. Asi nejklasičtější program na kompresi disku je stacker jeho obdoba pod Linuxem je double. Ten funguje tak, že vytvoří normální disk dvojnásobné (nebo větší) velikosti, než je fyzická velikost a disk potom kompresuje tak, jako by se jednalo o jeden soubor. Tento postup má ale několik nevýhod. Výsledné komprese se může výrazně lišit od té odhadnuté na začátku a tak se může stát, že virtuální disk je sice plný ale fyzický ne, nebo naopak, že na fyzický disk se už nic nevejde ale na virtuální ještě ano. To je větší problém, protože systém bude chtít na disk zapsat, ale kompresní program to už udělat nemůže. Většina programů se zachová tak, že dá disk read only, nebo hlásí špatný sektor. Navíc toto řešení způsobuje dvojí fragmentaci. Jedna je klasická na virtuálním disku. Druhá je na fyzickém - v případě, že na určité místo se uloží data, která se zabalí méně, než ta přehcházející. Proto je fragmentace opravdový problém. I bezpečnost není nejlepší - při poškození fyzického disku se jednak může rozbít alokační tabulka kompresního programu a jednak poškodit data, které pak rozhodí filesystém na virtuálním disku. Existuje i jiné řešení - přidělat kompresi rovnou do filesystému - soubory se při ukládání budou kompresovat a ukladat se rovnou zabalené. To zvyšuje bezpečnost - tabulky filesystému kompresované nejsou a tak jsou mnohem méně náchylné vůči chybám. Zabraňuje dvojité fragmentaci. Má i několik dalších výhod - je možné u každého souboru nastavit jak bude pakován a tak zabalit pouze málo používané soubory apod. I toto řešení ale zvyšuje fragmentaci (v případě, že někdo uloží doprostřed souboru nová data, která se zabalí jinak) jinak se ale zdá být ve všech ohledech lepší. Pro ext2fs existuje patch e2compr, který implementuje popsanou metodu. Funguje velmi spolehlivě. Je zatím ve vývoji ale bude pravděpodobně zařazen do oficiálního Linuxu před verzí 2.2. Některé zajímavé filesystémy Ext2fs Je mnoho různých přístupů k filesystému. Do jednoho filesystému není možné dát všechny tato vylepšení, protože jsou často protichůdná. Proto jsem si vybral několik zajímavějších filesystému a popíšu krátce jejich implementaci. Jako první jsem si vybral Ext2fs, protože je to velmi rychlý a bezpečný filesystém. Jeho autoři podrobně studovali ostatní dostupné návrhy a vytvořili překvapivě jednoduchý filesystém, který přesto v mnoha parametrech předčí i ty nejsložitější konkurenty. Používá ho Linux a tak umí vše, co běžné UNIXové filesystémy (hard linky, soft linky, děravé soubory apod.) Velikost filesystému je omezena na (tedy 4,5TB), velikost souboru na 4GB, délka názvu na 256 znaků. Filesystém je poněkud marnotratný, ale není to nejhorší. Na 300MB disku je režije za tabulky 10MB, tedy okolo 3%. To lze snížit, pokud snížíte počet Inode. Standardně se vytváří jedna Inode na 4KB. Můj (téměř plný) disk obsahuje 154432 inod z nihž je 113255 vloných. Superblock obsahuje magické číslo EF53 hexa (Extended Filesystem verze 5.3), informaci o tom, jestli je filesystem vpořádku, velikosti inod a další informace. Také lze nastavit počet rebootů po kterém se filesystem zkontroluje (defaultně 20), nebo časový interval a minimální počet bloků a inod pro některého uživatele (roota). Velikost bloků je volitebná, nejčastěji se používá 1KB. Disk je rozdělený do skupin (group) standardně po 8192 blocích. Každá groupa obsahuje kopii superblocku, všechny descriptory group (kde jsou bitmapy, kolik je volných bloků a inod, kolik je v inodě adresářů), tabulku inod, bitmapu bloků a bitmapu inod. Inoda obsahuje všechny běžné informace, 6 ukazatelů na bloky, jeden na indirect, double indirect a triple indirect. Filesystém provádí všechny popsané defragmentační algoritmy. Navíc podporuje fast symbolické linky - pokud je název dostatečně krátký, nahraje se přímo do tabulky pro bloky a tak se ušetří 1KB. Navíc je ale filesystém velmi rozšiřitelný. Inody obsahují místo na atributy a další dodatečné informace. V inodách jsou položky a atributy plánované pro ACL, kompresi, intervalovou alokaci, swapování do filesystému a další rozšíření. Většina z nich již byla experimentálně implementována. Pod GNU hurdem byly přidány translatory. Existují ovladače pro Linux, Hurd, Planem9, Windows95 (read only), Dos, DJGPP, WindowsNT, OS/2 a další. Extend based filesystém Tento filesystém implementuje například Vsta. Extend based filesystem kombinuje nápad z Extent based alokace (ukládat intervaly) s jednoduchým vylepšením FAT - ukazatel na další blok se nedává do zvláštní tabulky ale na začátek tohoto bloku. Takže každý blok je uveden délkou souvislého intervalu a ukazatelem na další. To umožňuje používat velmi malé bloky (třeba i velikosti 1 byte). To šetří mnoho místa. Protože se Inoda ukládá začátku prvního extentu souboru, odpadá omezení na počet inod (číslo inode je potom fyzická pozice inode na disku). Extend je based filesystem velmi rychlý na čtení - pokud víte začátek souboru, jedním přístupem načtete celý první fragment souboru a víte začátek dat, přístupová práva apod. Takže vlastně nepotřebujete žádné přístupy navíc. Volné bloky se udržují také v seznamu. Seznamy se třídí a bloky se spojují pokud to je možné. List začíná v nějakém sektoru, tam je několik položek seznamu plus ukazatel na další sektor se seznamem. Pokud v daném sektoru klesne počet položek na 0, sektor se uvolní a nezabírá žádné místo na disku. Díky tomu je režije disku na udržování tabulek s volným místem nulová. Pokud na disku není žádné volné místo, ani žádné takové sektory neexistují. Tento způsob ukládání volného místa umožňuje relativně inteligentní alokaci - je velmi jednoduché alokovat dopředu. Vsta při vytvoření souboru naalokuje první sektor (512 byte). Pokud soubor přesáhne tuto délku, naalokuje souvislý blok za tímto sektorem až do délky 64 kb (to lze v lineárních seznamech udělat velmi snadno). Kdyby byl disk rozdělen do group, bylo by možné dělat i další popsané optimalizace Tento přístup má ale i některé nevýhody - je velmi těžké filesystém opravit, více se fragmentuje (protože se může rozpadnou na velmi malé části), má problémy s děravými soubory apod. V poslední době se vyskytlo několik projektů, které se snaží na tomto principu vyvinou bezpečnější a méně se fragmentující filesystém. Také buffer cache v systému musí být navržena poněkud jinak a pracovat z bloky libovolné délky. LOG FS (Journaling FS) Jeden z nejšílenějších a nejzajímavějších návrhů filesystémů posledních let je logfs. Má oproti popsaným filesystémům dvě hlavní výhody - několikanásobně rychlejší zápisy a téměř 100% odolnost vůči pádům systému - po opětovném nastartování systému není nutné filesystém kontrolovat. Jak tohoto lze dosáhnout? Na začátky bylo pozorování, že klasické filesystémy se nechovají nejlépe například v situaci, kdy máte fragmentovaný soubor a ten chcete na několika místech přepsat. Disk potom musí jezdit po oddělených částech souboru a přepisovat je. Tato situace je například velmi častá u adresářů. LogFS se chová úplně jinak. Základní myšlenka spočívá v tom, že data se sekvenčně zapisují do "logu" což je jakýsi seznam změn. To způsobí zrychlení při zápisu. Disk totiž vůbec nemusí seekovat. Jednotlivé změny se napřed udržují v cache a zkoncentrují na větší bloky a teprve potom se asynchroně uloží. Inody potom obsahují informace o tom, kde jsou poslední verze jednotlivých částí souboru. Protože se Inody logují stejným způsobem, je filesystém v každém svém stádiu na disku korektní. Jiný důsledek je také to, že mazání a vytváření souborů nevyžaduje krátké zápisy do jednotlivých tabulek ve filesystému a tak je několikanásobně rychlejší. Protože jsou inody náhodně roztroušené po disku a stále se stěhují, je nutné udžovat mapu inod, která hlídá, kam se která inoda odstěhovala. Remapovací tabulka také obsahuje o tom, jestli je inoda obsazená, nebo volná a o verzi. Tato tabulka se ukládá do logu stejně jako všechny ostatní a stejně tak se cachuje. Pokud přeskočíme hledání v inodové mapě, je čtení z disku stejné jako v klasických filesystémech a proto i stejně rychlé. Jedna z věcí, o které jsem zde pomlčel je co se stane v případě, že log dojde na konec disku. Zde je řešení také ale celkem jednoduché. Filesystém je schopný zjistit, které pozice na disku jsou ještě třeba a které jsou už free. Disk si rozdělí na nějaké větší segmenty (1MB). V případě, že log je na konci, najde nějaký volný segmenty a začne zapisovat tam. Protože jsou segmenty velké, není zpomalení velké. V případě, že žádný volný segmenty není, najdou se dva částečně použité, spojí do jednoho a tak se nový segment uvolní. To lze udělat tak, že prostě segmenty načtete do cache, uvolníte je a oni se potom samy uloží do logu. K určování volných bloků se používá informace ze začátku. Ta obsahuje informace o tom, které bloky jsou obsaženy kterými soubory a verze těchto souborů. Pokud verze nesedí, ví se, že bloky jsou volné. Pokud verze sedí, je nutné porovnat data z inod. Navíc filesystém udržuje v paměti informace o počtu volných bloků v každém segmentu. Experimentální výsledky ukazují, že filesystém je několikanásobně rychlejší při zápisu a asi o 10% pomalejší při čtení kvůli zvýšené fragmentaci. ReiserFS ReiserFS je poslední zajímavý filesystém, o kterém bych chtěl napsat. Tento filesystém navrh Hans Reiser a napsal jeho ovladač pro Linux. ReiserFS je zatím v vývoji a ovladač není v oficiálním kernelu. Kód je ale už velmi stabilní a některé servery jej používají pro squid cache. Naní ale zaručena zatím zpětná kompatibilita. Domácí stránka se nachází na http://idiom.com/beverly/reiserfs.html. Jeho autor se narozdíl od autorů ostatních filesystémů zaměřil zejména na krátké soubory. Běžné filesystémy nejsou z tohoto pohledu příliš efektivní. Autor předpokládá, že to je důvod, proč na disku malých souboru je relativně málo - autoři aplikací je sami spojují do větších, aby ušetřili místo. Na DOSu to je vzhledem k neefektivitě dat mnohem častější, než na UNIXu. Ale i tam například pošta je jeden soubor, přesto že by to mohl být adresář obsahunící jednotlivé dopisy. Proto autor předpokládá že počet krátkých souborů stoupne v případě, že filesystém je bude dobře zvládat. Velikost souborů zaokrouhlují na velikost bloku a tím plýtvají místem (na FAT pod DOSem a Windowsy je na 1GB disku jeden blok dlouhý 128KB a každý soubor, který obsahuje třeba jenom jeden znak zabírá celý blok). I když není počet bloků omezen, je volba jejich velikosti problematická. Menší bloky přináší zpomalení a zvětší alokační tabulky. Větší bloky sice zrýchlí ale zase zvýší režii způsobenou zaokrouhlováním. Například na Ext2FS bloky velké 1KB jsou o 20% pomalejší, než bloky o velikosti 4KB, přesto se ale bežně používají právě kvůli úspoře místa, která je ale také sporná. Jedno z řešení přinesl Fast Filesystém z FreeBSD. Ten umí některé bloky rozdělit na menší fragmenty (0.5KB) kam ukládá konce souborů a umí tak uložit více souborů do jednoho bloku. Toto řešení přejímá hodně dalších filesystémů - například VivaFS a i Ext2FS má v superblocku vynechané místo pro fragmenty, jako možné rozšíření. Fragmenty ale přináší i své nevýhody - zvyšují fragmentaci, komplikují kód atd. VivaFS ještě rozšířil tento způsob a umí uložit konec souboru přímo do inody, pokud je tam na něj místo. Jiné řešení má například extend based filesystém, který alokační tabulky kompresuje a tak může používat malé bloky. ReiserFS používá cosi jako fragmenty ale nemají pevnou velikost a tak šetří ještě více místa. Navíc ukládá soubory přímo do adresářových položek. Dalším problémem Inodových filesystému je omezení celkového počtu souborů na disku. To samozřejmě v reiserFS také odpadá. Posledním velkým problémem je pomalé handlování adresářů. Pokud chcete otevřít soubor v adresáři obsahujícím 2000 souborů, musíte všechny adresářové položky načíst a prohledat. To chvíli potrvá. Jedno z řešení přinesla Amiga, která adresáře ukládá jako hashovací tabulky. To umožňuje velmi rychlé vyhledání souboru v adresáři ale zase přináší problémy s vypisováním adresářů, které je poměrně pomalé. Jiný přístup jsou B stromy. To je datová struktura, která umí velmi rychle vyhledávat. Klasické stromy fungují tak, že data jsou uspořádány podle jednoduchého pravidla - prvky menší, než aktuální jsou vlevo a větší jsou vpravo: Linux / \ FreeBSD XeniX / \ / DOS Hurd TOS Pokud například chcete najít Hurd, postupujete následujícím způsobem: - začnete v kořeni (tedy Linux). Hurd je v abecedě před Linuxem a je tedy menší - vydáte se doleva - Vlevo je FreeBSD. Hurd je v abecedě později, vydáte se doprava - A našli jste Hurd B stromy jsou stromy optimalizované pro uložení na disk - na každé úrovni není jenom jedna položka ale hned několik a vychází i několik potomků tak, aby se jedna položka vešla pěkně do jednoho bloku. Navíc se B stromy vyvažují, takže nedochází k degeneraci (nestane se, aby všichni potomci byli nalevo a strom se zdegeneroval na seznam). B stromy také zaručují, že všechny položky jsou z 1/2 plné. Adresáře z B stromy mají následující vlastnosti - Rychlé vyhledávání (v logaritmickém čase - pro 65536 souborů potřebujete 16 porovnání - Vytváření, mazání a přejmenovávání souboru také v logaritmickém čase - Alespoň 1/2 místa určená pro adresář bude použita B stromy mají tak velké výhody pro práci z velkými adresáři, že například MacOS používá filesystém, který má pouze jeden centrální adresář, který obsahuje soubory z celou cestou. To ušetří dost místa tím, že podadresáře nejsou krátké soubory a nezaokrouhlují se. Nepřináší to žádné výrazné zpomalení - díky vlastnostem B stromů jednotlivé podadresáře jsou uloženy pohromadě. Jde s nimi velmi rychle pracovat a navíc jsou velmi rychlé operace procující s celým adresářovým stromem, protože je celý uložen pohromadě. ReiserFS se tímto přístupem inspiruje. Ale rozvádí ho ještě dál. Do stromu neukládá pouze adresáře ale celé soubory. Jednotlivé položky ve stromu jsou soubory a vyhledávací klíče jsou cosi jako inody. To má opět zajímavé vlastnosti. Soubory se stejnými klíči mají tendenci býl uloženy blízko sebe. Navíc se více souborů může pospojovat do jednoho bloku v B stromu. Soubory delší než jeden blok se potom ukládají do speciálních listů B stromů, na kterých se už neprovádí vyvažování. Adresářové položky ale nejsou uloženy v souborech, jako tomu bývá pod Inodovými filesystémy, ale také do tohoto centrálního stromu. Jeho stromy mají zajímavé vlastnosti. Například optimalizují rozložení tak, aby udžovali lokalitu dat apod. Výsledkem je velmi rychlý filesystém. Při práci s dlouhými soubory jsou tu sice některé nedostatky (například uřezávání konce souboru zhoršuje fragmentaci, ale FFS má stejný problém), ale přesto ve smýšených testech většinou Ext2FS porazí. Pro smýšený bechmark autor použil následující soubory: +----------------+------------+------------------+ | počet souborů | velikost | celková velikost | +----------------+------------+------------------+ | 5 | 0-10M | 33,712,005 | | 21 | 0-1M | 9,335,273 | | 113 | 0-100K | 6,193,394 | | 615 | 0-10K | 3,055,154 | | 3002 | 0-1K | 1,479,559 | | 12244 | 0-100B | 610,149 | +----------------+------------+------------------+ Zaplnění 506MB disku bylo následující: ext2 reiserfs poměr 58% 43% 1.35 Náledující tabulka obsahuje vždy čase ve formátu: ReiserFS,poměr k ext2FS(kolikrát je ReiserFS rychlejší) 1 - všechny soubory v jednom adresáři 2 - soubory v deseti podadresářích 2 - soubory v 100 podadresářích 2 - soubory v 1000 pod-podadresářích +------------------------------+----------+----------+----------+----------+ | Akce | 1 | 2 | 3 | 4 | +------------------------------+----------+----------+----------+----------+ |Vytvoření testovacích souborů | 4:31,26 |42.35,3.16|25.95,1.68|54.84,1.34| |Vypsání všech souborů | 9:05,2.63| 5:11,1.44| 4:14,1.17| 5:05,1.27| |Vytvoření záložní kopie |30:30,7.7 | 5:39,1.3 | 5:39,1.3 | 7:06,1.5 | |Vypsání informací o souborech |15:23,26 | 2:37,4.2 | 1:29,2.08| 1:59,3.1 | |Smazání testovacách souborů | 3:32,10 |56.17,2.5 |53.52,2.08| 1:58,4.0 | +------------------------------+----------+----------+----------+----------+ Testy ukazují, že ReiserFS je často rychlejší, než Ext2FS. Zatím výsledky nejsou definitivní - ReiserFS zatím neumí použít directory cache a proto práce z adresáři je relativně pomalá, ale přesto o sobě dávají B stromy vědět. výheň