Ugrás a tartalomhoz

Operációs rendszerek mérnöki megközelítésben

Benyó Balázs, Fék Márk, Kiss István, Kóczy Annamária, Kondorosi Károly, Mészáros Tamás, Román Gyula, Szeberényi Imre, Sziray József

Panem Kiadó

2.3. Tárak

2.3. Tárak

Annak a virtuális gépnek, amelyet az operációs rendszer nyújt az alkalmazások és a kezelők számára, eddig elsősorban a processzorával, illetve processzoraival ismerkedtünk. Egy valós, vagy virtuális gép hasonlóan fontos alkotórészei a tárak.

2.3.1. Tárhierarchia

Egy számítógépes rendszerben a tárak hierarchikus rendbe szervezettek. A hierarchia legalsó szintjén a fizikai processzor regiszterei helyezkednek el, fölötte sorrendben az operatív tár (memória), a háttértárak vagy másodlagos tárolók, valamint a külső tárak vagy harmadlagos tárolók találhatók. Minél magasabb hierarchiaszinten van egy tár, általában annál nagyobb mennyiségű adat befogadására alkalmas, viszont – gyakran a hosszabb keresési idő következtében – annál lassabb működésű, és annál nagyobb egységekben címezhető. Ugyancsak különböznek az egyes szintek a tárolt információ élettartama és tárolási biztonsága tekintetében is. A processzorregiszterekben tárolt adatok élettartama néhány utasítás, a memóriatartalomé jó esetben a program futási ideje. A programokat túlélő, maradandó adatokat fájlok tárolják, egy aktualitási időszakban a másodlagos tárakon, majd archiválva, harmadlagos tárolókon.

A több tárolási szint hatékony kezelése a rendszerek működtetésének egyik legfontosabb problémája. Azt az ellentmondást, hogy a műveletvégzésben résztvevő adatoknak a processzor regisztereiben kell elhelyezkedniük, míg a számítógépes rendszerben kezelt adat- és programmennyiség általában még a háttértárakra sem fér el egyidejűleg, csak az adatok tárolószintek közötti folyamatos mozgatásával lehet feloldani. A szintek közötti adatmozgatás hagyományos megoldása, hogy a processzor utasításonként esetleg többször is a memóriához fordul (egyrészt magáért az utasításért, másrészt adatokért), a programokat végrehajtás előtt a háttértárról a memóriába kell tölteni, a háttértáron tárolt adatokat csak fájlműveletekkel (a be-/kiviteli rendszeren keresztül) lehet elérni, a harmadlagos, külső tárakból pedig a személyzet közreműködésével kell kikeresni és a megfelelő perifériába helyezni a megfelelő adathordozókat.

Az egyes hierarchiaszintekhez más-más elérési, hivatkozási módok tartoznak. Az operatív tár címeire az utasítások meghatározott címzési módokkal és numerikus címértékekkel hivatkoznak. A háttértárakon tárolt fájlokra ezzel szemben nevekkel, amelyekhez csak futási időben – a fájlok megnyitásakor – kötődnek konkrét blokkcímek. A memória bájtonként, szavanként címezhetően érhető el, a fájlok ezzel szemben gyakran szekvenciális elérésűek. A tárolószintek közötti adatmozgatások történhetnek explicit módon, valamelyik alkalmazás megfelelő műveletének végrehajtásával. A rendszerekben azonban igen gyakran rejtett átjárások vannak a szintek között, amelyek célja a hatékonyság, vagy a kényelem fokozása.

A rejtett átjárások két módja fordul elő:

  • az alacsonyabb szint elérési módjait terjesztik ki a magasabb szintű tárra (virtualizálás),

  • a magasabb szintű tár elérési módját használva valójában egy alacsonyabb szintű tárat kezelnek (gyorsítótár, cache).

A két mód megvalósítása végül hasonló részproblémákra vezet, mindkettőre hasonló fogalmak (találat, betöltési, kiírási stratégiák stb.) alkalmazhatók.

