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.2. A számítógép-architektúra

3.2. A számítógép-architektúra

Az operációs rendszer felépítésének és működésének részletes tárgyalásához szükségünk van számítógép-architektúrákra vonatkozó általános ismeretekre, illetve annak pontosítására, hogy milyen hardver modellt tételezünk fel az operációs rendszerek „alatt”. Mint az 1.3. fejezetben láttuk, a hardver­archi­tektúra igen széles teljesítményspektrumot foghat át, és igen sokféle lehet. A könyv írása során abból a feltételezésből indultunk ki, hogy az olvasónak megvannak a megfelelő előismeretei e tekintetben, így itt csak ismétlés jelleggel, nagyon nagy vonalakban utalunk azokra a legfontosabb hardversajátságokra, amelyek a multiprogramozott rendszerekben tipikusak, és amelyekre építve az operációs rendszerek megvalósítják feladataikat.

3.2.1. Az egyprocesszoros von Neumann struktúrájú számítógép-architektúra

A von Neumann struktúrájú, modern, általános célú számítógépek CPU-ból és különböző berendezésvezérlő egységekből állnak, amelyeket közös busz (sín) köt össze. Az egységek közötti információ (utasítás és adat) áramlás a buszon keresztül történik, és ez biztosítja a CPU- és készülékvezérlők memóriához való hozzáférését is. Minden egyes készülékvezérlő egység bizonyos típusú – hozzájuk kapcsolt – készülék(ek) működését és használatát kontrollálja (3.1. ábra). A CPU- és a készülékvezérlők egyidejűleg mű­köd­(het)­nek.

3.1. ábra. ábra - Von Neumann struktúrájú számítógép egyszerűsített tömbvázlata

Von Neumann struktúrájú számítógép egyszerűsített tömbvázlata


3.2.1.1. Bekapcsolási folyamat

A számítógép bekapcsolásakor vagy újraindításakor egy egyszerű indítóprogram (az ún. bootstrap program) kezd el futni, amely beállítja (inicializálja) a rendszer kezdeti állapotát, majd betölti az operációs rendszer magját. Ezután az operációs rendszer veszi át a vezérlést, feltérképezi és inicializálja a hardvert, felépíti a rendszertáblákat (például megszakítási vektortábla), elindítja a rendszerfolyamatokat (ha vannak), és elindul(nak) a felhasználói bejelentkezésre váró folyamat(ok). Ebben az állapotában a rendszer valamilyen eseményre – szoftver vagy hardver megszakításra (interrupt) – vár.

3.2.1.2. Megszakítási rendszer

A megszakítási rendszer az architektúra egyik legsajátosabb, leginkább processzorcsalád-függő eleme.

Külső hardver megszakítás bármikor érkezhet – általában a buszon keresztül – a CPU-hoz. A szoftver azáltal kezdeményez megszakítást, hogy egy speciális fajta utasítást, rendszerhívást (system call, monitor call) hajt végre. Külön osztályát képezik a megszakításoknak a hibamegszakítások, amelyek valamilyen működési rendellenesség esetén következnek be. Összességében tehát nagyon sokféle esemény, például perifériás művelet befejeződése, nullával való osztás, illegális memória hozzáférés stb. eredményezhet megszakítást.

Megszakítás esetén a CPU felfüggeszti az éppen futó tevékenységet, és adott helyre adja a vezérlést. A megszakításkezelés logikai lépései szerint az így elindított megszakításkezelő program szükség szerint elmenti a megszakított folyamat környezetét (regiszterek, verem tartalmát stb.), majd a megszakítás okának megfelelő kiszolgáló rutin fut. Befejeződése után visszaállítja a régi környezetet, és visszaadja a vezérlést a korábban futott folyamatnak. A különböző fajtájú megszakítások kezelésére külön rutinok szolgálnak.

A megszakítási rendszerek lehetnek egy- és többszintűek. Előbbi esetben egy megszakítás kiszolgálása alatt le vannak tiltva az újabb megszakítások. A kifinomultabb rendszerek többszintű megszakítást tesznek lehetővé. Ilyenkor lehetséges megszakítás fogadása megszakítás kezelés alatt is. A maszkregiszter segítségével állítható be, hogy adott interrupt idején melyek a fogadható magasabb prioritású megszakítások.

