|
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.
|