A virtualizálás természetesen a magasabb szintű tár bevonása miatt lassabb működést eredményez, mint a valódi alacsonyabb szint elérése, ám igen kényelmes, hiszen az alacsony szint felhasználható címtartománya sokszorosára nőhet.

A gyorsítótár két szint közé épül be, vagy az alacsonyabb szintű tárolóban kerül kialakításra a magasabb szinten elhelyezkedő adatmennyiség egyes részeinek átmeneti tárolására. Az eredetileg magasabb szinten tárolt adatokra vonatkozó műveletek végrehajtásakor a művelet végrehajtója először megvizsgálja, hogy az adat nincs-e a gyorsítótárban. Ha ott van (találat), akkor a művelet gyorsan végrehajtható. Ha nincs ott, akkor adatcserét kell végrehajtani, a magasabb szintről be kell hozni az adatot a gyorsítótárba.

Jellegzetes gyorsítótárak:

  • a processzorokba épített hardver-gyorsítótárak (utasítás- és adatcache), amelyek a memóriában tárolt adatok egy munkában lévő részét teszik gyorsan elérhetővé a processzor számára,

  • a fájlok egy részének tárolására a memóriában kialakított átmeneti tárterületek (buffer-cache).

A felhasználó által manuálisan kezelt gyorsítótárak:

  • a memóriában kialakított, több fájl tárolására alkalmas virtuális diszkek (RAM-diszk, elektronikus diszk),

  • a harmadlagos tárak fájlrendszereit tároló mágneslemez területek.

A gyorsítótárak és a magasabb szintek közötti adatcsere általában a felhasználó elől rejtetten, egyidejűleg nagyobb adatmennyiségeket mozgatva történik. A hatékonyságnövekedés oka a feldolgozás lokalitási tulajdonsága, azaz ha egy adatra (beleértve a program utasításait is) a feldolgozás során szükség van, akkor nagy valószínűséggel a környezetében tárolt adatokra is szükség lesz. A gyorsítótár megfelelő méretezésével és hatékony adatcsere-algoritmusokkal 80–99%-os találati arány is elérhető.

Az operációs rendszerek hatáskörébe a tárhierarchia szintjei közül a memória, valamint a háttértárakon és harmadlagos tárolók aktuális adathordozóján kialakított fájlrendszerek tartoznak, a felsorolt gyorsítótárak közül pedig a virtuális memória és a fájlrendszerek gyorsítótárai (buffer-cache). Ezek közül a fájlrendszerek kezelése – tekintve, hogy perifériákon történő adattárolásról van szó – a be-/kiviteli rendszerre épül.

2.3.2. A logikai memória

Mint korábban bemutattuk, a folyamathoz tartozó virtuális gép a procesz-szoron kívül egy logikai memóriát tartalmaz. A logikai memóriát a folyamat egy RAM, illetve közösen használt memória esetén PRAM-modell szerint működő tárnak látja. Az egyetlen folytonos címtartomány helyett már a logikai szinten is érdemes három önálló címtartományt elkülöníteni, mivel ezek viselkedése és kezelése eltérő. A folyamathoz tartozó programkódot és esetleg konstansokat tároló kódterületet, az adatokat, változókat tároló adatterületet, valamint a verem (stack) területét. A kódterületet általában csak olvassák a folyamatok, ezért közös használata kevesebb problémát okoz. Mérete általában már végrehajtás előtt ismert. Az adatterület változókat tárol, a folyamatok írják is, de mérete ugyancsak ismert. A verem ezzel szemben amellett, hogy változókat tárol, dinamikusan növekedhet, és a mérete bizonyos esetekben – például iteráció adatfüggő mélységű rekurzív eljáráshívások esetén – nem határozható meg előzetesen. A folyamatoknak ezért általában fel kell készülniük a verem túlcsordulását jelző hibamegszakításra.

2.3.3. A háttértár-fájlok

A folyamatok a másodlagos tárolókon a futásukat túlélő adatok tárolására névvel azonosítható fájlokat hozhatnak létre. A fájl tartalmát a folyamatok állítják elő és használják fel, az operációs rendszer a tartalommal általában nem foglalkozik, a fájlt egyszerű bájtfolyamként kezeli.

