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ó

3.5. Készülékkezelés

3.5. Készülékkezelés

A számítógépeken futó alkalmazások jelentős része B/K-intenzív, azaz a számítógép feldolgozó képességét elsősorban külső eszközökkel (perifériákkal) folytatott szervezett, rendezett adatcserére használja. A be-/kiviteli eszközök hatékony működtetése ezért az operációs rendszerek egyik legfontosabb feladata. A számítógépeket a legváltozatosabb készülékek veszik körül, amelyek mindegyike speciális kezelést igényel.

Az operációs rendszer feladatai a B/K-kezelésben:

  • Egységes alkalmazói felület kialakítása (application interface). Ennek keretében el kell takarni a részleteket, minél inkább egységesíteni a műveleteket, lehetővé tenni a logikai perifériakezelést, a műveletek átirányíthatóságát.

  • Egységes csatlakozó felület kialakítása a készülékek számára (device interface). A perifériák fizikai csatlakoztatása a hardverarchitektúra meghatározott helyein, egyszerűbb, vagy bonyolultabb vezérlők csatlakozási pontjaira történhet. Egyszerűbb eszközök és szabványos B/K-vezérlő esetén az operációs rendszer eleve tartalmazza a vezérlőegység kezelőprogramját, a működésbe helyezéshez csupán néhány paramétert kell megadni. Bonyolultabb, új eszközök esetén az operációs rendszerhez való illesztés egy speciális kezelőprogram (device driver) beillesztését igényli a rendszerbe, amelyik a periféria minden sajátosságát – beleértve a fizikai csatlakoztatás módját és adatait is – ismeri. A kezelőprogram és az operációs rendszer illesztési felületét ezért egységes, specifikált felületként kell kialakítani.

  • A készülékek hatékony működtetése. Ennek keretében meg kell oldani a perifériák ütemezését és az átvitelek szimultán lebonyolításában a programozottan végrehajtandó feladatokat (megszakítás-kezelések, vezérlőegységek felprogramozása, állapotellenőrzések, hibakezelések, pufferelések stb.).

Ezek a feladatok az operációs rendszer belső szerkezetét is meghatározzák, és jellegzetesen a 3.24. ábrán bemutatott rendszerstruktúrára vezetnek.

A rendkívül heterogén perifériakészlet részletkérdéseitől elvonatkoztatva az alkalmazói felület a be-/kivitelre egységes, néhány paraméterrel leírható műveleteket ad.

A kernel B/K-alrendszere már valamelyest megosztottabb, az ábrán nem jelölt alrétegekre és modulokra osztható, amelyek szükség szerint ütemezéseket, puffereléseket, blokkosításokat végeznek.

3.24. ábra. ábra - Rendszerstruktúra

Rendszerstruktúra


A rendszerben több azonos típusú eszköz működhet. Ezek illesztési módja, vezérlőegysége eltérő lehet. A legegyszerűbb esetben egy perifériához egy vezérlőegység és ahhoz egy kezelőprogram (device driver) tartozik. Egy kezelőprogrammal működtethetünk több vezérlőegységet, azon belül több perifériát. Ilyen esetekben is mindig vannak azonban a kezelőprogramnak legalább is olyan adatszerkezetei, amelyek a perifériákra nézve egyediek.

A perifériák működtetésének részleteit csak a kezelőprogramjuk ismeri. Ezért minden perifériatípushoz külön kezelőprogram tartozik. Egy rendszeren belül a kezelőprogramok és a kernel csatlakozási felülete szabványos, rendszerenként azonban jelentősen eltérő lehet. Ha egy új perifériát vásárolunk és csatlakoztatjuk a rendszerünkhöz, egy megfelelő kezelőprogramot is telepítenünk kell hozzá, amit vagy az operációs rendszer szállítója készített és a rendszerkönyvtárban megtalálható, vagy a periféria szállítója mellékelt a különböző operációs rendszereknek megfelelően több változatban.

Az egységes alkalmazói felületen a készülékekről a 2. fejezetben bemutatott kép rajzolódik ki. Hogyan valósítja meg ezt a modellt a kernel B/K-alrendszere? Ezt mutatjuk be a következőkben, majd a legbonyolultabb készülékek egyikének, a mágneslemeznek a kezelésével foglalkozunk, és megmutatjuk a hatékony kezelés érdekében kialakult megoldásokat.