Az operációs rendszerek ún. esemény-vezérelt rendszerek, azaz, ha nem fut éppen valamilyen folyamat, nincs B/K-kiszolgálás, felhasználói kérés, akkor az operációs rendszer tétlenül vár valamilyen eseményre, interruptra.

Fentiek miatt a megszakításkezelés a számítógép-architektúrák kiemelt fontosságú részét alkotja. Gyors működést várunk tőle (hogy ne tartsa fel a folyamatokat), ezért általában úgy valósítják meg a megszakításkezelést, hogy egy rendszertáblában tárolják az ismert, véges számú lehetséges meg­sza­kításhoz tartozó kezelőrutin kezdőcímét. A rutinok futási időre optimalizáltak, még a felesleges adminisztrációt okozó eljáráshívásokat is kiküszöbölik, és egy eljárás keretében végzik el a megszakításkezelés összes szükséges lépését.

3.2.1.3. B/K-struktúra

A perifériás műveletek elindításakor a CPU feltölti a kívánt perifériavezérlő regisztereit, melyek tartalma alapján a vezérlő azonosítja a kívánt szolgáltatást és megkezdi az adatátvitelt egy lokális pufferen keresztül. Az adatátvitel befejeződésekor (vagy ha a puffer megtelik) a készülékvezérlő egy megszakításkéréssel értesíti erről a CPU-t.

A perifériás átvitelt a készülékvezérlő is kezdeményezheti – megszakításkéréssel –, amennyiben a pufferébe adat érkezik kívülről, valamilyen perifériás készülék felől.

A felhasználói folyamatok által kezdeményezett perifériás műveletek fenti folyamata kétféle ütemezéssel történhet. Szinkron B/K esetén a folyamat csak a perifériás művelet végrehajtása után kapja vissza a vezérlést. A másik lehetőség, az aszinkron B/K szerint a folyamat már a perifériás művelet megindítása után visszakaphatja azt. Ez utóbbi változat hatékonyabb rendszerműködést eredményez.

3.2.1.4. Közvetlen memória hozzáférés, DMA

Nagy sebességű készülékek nagyobb méretű adatblokkjainak a memória és a készülék között történő gyors átvitelére dolgozták ki a közvetlen memória hozzáférés (DMA: Direct Memory Access) technikáját. Ilyen – egyszerre elérhető – nagyobb méretű tömböknél a CPU-t erősen megterhelné, és a rendszer működését nagyon lelassítaná, ha az információt – a perifériás ké­szülék nagy sebessége miatt viszonylag kis időközökkel – kis egységekben, például karakterenként, megszakítással vinnénk a CPU-regiszterekbe, vagy rajtuk keresztül a memóriába, illetve innen a perifériavezérlő pufferébe.

Miután a CPU a készülékhez tartozó, megfelelő regisztereket – mutatók, számlálók – beállította a készülékvezérlőn, vagy a DMA-vezérlőn, a készülékvezérlő a pufferéből közvetlenül a memóriába, vagy egy memóriaterületről a saját pufferébe tölt egy (a puffer méretének megfelelően tipikusan 128 byte és 4 Kbyte közötti méretű) adatblokkot anélkül, hogy a CPU-t megzavarná a működésében. Legfeljebb buszciklust kell „lopjon(cycle stealing) a CPU elől az átvitelhez. A DMA-átvitel befejeződése után a perifériavezérlő, vagy a külön DMA-vezérlő blokkonként egyetlen megszakítással jelzi a művelet befejeződését.

3.2.1.5. Tárak

Az utasításoknak (és a hozzájuk tartozó operandusoknak) a központi tárban kell lenniük a végrehajtáskor. A regisztereken kívül ez az egyetlen olyan memória fajta, amelyhez a CPU közvetlenül hozzá tud férni. Az utasítás-végrehajtási ciklus során az utasítások először (a programszámláló értékének megfelelő címről) az utasításregiszterbe kerülnek, majd dekódolás és az esetleges operandusok beolvasása után végrehajtódnak. Az eredmények a legtöbb esetben a memóriába íródnak vissza.