A fájlok, mint tárolási egységek, egészükben is lehetnek műveletek tárgyai, illetve természetesen műveletek szükségesek a fájlban tárolt adatok kezelésére is. A másodlagos tárolókon elhelyezkedő igen nagyszámú fájl meg­­ta­lálása, egyértelmű azonosítása rendezett nyilvántartási rendszert igényel, ami leggyakrabban egy hierarchikus könyvtárszerkezettel valósul meg. A hierarchikus könyvtárszerkezet azt jelenti, hogy a könyvtárak tartalmazhatnak fájlokat, valamint további könyvtárakat (alkönyvtárak), és ez valamennyi szin­­ten lehetséges. A könyvtárhoz tartozó fájlokról egy katalógusfájl (di­rec­tory) tartalmazza a szükséges adatokat. A tárolási hierarchia a legtöbb esetben egyetlen közös gyökérből indul, más esetekben a legmagasabb szinten több kötet (volume) helyezkedhet el, ami gyakran egyben egy fizikai egységet is jelöl. A tárolási hierarchiában a fájlt elérési útvonala és neve együttesen azonosítja, így csak az adott könyvtáron belül szükséges egyedi neveket használni.

2.3.3.1. Fájlmodellek

A fájlban tárolt adatok elérésére háromféle fájlmodell (elérési módszer, access method) használatos:

Soros elérésű (sequential) fájl

A fájl fogalma az operációs rendszerekben a mágnesszalag analógiájára alakult ki. A szalagon tárolt információt csak a tárolt byte-ok sorrendjében lehetett olvasni vagy írni. Sok információfeldolgozási feladathoz a soros hoz­zá­férés elegendő. A soros elérés modelljéhez tartozik egy ún. fájlpointer, ami az aktuális elérési pozíciót tárolja.

Közvetlen elérésű (direct) fájl

A tárolt adatelemeket (például bájtokat) közvetlenül, sorszámuk alapján el lehet érni. Az átviteli eljárásoknak paraméterként meg kell adni az adatelem állományon belüli címét (sorszámát).

Indexelt, index-szekvenciális elérésű fájl (index sequential access method, ISAM)

Ez a modell a fájlban tárolt adatok szerkezetének ismeretét is feltételezi. Ha a fájl rekordokat tárol, akkor a rekordokat kijelölt mezőik (kulcs) tartalma alapján érhetjük el. A keresés megkönnyítésére egy segédfájl (indexfájl) szolgál, amelyik a fájlban előforduló kulcsértékek szerint rendezve tárol egy-egy mutatót a megfelelő rekordra. Ez a modell nem minden operációs rendszerben áll rendelkezésre.

2.3.3.2. Fájlműveletek

A műveletek egy része a fájl egészére vonatkozik, más része a fájl adatainak kezelését teszi lehetővé.

  • Adatelérés, írás vagy olvasás

    • közvetlen hozzáférésnél a művelethez meg kell adni az információ címét, pozícióját,

    • soros hozzáférésnél az átvitel során az aktuális pozíciót a rendszer növeli és tárolja, eldöntendő, hogy megengedjük‑e az átvitel során az állomány szimultán írását és olvasását is, és ha igen, akkor soros elérésnél közös vagy külön-külön fájlmutatót használunk-e.

  • Hozzáírás (append), bővítés. Az állomány végéhez új információt írunk. Az állomány mérete növekszik.

  • Pozicionálás. A soros hozzáférésnél használt pozíciót a soros átvitel mindig növeli, pozicionálásnál viszont azt az állomány tetszőleges pontjára állíthatjuk. Gyakori eset a pozició visszaállítása az állomány elejére, a mágnesszalag analógiát sugalló visszacsévélés (rewind). A pozicionálás műveletével lehet a közvetlen hozzáférést megvalósítani.

  • Megnyitás (open). Az átviteli műveletek hatékonyabbak, ha nem kell mindegyiknél az állo­mányt a neve alapján a nyilvántartásokból megkeresni. Ezért a modell szintjén is megjelenik a megnyitás művelete, hiszen a további műveletek már más (nem név szerinti) hivatkozási módot igényelnek. A megnyitás műveletének szerepe:

    • az állomány megkeresése, fizikai elhelyezkedésének meghatározása, a további elérést segítő adatszerkezetek felépítése,

