.


[*]
[*]
[*]

[*]
index


   
A cache puffer

A lemezről való olvasás sokkal lassabb a fizikai memóriából való olvasásnál. (Kivéve persze a RAM diszkek esetét.) Továbbá gyakran előfordul, hogy a lemez azonos részét egy rövid időn belül többször kell olvasni. Például először elolvasunk egy e-mail üzenetet, utána ezt beolvassuk egy szövegszerkesztőbe, hogy válaszoljunk rá, majd megmondjuk a levelezőprogramnak, hogy tegye be egy mappába. Vagy gondoljunk arra, milyen gyakran adják ki az ls  parancsot a felhasználók egy rendszeren.

Célszerű tehát az ismétlődő olvasások esetében az első olvasást a lemezről a memóriába végezni, a többit pedig csak a memóriából olvasni újra, és ott tartani, amíg szükséges. Ez az elsőn kívül nagyon felgyorsítja az olvasást. Ezt az eljárást lemezpufferelésnek (disk buffering), az e célra használt memóriaterületet cache puffernek (buffer cache) neevzzük.

Mivel a memória sajnálatos módon véges, sőt, egy olyan erőforrás, amiből mindig kevés van, a cache puffer általában nem tud elég nagy lenni ahhoz, hogy minden adatot elbírjon, amire valaha szükség lehet. Amikor a cache megtelik, a legrégebben nem használt adat kikerül innét, így a helye felszabadul az új adatok számára.

A lemezpufferelés az írásra is vonatkozik. Másrészről ugyanis, a kiírt adatokra gyakran hamar szükség van újra (pl. egy kiírt forráskódot gyorsan újraolvas a fordítóprogram), így a kiírt adatok cache-be tevése jó ötlet. További gyorsítást jelenthet, ha a kiírt adat csak a pufferbe kerül, és nem íródik egyből a lemezre, hanem csak kicsit később, a háttérből, a lemez számára optimális módon.

A legtöbb operációs rendszernek van cache puffere (esetleg más néven), de nem mindegyik a fenti elevek alapján működik. Vannak ún. write-through típusúak: az adataok ekkor egyből kiíródnak a lemezre (és persze a cache-ben is megmaradnak). A cache típusát write-back-nek mondjuk, ha a lemezre írások késleltetve történnek meg. A write-back hatékonyabb, mint a write-through, de kicsit érzékenyebb a hibákra: ha a gép elromlik, ha rosszkor kapcsoljuk ki, vagy ha a floppit kivesszük, még mielőtt az adatok a cache-ből kiíródtak volna rá, akkor a csak a cache-be írt lemeztartalom-változások elvesznek. Ez akár azt is jelentheti, hogy a lemezen levő fájlrendszer nem teljesen rendezett, mert pl. a kiíratlan adatok közt adminisztratív információk is voltak.

Ezek miatt sosem szabad kikapcsolni az áramot a megfelelő rendszerlezárási (shutdown) eljárás nélkül (lásd a 6. fejezetet), vagy umount  nélkül kivenni a csatlakoztatott floppit.

A sync  parancs kiöblíti (flush) a puffert, azaz minden kiíratlan adatra kikényszeríti a tényleges írást, így használható arra, hogy megbizonyosadjunk minden adat biztonságos kiírásáról. A hagyományos UNIX rendszereken létezik egy update  program, ami a háttérben fut, és 30 másodpercenként elindít egy sync  parancsot, ezért általában nem kell kézzel indítani a sync -et. A Linuxnak van még egy bdflush  nevű démona is, mely egy tökéletlen szinkronizálást indít, de gyakrabban, hogy a váratlanul fellépő fagyás ellen védezezzen, mely a sync  által néha okozott erős lemezhasználat miatt lép fel.

A Linux alatt a bdflush -t az update  indítja. Általában nem is kell vele törődni, de ha a bdflush  mégis meghalna valamiért, a kernel figyelmezteni fog, és ekkor kézzel is elindíthatjuk a /sbin/update  paranccsal.

A cache nem fájlokat, hanem blokkokat pufferel, melyek a lemezműveletek legkisebb egységei (a Linux alatt általában 1 kB-osak). Íly módon a könyvtárak, a szuperblokkok, a fájlrendszer nyilvántartási adatok és a fájlrendszert nem tartalmazó lemezek is pufferelve vannak.

A cache pufferelés hatékonyságát elsősorban a cache mérete határotta meg. A kicsi cache gyakorlatilag használhatatlan: oly kevés adatot tárolhat, hogy minden adatot ki kell öblíteni mielőtt újra fel lehetne használni. A kritikus méret függ az adatforgalom nagyságától és az újra felhasználás gyakoriságától. Az egyetlen mód a jó méret meghatározására a kísérletezés.

Ha a cache rögzített méretű, nem túl jó, ha nagyon nagy, mert sok memóriát foglalhat le, és ez swap-pelést eredményezhet, ami lassít. A valódi memória legjobb kihasználása érdekében a Linux automatikusan minden szabad RAM-ot cache puffernek használ, illetve csökkenti ennek méretét, ha a futó programok memóriaigénye nő.

A Linux alatt nem kell semmit sem tenni a cache pufferrel kapcsolatban, mert minden teljesen automatikus. Csak arra kell figyelni, hogy a megfelelő rendszerleállási eljárások lefussanak, illetve lecsatoljuk a csatlakoztatott floppikat, mielőtt kivennénk őket.

[*]
Linux rendszeradminisztrátorok kézikönyve (első javított változat; SAG-HU 0.6b1)