3.5.1. A kernel B/K-alrendszere

A kernel B/K-alrendszerének jellegzetes feladatai:

  • perifériák ütemezése,

  • átmeneti és gyorsítótár működtetés,

  • perifériahasználat koordinálása,

  • hibakezelés.

A perifériák ütemezése annak a végrehajtási sorrendnek a meghatározását jelenti, amelyet a perifériára várakozó átviteli kérelmek végrehajtására alkalmaz a rendszer. Az érkezési sorrendtől való eltérés bizonyos esetekben jelentősen javíthatja a perifériahasználat hatékonyságát. Erre egy példát a következőkben a diszkműveletek ütemezésének bemutatásakor látunk.

Átmeneti tárolást (pufferelést) alkalmaz a kernel, ha

  • két eltérő sebességű adatfolyamot kell összekapcsolni (gyakran kettős puffert alkalmazva),

  • a periféria számára blokkosítás szükséges és az alkalmazás nem blokkokkal dolgozik, vagy más blokkméretet használ,

  • az adatküldő művelet szemantikája csak átmeneti tárolással biztosítható (a művelet visszatérése után az elküldött példány módosítható legyen).

Háttértárak esetén gyorsító tár alkalmazása is jelentősen növelheti a hatékonyságot, ha ismétlődő írások/olvasások jellemzik a perifériahasználatot. (Az átmeneti tároló és a gyorsítótár közötti lényeges különbség, hogy a puffer az egyetlen létező kópiát tárolja az adatról, a gyorsítótár pedig a háttértáron lévő adat egy másolatát.)

A perifériahasználat koordinálása tekintetében az egyszerű B/K-műveletek sorbaállítása csupán ezeknek a műveleteknek az oszthatatlanságát garantálja. Külön megoldást kell találni azoknak a perifériáknak a kezelésére, amelyek hosszabb távú oszthatatlan műveletekkel kezelhetők hatékonyan. Ilyen például a nyomtató vagy a mágnesszalag, amelyekre az alkalmazások az összetartozó adatokat általában nem tudják egyetlen B/K-művelettel elküldeni.

A probléma egyik megoldása, hogy ezekhez a perifériákhoz egy speciális puffert (spoolt) rendelnek. Egy folyamat által a perifériára küldött adatokat először egy spoolfájlban gyűjtik össze. A kész fájlokat aztán egyenként másolják ki a perifériára. Így a fájlon belüli sorrendek megőrződnek.

Más rendszerek a kizárólagos perifériahasználat kérésére biztosítanak eszközöket (lefoglalás, felszabadítás).

A B/K-műveletek közben előforduló hibákat a kezelőprogramok, vagy az operációs rendszer észleli. Mindkét észlelési szinten megkísérelhető a tranziensnek vélt hibák kiküszöbölése a művelet, vagy részművelet ismétlésével. Más hibatípusok esetén az operációs rendszernek nincs javítási lehetősége. A hibát ilyenkor jelezni kell a magasabb szintek (a hívó) felé. A hibajelzés, azaz a művelet sikertelenségének vagy sikerének visszajelzésére a könnyű kiértékelhetőség érdekében általában 1 bit szolgál. Hibajelzés esetén ezen kívül további kísérő információk segítik a hiba okának behatárolását. A hibakezelés beépített folyamatában gyakran szerepel a kezelő értesítése is. Az operációs rendszer ezt csak alkalmazás-független, általános kijelzésekkel tudja megtenni, ilyen információ megjelenése egy alkalmazás kezelőábráján rendkívül zavaró lehet. A beépített hibajelzéseket ezért a rendszer saját kezelőszervére célszerű irányítani, a hibát pedig jelezni kell az alkalmazás felé is, hogy az alkalmazáshoz illő reakciót tudja lejátszani.

3.5.2. Háttértárak kezelése