– hozzáférési jogosultságok ellenőrzése,

– az állományon elvégezhető műveletek (írás, olvasás, hozzáírás) megadása,

– osztott állománykezelés szabályozása,

– fájlmutató kezdeti beállítása.

Az állomány sikeres megnyitása után az operációs rendszer visszaad egy olyan értéket (mutató vagy logikai perifériaszám), amely a további műveletekben a név helyett használható az állomány azonosítására.

  • Lezárás (close). Jelzi a folyamat részéről az adatelérési műveletsorozat befejezését. A megnyitáskor elhelyezett zárak feloldódnak, a fájl esetleg a másodlagos tárra még ki nem írt (pufferelt) adatai kiíródnak.

  • Végrehajtás (execution). Az operációs rendszer létrehoz egy új folyamatot, a programfájlt betölti a folyamat tárterületére és elindítja.

  • Létrehozás (create). Az állomány létrehozásakor egy új katalógusbejegyzés is létrejön, a rendszer szükség ese­tén az állományhoz szabad blokkokat foglal le.

  • Törlés (delete). A törlés megszünteti a katalógusbejegyzést, felszabadítja az állo­mányt tároló területet a másodlagos táron.

2.3.4. Tárak tulajdonságai

Az előzőekben a tárhierarchia egyes szintjein elhelyezkedő adatok címzése és elérése szerint tettünk különbséget a memória és a háttértár között. Emellett a táraknak más fontos tulajdonságai is lényegesek, és hozzátartoznak a virtuális gép jellemzéséhez.

2.3.4.1. Működési sebesség

A tárak működési sebessége az adatelérési idővel (access time) jellemezhető, ami egy olvasási, illetve írási művelet végrehajtási ideje. A fizikai memória esetén az elérési idő címfüggetlennek vehető. A modellben is ezzel a feltételezéssel élhetünk, bár a rejtett átjárások (virtuális tárkezelés) miatt egyes hivatkozások végrehajtási idői között jelentős különbségek lehetnek, és az átlagos érték kedvezőtlenebb a fizikai tárra jellemző időknél. A fájlok fizikai tárolói jelentős keresési idővel rendelkeznek (lemezek fejmozgása, elfordulása). A gyorsítótáras kezelés (buffer cache) miatt a modell kedvezőbb átlagos végrehajtási időket vehet figyelembe.

2.3.4.2. Címezhető adategység

A fizikai eszközök eltérő felépítése, működése ellenére a modell bájt felbontásban teszi elérhetővé mind a memóriában, mind a fájlokban tárolt adatokat. Fájlok esetén ez a bemutatott soros, illetve direkt elérés valamelyike lehet.

2.3.4.3. Tárolási biztonság

Az egyes tárak robusztussága, működésbiztonsága igen eltérő lehet. A ma általánosan használt memóriák (elektronikus tárak) legkellemetlenebb tulajdonsága, hogy tápellátás kimaradás esetén felejtenek. A mágneses elven működő háttértárak ilyen szempontból kedvezőbbek, „nem felejtők”, ugyanakkor előfordulnak lemezsérülések, vagy tranziens felírási, leolvasási hibák.

A rendszertervező, alkalmazásfejlesztő általában három tárkategóriában gondolkozik: felejtő, nemfelejtő és stabil tárakban. A felejtő tár kisebb rendszerzavarok esetén is elveszíti tartalmát. A nemfelejtő kisebb sokkokat túlél (például tápkimaradás), a stabil tár pedig elvileg mindent túlél, gyakorlatilag igen nagy valószínűséggel lehet számítani az adatok megőrzésére az újraindításig. A közelítőleg stabil tárak megfelelő redundanciával kezelt hát­tér­tárakon alakíthatók ki.