A von Neumann struktúrájú számítógépeknél az adatok és utasítások nincsenek megkülönböztetve. Ugyanabban a memóriában, ugyanúgy vannak tárolva, csak a környezetük alapján lehet különbséget tenni közöttük.

A fentiekből következően az lenne az optimális, ha az összes programot és adatot a központi tárban tárolhatnánk. Sajnos ez nem lehetséges, mert egyrészt a központi tár túl kicsi az összes szükséges program és adat állandó tárolásához, másrészt pedig ez a memória nem képes megőrizni (elveszti) a tartalmát a tápfeszültség kikapcsolása vagy kimaradása esetén.

Mindezek miatt megfelelően nagyméretű másodlagos tárolási lehetőséget kell biztosítani az információ állandó tárolására. Ebben az értelemben a má­sodlagos vagy háttértárak a központi memória kiterjesztésének tekinthetők.

A számítógépek adattároló rendszereit sebességük, méretük és áruk alapján hierarchia szintekbe sorolhatjuk (3.2. ábra). A hierarchián lefelé haladva egyrészt csökken a bitenkénti költség (és így nő az elérhető méret), de az elérési idő növekszik. Az effektív elérési sebesség növelése céljából gyor­sí­tó­tá­rakat (cache) szokás alkalmazni a fő szintek – regiszterek és központi memória, illetve főmemória és háttértárak – között. A CPU és a memória közötti gyorsítótárat általában hardver kezeli. Ezek gyakran a processzorhoz integrált gyors és viszonylag kisméretű tárak. A memória és a háttértár közötti gyorsítótárakat pedig az operációs rendszer valósítja meg. A gyorsí­tó­tá­rakban a mögöttes memóriaszint leggyakrabban, vagy a közeljövőben várhatóan használt információi találhatók, amelyek a rájuk való hivatkozás százalékos arányának (találati arány) megfelelően javítják az átlagos hozzáférési időt.

A regiszterek, a központi memória és a gyorsítótárak a tápfeszültség kikapcsolásakor elveszítik a tartalmukat, míg a háttértárak megőrzik azt.

A leggyakrabban használt másodlagos tárak a lemezegységek (mágneses, illetve optikai) – ezek blokkonként címezhető véletlen hozzáférésű (random access) memóriák –, valamint a mágnesszalag, amely szekvenciális hozzáférésű. A mágneses diszkek még ma is igen elterjedten használtak, ezért az ezeket érintő adatforgalom hatékonysága (gyorsasága) fontos tényező lehet a rendszer optimalizálásban. Az optikai diszkek, bár lassabbak a mágneses diszkeknél, elérhető áruk és egyéb kiváló tulajdonságaik miatt egyre inkább terjedőben vannak. A mágnesszalagok sok szempontból elvesztették már a je­lentőségüket lassúságuk és hozzáférési módjuk merevsége miatt, azonban az adatsérülésekkel szembeni robusztusságuk, és nagy tárolási kapacitásuk okán ma is használják őket igen nagyméretű adathalmazok hosszú távú tárolására.

3.2. ábra. ábra - Tárhierarchia

Tárhierarchia


3.2.1.6. Védelem

Védelmi kérdésekkel később részletesen foglalkozunk, ezért itt éppen csak megemlítjük, hogy a mai számítógép rendszerek komoly hardver támogatást nyújtanak különböző védelmi mechanizmusok megvalósításához.

Védelemről alapvetően három szinten beszélhetünk. Ezek a CPU-védelem, az operációs rendszer védelme és a felhasználói programok, területek védelme. Az utóbbi kettő az, amely szorosan kötődik az operációs rendszerek témájához, így ezekről a későbbiekben részletesen fogunk beszélni. Az első, azaz a CPU-védelem kérdése túlmutat a könyv által tárgyalni kívánt témákon, ezért csak a teljesség kedvéért említjük, hogy ide tartozik például a hurokba került programoknak egy időzítő által okozott megszakítása (timer IT), watchdog processzorok működése stb.