A számítógéprendszerekben azért alkalmaznak háttértárat, mert:

  • a központi tár fajlagos, egy bitre jutó ára magas, ezért kapacitása viszonylag kicsi,

  • a központi tárban az információk a tápfeszültség kikapcsolásával elvesznek,

  • minél nagyobb a tárolási kapacitás, gyakorlati okokból annál nagyobb kell legyen az egyedileg megcímezhető információegység mérete.

A hardver fejlődésével a következő típusú háttértárak jelentek meg:

  • mágnesszalag,

  • mágnesdob,

  • mágneslemez,

  • optikai adatrögzítés (lemez szervezésű; csak olvasható (például CD-ROM), egyszer írható (WORM), illetve írható-olvasható lemezek),

  • egyéb (kísérleti jellegű) megoldások:

    • mágnesbuborék tár,

    • félvezető tárak, (EEPROM, memóriakártya),

    • holografikus tárolás.

A háttértárak fizikai kezelése adott esetben igen bonyolult feladat. Az operációs rendszerek törekszenek a különböző típusú tárolóeszközök egységes kezelésére. Az operációs rendszer háttértár-kezelő egysége az operációs rendszer többi komponense felé a háttértárakat függetlenül elérhető adattároló blokkok sorozataként mutatja. A háttértár-kezelők működését a jelenlegi rendszerek legelterjedtebb háttértára esetén, a mágneslemezes tár (magnetic disc) kezelésén keresztül mutatjuk be.

3.5.2.1. A lemezegység fizikai szervezése

A mágneslemezes egység működésének lényege, hogy a tárcsaszerű, forgó mágneses hordozó felett – oldalanként egy – író‑olvasó fej mozog, a fejek mozgatását közös mechanika végzi. Általában a lemezek mindkét oldalát használják, a lemez felett és alatt is található fej. A mágneslemez sematikus felépítését a 3.25. ábra mutatja.

A 3.25. ábrán látható elnevezések magyarázata:

  • Sáv (track) egy-egy lemezfelület azon területe, amelyet a fej elmozdulás nélkül, a lemez egyetlen körülfordulása alatt elér.

  • Cilindernek (cylinder) nevezik a fejtartó szerkezet egy adott pozíciójában leolvasható sávok összességét.

  • Egy-egy sávot – általában sávonként azonos méretű, gyakorta az összes sávon azonos számú, azonos szögtartományt elfoglaló – szektorra (sector) osztják. Az információtárolás a szektoron belül bitsoros. A szektor az információátvitel legkisebb egysége, a lemezvezérlő egyszerre egy teljes szektort olvas vagy ír. A modern lemezeken a szektorok elhelyezkedését a vezérlő a sávra felírt speciális mágneses jelekből ismeri fel.

A mágneslemez-egységek lemezei lehetnek fixek, de cserélhető lemezek (például haj­lékonylemez, floppy disc) is használatosak.

3.25. ábra. ábra - Mágneslemez-egység felépítése

Mágneslemez-egység felépítése


  • Az átvitel kiszolgálásának ideje a következő összetevőkre osztható:

    • a fejmozgási idő (seek time) az az idő, amíg a fej a kívánt sávra áll,

    • az elfordulási idő (latency time) az az idő, amíg a kívánt szektor a fej alá fordul,

    • az információ átvitelének ideje (transfer time).

A felsorolt idők között nagyságrendi különbségek vannak, a fejmozgási idő a leghosszabb.

  • Szektorok címzése. A lemez szektorait az operációs rendszer lineárisan címzi, a lemezillesztő viszont több kom­ponensű – több dimenziós – címet igényel. A kettő között az összefüg­gés:

b = s * (i * t + j) + k,

ahol s a sávon lévő szektorok száma, t a cilindereken lévő sávok száma, i a ki­jelölt cilinder, j a fej (lemez felület) száma, k pedig a sávon belüli szektorok száma (i, j, és k értékei 0‑tól in­dulnak). A b eredmény a szektor lineáris, 0‑tól induló sorszáma.

3.5.2.2. A lemezműveletek ütemezése

