Gyorsítótár
A gyorsítótárazás a számítástechnikában használt kifejezés. A gyorsítótár (ejtsd: "cash" /ˈkæʃ/ KASH ) lényege nagyon egyszerű: Nagyon gyakran egy számítás eredményének kinyerése nagyon időigényes, ezért az eredmény tárolása általában jó ötlet. Kétféle adathordozót használnak: Az egyik általában elég nagy, de a hozzáférés "lassú"; a másikhoz sokkal gyorsabban lehet hozzáférni, de általában kicsi. A gyorsítótárazás nagyon alapvető gondolata az, hogy az adatok másolatainak tárolására azt az adathordozót használjuk, amelyikhez gyors a hozzáférés. A másolat és az eredeti között nincs különbség. Az eredeti adathoz való hozzáférés sokáig tarthat, vagy drága lehet (például: egy nehéz probléma eredményei, amelyek megoldása sokáig tart). Ezért sokkal "olcsóbb", ha egyszerűen a gyorsítótárból származó adatmásolatot használjuk. Másképp fogalmazva, a gyorsítótár egy olyan ideiglenes tárolóterület, amely a gyakran használt adatok másolatait tartalmazza. Ha az adatok másolata ebben a gyorsítótárban van, gyorsabb ezt a másolatot használni, mint az eredeti adat újbóli lekérése vagy újraszámítása. Így az adatok eléréséhez szükséges átlagos idő rövidebb lesz. Egy új érték gyorsítótárba helyezése gyakran azt jelenti, hogy egy régebbi értéket kell helyettesíteni. Különböző elképzelések (általában "stratégiáknak" nevezik őket) léteznek arra vonatkozóan, hogy hogyan válasszuk ki a helyettesítendő értéket.
A puffer nagyon hasonlít a gyorsítótárhoz. Abban különbözik, hogy a pufferben lévő adatokhoz hozzáférő ügyfél tudja, hogy van puffer; a puffert az alkalmazás kezeli. A gyorsítótár esetében az adatokhoz hozzáférő ügyfélnek nem kell tudnia a gyorsítótár létezéséről.
A tipikus számítógépes alkalmazások nagyon hasonló módon férnek hozzá az adatokhoz. Tegyük fel, hogy az adatok "blokkokba" vannak strukturálva, amelyekhez egyenként lehet hozzáférni. Amikor egy alkalmazás hozzáfér egy blokkhoz, nagy valószínűséggel egy olyan blokkhoz is hozzáfér (vagy hivatkozik rá), amely "közel áll" az eredeti blokkhoz. Ezt nevezzük a hivatkozás lokalitásának. Az ilyen "lokalitásnak" különböző fajtái vannak. A hivatkozás lokalitása az egyik oka annak, hogy a gyorsítótárak a számítástechnika számos területén jól működnek.
Ahhoz, hogy jól működjön, a gyorsítótárak a teljes adatmennyiséghez képest kicsik. Minél nagyobb a gyorsítótár, annál tovább tart egy bejegyzés keresése. A nagyobb gyorsítótárak létrehozása is drágább.
Hogyan működnek a gyorsítótárak
A gyorsítótár egy olyan memóriablokk, amely olyan adatok tárolására szolgál, amelyeket valószínűleg újra felhasználnak. A CPU és a merevlemez gyakran használ gyorsítótárat, akárcsak a webböngészők és a webszerverek.
A gyorsítótár sok bejegyzésből, úgynevezett poolból áll. Minden bejegyzés egy adatot (egy adatdarabot) tartalmaz, amely egy másik helyen lévő adat másolata. A gyorsítótárak általában úgynevezett háttértárolót használnak. A háttértárolók elérése a gyorsítótárhoz képest lassú vagy drága. A lemezes gyorsítótár például merevlemezt használ háttértárolóként. Minden bejegyzéshez egy kis információ is tartozik, amelyet címkének nevezünk. Ez a címke arra szolgál, hogy megtaláljuk az eredeti adat tárolási helyét.
Cache-ek olvasáshoz
Ha egy ügyfél (CPU, webböngésző, operációs rendszer) hozzá akar férni egy olyan adathoz, amelyről azt hiszi, hogy a háttértárban van, akkor először ellenőrzi, hogy az adat megtalálható-e a gyorsítótárban. Ha az adat megtalálható a gyorsítótárban, az ügyfél használhatja azt, és nem kell a főmemóriát használnia. Ezt nevezzük gyorsítótár-találatnak. Így például egy webböngésző program ellenőrizheti a lemezen lévő helyi gyorsítótárát, hogy van-e helyi másolata egy adott URL-cím alatt található weboldal tartalmának. Ebben a példában az URL a címke, a weboldal tartalma pedig az adat.
A másik lehetséges helyzet az, hogy a címkével ellátott adat nem található meg a gyorsítótárban. Ezt nevezzük cache miss-nek. Az adatot a háttértárolóból kell előhívni. Általában bemásoljuk a gyorsítótárba, így a következő alkalommal már nem kell a háttértárból előhívni.
A gyorsítótár csak korlátozott méretű. Ahhoz, hogy helyet csináljon a korábban nem gyorsítótárazott bejegyzésnek, előfordulhat, hogy egy másik gyorsítótárazott bejegyzést kell törölni a gyorsítótárból. Speciális szabályok segítségével meg lehet találni azt a bejegyzést, amelyet a legjobb törölni. Ezeket a szabályokat általában heurisztikáknak nevezik. A bejegyzés megtalálásához használt heurisztikákat nevezzük cserepolitikának. Egy nagyon egyszerű szabályt használnak, amelyet Least recently used (vagy LRU) névvel illetnek. Ez egyszerűen azt a bejegyzést veszi, amelyet a legrégebben használtak. Egyéb heurisztikák a cache algoritmusnál találhatók.
Cache-ek íráshoz
A gyorsítótárak adatok írására is használhatók; ennek előnye, hogy az ügyfél folytathatja a műveletet, miután a bejegyzés a gyorsítótárba íródott; nem kell megvárnia, amíg a bejegyzés a háttértárolóba kerül.
A bejegyzést azonban valamikor a háttértárolóba kell írni. Ennek időzítését az írási házirend szabályozza.
Az átírásos gyorsítótárban minden egyes bejegyzés azonnal a háttértárolóba íródik, és a gyorsítótárban is tárolódik.
A másik lehetőség, hogy csak a gyorsítótárba írunk, és később írunk a háttértárolóba. Ez az úgynevezett write-back (vagy write-behind) cache. A gyorsítótár megjelöli azokat a bejegyzéseket, amelyeket még nem írtak a háttértárolóba; a használt jelölést gyakran dirty flagnek nevezik. Mielőtt a bejegyzések törlődnének a gyorsítótárból, a bejegyzéseket a háttértárolóba írja. Ezt nevezzük lusta írásnak. Az író-visszaíró gyorsítótárban történő hiba (amelyhez egy blokkot egy másikkal kell helyettesíteni) gyakran két memória-hozzáférést igényel: egyet a szükséges adat megszerzéséhez, egy másikat pedig a helyettesített adatoknak a gyorsítótárból a háttértárba történő írásához.
A gyorsítótárazási szabályzat azt is megmondhatja, hogy egy bizonyos adatot a gyorsítótárba kell írni. Előfordulhat, hogy az ügyfél sok módosítást hajtott végre a gyorsítótárban lévő adaton. Miután végzett, kifejezetten megmondhatja a gyorsítótárnak, hogy írja vissza az adatot.
Az írás nélküli kiosztás egy olyan gyorsítótár-szabályzat, ahol csak az olvasások kerülnek gyorsítótárba. Ezzel elkerülhető a visszaírásos vagy átírásos gyorsítótárazási eljárás. Az írások mindig a háttértárolóba történnek.
Az ügyfél nem az az alkalmazás, amelyik módosítja az adatokat a háttértárolóban. Ha az adatok a háttértárolóban megváltoztak, akkor a gyorsítótárban lévő másolat elavult vagy elavult lesz. Vagy, ha az ügyfél frissíti a gyorsítótárban lévő adatokat, akkor az adatok más gyorsítótárakban lévő másolatai is elavulnak. Vannak speciális kommunikációs protokollok, amelyek lehetővé teszik a gyorsítótár-kezelők számára, hogy beszéljenek egymással az adatok értelmességének megőrzése érdekében. Ezek az úgynevezett koherencia protokollok.
A CPU memória gyorsítótárának diagramja
A helyettesítendő bejegyzés kiválasztása
A gyorsítótár kicsi, és a legtöbbször tele lesz, vagy majdnem tele lesz. Tehát amikor egy új értéket adunk hozzá, egy régit el kell távolítani. Ezt a kiválasztást különböző módon lehet elvégezni:
- Az első beérkezése az első kimenetele: Egyszerűen cserélje ki azt a bejegyzést, amelyik a legrégebben került a gyorsítótárba.
- Legutóbb használták: Ez az elképzelés hasonló a fenti FIFO-hoz, de amikor egy bejegyzést használnak, annak időbélyege/kora frissül.
- Legkevésbé gyakran használt: A FIFO esethez hasonlóan, az időbélyegző helyett használjon számlálót, amely minden egyes bejegyzés használatakor növekszik.
- Véletlenszerűen válasszon ki egy bejegyzést
Történelem
A gyorsítótár szót először 1967-ben használták a számítástechnikában, amikor egy tudományos cikket készítettek elő az IBM Systems Journal című folyóiratban való közzétételre. A cikk a 85-ös modell memóriájának új fejlesztéséről szólt. A 85-ös modell az IBM System/360 termékcsalád egyik számítógépe volt. A Journal szerkesztője egy jobb szót szeretett volna a cikkben használt nagysebességű pufferre. Nem kapott választ, és a francia cacher szóból származó, "elrejteni" jelentésű cache-t javasolta. A cikk 1968 elején jelent meg, és a szerzőket az IBM kitüntette. Munkájukat széles körben üdvözölték és továbbfejlesztették. A cache hamarosan a számítógépes szakirodalomban standard használatba került.
Ahol a gyorsítótárakat használják
CPU gyorsítótárak
A CPU-chipen vagy annak közelében lévő kis memóriák gyorsabbak lehetnek, mint a sokkal nagyobb főmemória. Az 1980-as évek óta a legtöbb CPU egy vagy több gyorsítótárat használ. A személyi számítógépekben lévő modern általános célú CPU-k akár fél tucatnyi is lehet. Mindegyik gyorsítótár a programvégrehajtási feladat más-más részére specializálódhat.
Lemez gyorsítótárak
A CPU gyorsítótárakat általában teljes egészében a hardver kezeli, más gyorsítótárakat különböző szoftverek kezelnek. Az operációs rendszer általában a főmemóriában lévő lap gyorsítótárat kezeli. Az informatikán kívüli felhasználók ezt a gyorsítótárat általában virtuális memóriának nevezik. Ezt az operációs rendszer rendszermagja kezeli.
A modern merevlemezek lemezpufferrel rendelkeznek. Ezeket néha "lemez gyorsítótárnak" nevezik, de ez téves. Ezeknek a puffereknek a fő funkciója a lemezes írások rendezése és az olvasások kezelése. A gyorsítótár ismételt elérése ritka, mivel a puffer nagyon kicsi a merevlemez méretéhez képest.
A helyi merevlemezek más tárolóeszközökhöz, például távoli kiszolgálókhoz, helyi szalagos meghajtókhoz vagy optikai zenegépekhez képest gyorsak. A helyi merevlemezek gyorsítótárként való használata a hierarchikus tároláskezelés fő koncepciója.
Webes gyorsítótárak
A webböngészők és a webes proxykiszolgálók gyorsítótárakat használnak a webkiszolgálók korábbi válaszainak, például weboldalaknak a tárolására. A webes gyorsítótárak csökkentik a hálózaton keresztül továbbítandó információk mennyiségét. A gyorsítótárban korábban tárolt információk gyakran újra felhasználhatók. Ez csökkenti a sávszélességet és a webkiszolgáló feldolgozási igényeit, és segít javítani a web felhasználóinak válaszkészségét.
A modern webböngészők beépített webes gyorsítótárat használnak, de egyes internetszolgáltatók vagy szervezetek gyorsítótárazó proxy-kiszolgálót is használnak. Ez egy olyan webes gyorsítótár, amelyet az adott hálózat összes felhasználója megoszt.
A keresőmotorok gyakran a gyorsítótárukból is elérhetővé teszik az általuk indexelt weboldalakat. A Google például minden keresési eredmény mellett egy "Cache" linket ad meg. Ez akkor hasznos, ha a weboldalak átmenetileg nem érhetők el egy webszerverről.
Tárolás megbízhatatlan hálózatokkal
Az átírási művelet nem megbízható hálózatokban (például Ethernet LAN) gyakori. Ilyen esetben nagyon összetett az a protokoll, amely biztosítja, hogy az írási gyorsítótárban lévő adatoknak értelme legyen, ha több írási gyorsítótárat használnak.
Például a weboldalak gyorsítótárai és az ügyféloldali hálózati fájlrendszerek gyorsítótárai (mint például az NFS vagy az SMB) általában csak olvashatóak vagy átírhatóak, hogy a hálózati protokoll egyszerű és megbízható maradjon.
A különbség a puffer és a gyorsítótár között
A puffer és a gyorsítótár nem zárják ki egymást; gyakran együtt is használják őket. A használatuk oka azonban eltérő. A puffer egy olyan memóriahely, amelyet hagyományosan azért használnak, mert a CPU-utasítások nem tudják közvetlenül megszólítani a perifériás eszközökön tárolt adatokat. A számítógépes memóriát köztes tárolóként használják.
Ezenkívül egy ilyen puffer akkor is megvalósítható, ha egy nagy adatblokkot összeszerelnek vagy szétszednek (ahogyan azt egy tárolóeszköz megköveteli), vagy ha az adatokat az előállítási sorrendtől eltérő sorrendben kell átadni. Emellett egy teljes adatpuffer általában szekvenciálisan kerül átvitelre (például merevlemezre), így maga a pufferelés néha növeli az átviteli teljesítményt. Ezek az előnyök akkor is fennállnak, ha a pufferelt adatokat egyszer írják a pufferbe, és egyszer olvassák a pufferből.
A gyorsítótár szintén növeli az átviteli teljesítményt. A növekedés egy része ugyancsak abból a lehetőségből ered, hogy több kis átvitel egyetlen nagy blokkban egyesül. A fő teljesítménynövekedés azonban azért következik be, mert jó esély van arra, hogy ugyanazt az adatot többször is kiolvassuk a gyorsítótárból, vagy hogy az írott adatokat hamarosan beolvassuk. A gyorsítótárak egyetlen célja, hogy csökkentsék a mögöttes lassabb tárolóhoz való hozzáféréseket. A gyorsítótár általában egy absztrakciós réteg is, amelyet úgy terveztek, hogy a szomszédos rétegek szempontjából láthatatlan legyen. Így az alkalmazások vagy az ügyfelek esetleg nem is tudnak a gyorsítótár létezéséről.
Kérdések és válaszok
K: Mi az a gyorsítótárazás?
V: A gyorsítótárazás az informatikában használt kifejezés, amely a gyakran használt adatok másolatainak tárolására utal annak érdekében, hogy azokhoz gyorsabban lehessen hozzáférni, mintha az eredeti adatokat újra le kellene hívni vagy újra ki kellene számítani.
K: Hogyan működik a gyorsítótárazás?
V: A gyorsítótárazás úgy működik, hogy kétféle adattárolót használ: az egyik általában elég nagy, de lassan hozzáférhető, a másik pedig sokkal gyorsabban hozzáférhető, de általában kisebb. A gyorsítótárazás lényege, hogy a gyors adathordozót az adatok másolatainak tárolására használjuk, így az eredeti adatok elérése kevesebb időt vesz igénybe vagy kevésbé költséges.
K: Mi az a puffer?
V: A puffer hasonló a gyorsítótárhoz, mivel az adatok másolatait tárolja a gyorsabb hozzáférés érdekében, azonban a puffer esetében az adatokhoz hozzáférő ügyfél tudja, hogy van egy puffer, és azt egy alkalmazás kezeli, míg a gyorsítótár esetében az ügyfeleknek nem kell tudniuk a gyorsítótár létezéséről.
K: Mit jelent a hivatkozás helyzete?
V: A hivatkozás lokalitása azt jelenti, hogy amikor egy alkalmazás hozzáfér a strukturált adatok bizonyos blokkjaihoz, akkor valószínűleg más, az eredetileg elért blokkokhoz közeli blokkokhoz is hozzáfér. Ez segíti a gyorsítótárak jó működését, mivel ezek jellemzően kicsik az összes rendelkezésre álló adathoz képest.
K: Miért tart tovább a nagyobb gyorsítótáraknak a bejegyzések keresése?
V: A nagyobb gyorsítótárak azért tartanak tovább, mert több tárolt információt tartalmaznak, és ezért több időre van szükségük a kereséshez. Emellett drágábbak is, mivel több erőforrást igényelnek a tároláshoz.
K: Hogyan segíthet a lokalitás abban, hogy a gyorsítótárak jobban működjenek?
V: A lokalitás segít a gyorsítótárak jobb működésében, mivel amikor az alkalmazások hozzáférnek bizonyos strukturált adatblokkokhoz, valószínűleg más, közeli blokkokra is szükségük lesz, amelyeket gyorsan le lehet hívni a gyorsítótárból, ahelyett, hogy máshonnan kellene azokat lekérni vagy újra kiszámítani.