Az operációs rendszer szintjén megvalósítandó védelmek alapfeltétele, hogy a CPU két működési módban tudjon dolgozni, amelyek közül az egyik, az utasításkészlet és az alapvető erőforrások teljes körű használatát biztosító ún. privilegizált (rendszer, kernel stb.) mód, csak az operációs rendszer számára legyen fenntartva.

Mind a védelmet, mind egyéb rendszerfunkciókat további hardver megoldások támogathatják (például memóriakezelő egységek, asszociatív tárak, speciális környezetváltó utasítások stb.), amelyeket az egyes funkciók tárgyalásakor részletezünk.

3.2.2. Többprocesszoros, szorosan csatolt számítógéprendszerek

Többprocesszoros, szorosan csatolt (ún. multiprocesszoros) rendszerekben a korábbiakkal ellentétben nem egy, hanem több CPU található, és az egyes processzorok között a kapcsolat közös erőforráso(ko)n keresztül valósul meg. A szorosan csatolt rendszerek közös memóriát és órát, és az esetek nagy részében közös operációs rendszert használnak. (Természetesen ezen felül mindegyik processzorhoz tartozhatnak saját erőforrások, például saját memória is, amelyeket közvetlenül csak az adott processzor ér el.)

A rendszer moduljait egy rendszersín köti össze, amelyen keresztül a közös információforgalom bonyolódik, illetve amelyen keresztül a közös memóriához hozzá lehet férni (3.3. ábra). Ha a CPU-modulok azonos felépítésűek és tulajdonságúak, akkor homogén rendszerről beszélünk, ha

3.3. ábra. ábra - Multiprocesszoros rendszerek logikai tömbvázlata

Multiprocesszoros rendszerek logikai tömbvázlata


eltérőek is lehetnek, akkor a rendszer inhomogén. A CPU-modulok rendelkezhetnek azonos jogokkal (szimmetrikus esetben), illetve lehetnek közöttük kiemelt jogosultságokkal bírók (aszimmetrikus vagy master-slave elrendezés esetén).

Az előző, egyprocesszoros esetet vizsgáló részben tárgyalt elvek és megoldások többprocesszoros esetben is alkalmazhatók, érvényesek. A több processzor miatt azonban koordinálni kell a közös rendszersínhez való hozzáférést. A rendszersín vezérlő a memória vagy perifériacím alapján dönti el, hogy saját (belső) erőforráshoz, vagy közös erőforráshoz kell fordulnia (ez utóbbi esetben a rendszersínen keresztül).

A rendszersínhez való hozzáférést egy sínvezérlő (arbiter) egység felügyeli. Több, egyidejű igény fellépése esetén a vezérlő többféle – egyszerű vagy kombinált – stratégia alapján választhat. Egyik legegyszerűbb módszer, ha egyik irányból indulva a másik felé, a „helyileg” előbbre levő buszt igénylő modul kapja meg a rendszersín használati jogát (daisy chain). Ez a megvalósítás igen egyszerű, azonban komoly hátránya a terjedési késleltetés, valamint az, hogy a rendszerbe kapcsolható modulok számát ez utóbbi sajátság korlátozza.

Több esetleges kérés között a vezérlő választhat prioritás alapján is, ilyenkor a sínhasználatot a legnagyobb prioritású modulnak kínálja fel, amennyiben a rendszerbusz szabad. Kritikus hibát okozhat a prioritáseldöntő meghibásodása.

Azonos CPU-n futó folyamatok a saját belső memóriájukon osztoznak (ha van ilyen), míg a különböző CPU-kon futó folyamatok a közös memórián keresztül kommunikálnak egymással. Emiatt a rendszersín mind teljesítőképessége, mind esetleges meghibásodása miatt erősen befolyásolja a rendszer működését.

A vázolt felépítési és működési struktúra lehetővé tesz további hierarchikus szerveződést is, amikor egy modul belső buszára is több processzort kapcsolunk.