A multiprogramozott rendszerekben egyszerre több folyamat verseng a mág­neslemezes peri­fériákért, egy átvitel lezajlása után több újabb kérés várakozhat kiszolgálásra. Az ütemezési algo­ritmusok a kérések megfelelő sorrendbe állításával az egyes folyamatok rovására próbálják a várakozási idők csökkentésével a rendszer tel­jesítményét növelni. Az algoritmusok célja a fejmozgás optimalizálása, vagy az elfordulási várakozás csökkentése.

Az algoritmusok értékelésének szempontjai:

  • átbocsátó képesség, időegység alatt lebonyolított átvitelek száma,

  • átlagos válaszidő, egy átvitel kérésétől a végrehajtásáig eltelt át­lagidő,

  • válaszidő szórása.

Elsősorban interaktív rendszerekben fontos szempont, hogy a folya­matok előre látható sebességgel fussanak, a futásuk ne ingadozzon nagyon rajtuk kívül álló okok miatt.

Az algoritmusok értékelésénél az átviteli kérések címének egyenletes eloszlását tételezzük fel.

A fejmozgás optimalizálása

Sokféle algoritmus képzelhető el, az itt következő felsorolás csak néhány is­mertebb alap­típust vizsgál.

  • Sorrendi kiszolgálás (FCFS: First Come First Served). Az átviteli ké­réseket érkezésük sorrendjében szolgáljuk ki. Az algorit­mus nem törődik a fej mozgásával, kicsi az átbocsátó képessége, nagy az átlagos vá­lasz­ideje, de ennek szórása viszony­lag kicsi.

  • Legrövidebb fejmozgási idő (SSTF: Shortest Seek Time First). Az al­goritmus következőnek azt a kérést szolgálja ki, amelyik az ak­tu­á­lis­hoz legközelebb lévő cilinderre hivatkozik – ennek az eléréséhez szükséges a legkisebb fejmozgási idő. Bár teljesít­ménye az FCFS-nél jobb, de a válaszidők szórása nagy, sőt fennáll a kiéheztetés veszélye: egy távoli cilinderre vonatkozó kérést az újra és újra érkező közeli kérések nem meghatározható ideig késleltethetik.

  • Pásztázó (SCAN). Az algoritmus a következő kérés kiválasztásánál csak azokat a kéréseket veszi fi­gyelembe, amelyekhez szükséges fejmozgás az aktuális mozgási iránynak megfelelő. A mozgási irány akkor fordul meg, ha az aktuális irányban már nincs több kiszolgálatlan kérés. Az algoritmus teljesít­ménye jobb, mint az SSTF, a válaszidő szórása is kisebb. A pásztázásból következő sajátossága, hogy a középső cilindereket gyakrabban láto­gatja, mint a szélsőket.

  • N lépéses pásztázó (N-SCAN). Egy irányba mozogva csak azokat a kéréseket – közülük is csak N-et – szolgálunk ki, amelyek a pásztázás elején már megvoltak. A pásztázás közben érkező kérésekre csak a következő irányváltás után kerül sor. Az algoritmus válaszide­jének szórása kisebb a SCAN-nél is, a válaszidő akkor sem nő meg, ha az ak­tuális cilinderre sok kérés érkezik.

  • Egyirányú (körforgó) pásztázó (C-SCAN: Circular SCAN). A kérések kiszolgálása mindig csak az egyik irányú fejmozgásnál történik, a másik irányban a fej közvetlenül a legtávolabbi kérés cilin­derére ugrik. Imple­mentálható a pásztázás közben beérkezett kérések mind menet közbeni, mind a következő pásztázásra halasztott kiszol­gá­lá­sá­val. Az algoritmus elkerüli a külső sávoknak a belsőkhöz vi­szonyított alacsonyabb fokú kiszolgálását.

Egyes rendszerekben a lemez terhelésének függvényében különböző mód­szereket al­kalmaznak, például

  • alacsony terhelésnél SCAN,

  • közepes terhelésnél C-SCAN,

  • nagy terhelésnél az elfordulási idő optimalizálásával bővített C-SCAN.

Az elfordulási idő optimalizálása

Az egy cilinderen belüli kérések a lemezek aktuális pozíciójának, valamint a szek­torok sorrend­jének – ami nem mindig monoton növekvő (szektor közbeékelődés, sector interleave) – is­meretében kiszolgálás előtt sorbaál­líthatók.

