CACHE -=-=-=- MSDOS didn't get as bad as it is overnight -- it took over ten years of careful development. Většina cache používá jednoduchý algoritmus: při čtení z disku se načte větší jednotka (jedna stopa), která se uloží do bufferu. Ten se přidá na začátek seznamu a zahashuje do tabulky. Pokud program chce číst data, která již jsou v bufferu, systém to přes hashovací tabulku najde a ušetří tak jeden přístup. Navíc nalezený buffer posune opět na začátek seznamu. Pokud je cache plná, uvolní se stránka z konce seznamu - tak se smaže blok, který nejdéle nikdo nepotřeboval. To se nazývá LRU cache (last recently used). Pro ukládání je algoritmus podobný. Ukládání ale není tak důležité - může probíhat asynchroně, zatímco čtení je většinou synchroní a tak musí být co nejrychlejší. Existuje mnoho vylepšení tohoto algoritmu, které se snaží číst větší bloky. Nejdůležitější je read-ahead. Ten čte bloky za posledním přistupovaným. To má tu výhodu, že v případě, že program bude chtít další data, nebude muset čekat na jejich načtení a tak i čtení potom funguje asynchroně. Stejně při ukládání se vyplatí napřed bloky sdužit do větších skupin. Jsou dva hlavní přístupy ke cachování. Master cache - ta přistupuje k disku jako k velkému souboru a cachuje ho před tím, než se dostane k ovladači filesystemu. Tento přístup je jednoduchý, ale má nevýhodu v tom, že někdy může načítat zbytečná data apod. Druhý přístup je slave (Inode) cache. Ta cachuje data v jednotlivých souborech. To ale zase má tu nevýhodu, že se nechachují filesystémové informace (Inode tabulky apod.). Na druhou stranu ale tohoto jde využít a napsat speciální cache pro jednotlivé části, což může přinést další zrychlení a zvýšení bezpečnosti. Protože každý z přístupů má své výhody, oba postupy se většinou kombinují. Linux například používá directory cache, která drží informace o soborech, dělá hashovací tabulky pro adresáře a tak pouhý výpis adresáře je téměř třikrát tychlejší. Buffer cache implementuje klasickou cache pro disky. Umí ale navíc s vyšší prioritou ukládat důležitá data. O read ahead se stará filesystém. A nakonec Linux implementuje page cache. Ta je propojená s mapováním paměti. Všechny namapované soubory handlovány přes tuto cache. Proto v případě, že někdo jiný čte, nebo mapuje ten samý soubor, použije se stených stránek. Navíc se tato cache stará o speciální readahead a algoritmus pro vyhledávání nepoužitých stránek (protože procesory většinou neumožňují implementovat LRU cache). Také to odstraňuje potíže se spožděnou aktualizací dat na disku. Další šikovné rozšíření je spojení s memorymanagementem. Nejjednodušší věc je, že cache bude moci růst přes veškerou volnou cache a do swapovací rutiny se přidá zmenšování cache. Není pak nutné předem nastavovat velikost cache. Poslední jednoduché rozšíření je bdflush daemon. Ten jednou za čas ukládá cache na disk. To má zase výhodu v tom, že ukládání probíhá asynchroně a ne až v situsci, kdy nějaký proces chce číst, nebo zapisovat. Navíc to zaručuje, že se data uloží v rozumném čase na disk. Cache je největším problémem mikrojádrových OS, protože tam nejde pořádně implementovat. výheň