3.5.2.3. Egyéb szervezési elvek a teljesítmény növelésére

  • Lemezterület tömörítése (disk compaction). Az egymáshoz tartozó blokkokat lefoglaláskor a lemezen fizikailag is egymás mellé igyek­szünk elhelyezni, illetve ezt az állapotot egy időnként futtatott ren­dező­prog­rammal elérni. A lemezműveleteknél is megfigyelhető lokalitás következményeként egy folyamat várhatóan az egymáshoz közeli – egymást követő – blokkokat fogja olvasni, így a fejmozgás minimális lesz. A tömörítés nem mindig vezet teljesítményjavuláshoz, hiszen egy multi­prog­ramozott rendszer­ben egy időben sok folyamat használja a lemezt.

  • A gyakran szükséges adatokat SCAN típusú ütemezésnél érdemes a lemez középső sávjain el­helyezni.

  • A gyakran szükséges adatokat a lemezen több példányban, különböző sávokon helyezzük el, így minden fejállásnál kiválaszthatunk egy vi­szonylag közel lévő cilindert, ahol a kívánt adat megtalálható. A módszer elsősorban nem – vagy csak nagyon ritkán – változó adatoknál használ­ható, hiszen valamennyi példány módosítása hosszú időt je­lentene, és mó­dosítás közben az adatok konzisz­tenciájának biztosítása is megoldandó.

  • Több blokk egyidejű átvitele. Mivel a kérések kiszolgálásának jelentős része a fejmozgásból eredő várakozással telik, ha már a megfelelő pozíción vagyunk, igyekezzünk minél több blokkot egyszerre átvinni és azokat a memóriában tárolni.

  • Blokkok átmeneti tárolása. A gyakran vagy a közeljövőben várhatóan szükséges blokkokat igyekez­zünk a központi-, eset­leg a perifériaillesztőben lévő tárban tartani (disk cache).

  • Az átmeneti tárolás közben foglalkozni kell a megváltozott tartalmú szektorokkal:

    • a tárban változással egyidejűleg a lemezre is felírjuk (write through cache) vagy

    • csak akkor írjuk ki, ha a tárra szükség lesz.

  • Ez utóbbi a nagyobb teljesítményű módszer, hiszen egy gyakran változó szektor kiírás előtt újra megváltozhat, viszont kevésbé biztonságos, hiszen a rendszer meghibásodása esetén a szükséges módosítások nem kerültek a lemezre.

  • Adattömörítési (data compression) eljárások használata. A lemezen az információt tömörített (compressed) formában tároljuk, vissza­állítása – a prog­ramozó számára láthatatlanul – csak a be­olvasásakor történik meg. Ily módon csökkenthető a szükséges perifériás átvitelek száma. A tömörítést és visszaállítást a perifériakezelő prog­ram vagy célhardver végezheti.

3.5.2.4. Az adattárolás megbízhatósága

  • Adatok mentése (backup). A lemez teljes vagy az előző mentés óta megváltozott tartalmát (incremental backup) időnként más – általában mágnesszalagos, újabban optikai lemezes – hát­tértárra kell kimásolni, ahonnan a lemez sérülése, a tárolt adatok véletlen törlése esetén az egész, illetve a szükséges részek visszaállíthatók.

  • Átmeneti tár és a háttértár tartalmának szinkronizálása. Az átmeneti tárban lévő „fontosabb” változásokat, esetleg időnként az összes változást a lemezre kell írni (sync a UNIX-ban).

  • Lemezegységek többszörözése:

kétszerezés (disk shadowing, mirroring): az írásokat egyszerre mindkét lemezen elvégezzük, így a két lemez pontosan azonos in­formációt tárol, az egyik kiesése esetén a másik még használható.

többszörözés: egy nagy kapacitású lemezegység helyett több kicsit használnak, amelyekre az informá­ciót hibajavító kódolással – legegyszerűbb eset­ben paritásbittel – megtoldva szétterítik. Így egység(ek) kiesése ese­tén a tárolt információ még visszaállítható. (RAID: Re­dun­dant Array of In­expensive Disks).