5. A megszakítási rendszer

 

5.1. Bevezetés

 

A megszakítás fogalma

 

A számítógépnek rugalmasan reagálnia kell a külvilág eseményeire. Erre a célra szolgál a számítógép megszakítási rendszere. A megszakítás bekövetkezésekor az éppen futó programról vezérlés ideiglenesen átadódik egy másik program számára, amely kiszolgálja a bekövetkezett eseményt. A megszakítást kiszolgáló program lefutása után pedig a megszakított program végrehajtása a következő utasításától kezdve folytatódik.

 

Egy korszerű nagyteljesítményű számítógép-rendszerektől pedig már nem csupán egy egyszerű reagálást kívánunk meg, hanem ezen túlmenően: hogy folyamatosan változó körülmények között is optimálisan dolgozzanak. Az optimális működés jellegét a rendszer sajátosságai döntik el.

 

-           egy személyi számítógép esetén például érzékelnie kell, ha valamit a billentyűzetén begépelünk;

-           az azonos idejű (real-time) és folyamatirányítási (process control) rendszerek esetén a gyors válaszadási idő az elsőrendű feladat esetleg az eredő hatásfok rovására is. Például határérték-túllépés esetén mindennél fontosabb a vészjelzés adása illetve az automatikus, azonnali beavatkozás.

 

5.2. A megszakítások okai vagy forrásai

 

A megszakítási rendszert az eredeti célon, az I/O tevékenységek és feldolgozási tevékenységek szinkronizálásán kívül ma már egyéb célokra is felhasználják. A megszakítási okok vagy megszakítási források a következőképpen osztályozhatók:

 

5.2.1. Géphibák

 

Ebbe az osztályba az automatikus hibafigyelő áramkörök jelzései tartoznak:

-           A hibafigyelő áramkörök egy része általában hibajelző kódok alkalmazásával (pl. paritás-kontrollal) tárja fel az adatátviteli vonalak, CPU-regiszterek vagy az operatív memória hibáit.

-           A hibafigyelő áramkörök másik része az energia-ellátás és a klimatizáció-hűtés zavarai esetén jelez.

 

5.2.2. I/O források

 

Ide tartoznak a perifériák megszakítás-kérő jelzései, amelyek általában az I/O tevékenységek befejeződésekor vagy üzenetközlést kezdeményező perifériák bevezető állapotjelzései hatására alakulnak ki.

 

5.2.3. Külső források

 

Ebbe az osztályba tartoznak a külső eszközök által generált megszakító jelek (pl. a régi gépeknél a kezelőpult megszakító-kulcsának lenyomása vagy a mikrogépeknél a reset-gomb benyomása, összekapcsolt gépek esetén a másik gép jelzése).

 

5.2.4. Programozási források

 

Azok a megszakítás-kérések, amelyek ebbe az osztályba tartoznak, mindig valamilyen utasítás végrehajtása vagy végrehajtásának megkísérlése következményeként alakulnak ki. E megszakítások célja általában a programozási hibák jelzése vagy kiküszöbölése, de a programozó bizonyos célokból szándékosan is előidézhet ilyen típusú megszakításokat. A programozási okok részletesebb felbontása a következő:

 

A felhasználó által explicit kért megszakítás

 

 

A felhasználó által nem kért, váratlan megszakítások

 

A memóriavédelem megsértése

 

            Ha az operatív memóriában egy időben több, egymástól független feladat programja tárolódik, szükség van azok védelmének megszervezésére, elsősorban véletlen felülírás ellen. Különféle védelmi eljárások alakultak ki, amelyek a memóriák tárgyalásánál kerülnek ismertetésre. Ha egy program futása során "idegen" címre hivatkozik, az alkalmazott hardver memória-védelem működésbe lép

 

A tényleges tárkapacitás túlcímzése

 

            Ha a tényleges, fizikailag meglévő tárkapacitás kisebb, mint az utasítás végrehajtása során elméletileg kiadható legnagyobb cím, előfordulhat a tényleges tárkapacitás véletlen túlcímzése. Ebben az esetben szintén megszakítás következik be.

 

A címzési előírások megsértése

 

            A bájt-szervezésű gépeknél az utasítások hossza általában 2, 4 vagy 6 bájt lehet. Ez szokásosan együtt jár azzal a címzési előírással, hogy utasítás csak páros című bájttal kezdődhet. Ha például egy ugró utasítás páratlan címre ugratne, ez programhibát jelent és ezért végrehajtás helyett megszakítás történik. Hasonló címzési előírás lehet például hogy dupla szó csak 8-cal osztható című bájttal kezdődhet.

 

Aritmetikai-logikai műveletek miatti megszakítások

 

            Ide tartoznak az integer és a lebegőpontos számok túlcsordulásai.

 

5.3. Egy megszakítás kiszolgálásának általános folyamata

 

A program-megszakítás lehetősége egy számítógépnek olyan tulajdonsága, amelynek segítségével egy program bármely utasítás után leállítható, majd tetszőleges számú utasítás végrehajtása után, a program a soron következő utasításától újra indítható.

 

A megszakítási rendszert miért tárgyaljuk a fizikai architektúra keretében? A kezelésük vegyesen, hardver és szoftver úton történik, s a szoftver keretében nincs igazán mód a hardver-vonatkozások ismertetésére..

 

5.3.1. A megszakítás előkészítése

 

1.    valamilyen egység megszakítási kérést bocsát ki, azaz aktiválja az INTR vezérlővonalat;

2.    a megszakítás beérkezésekor a számítógép az éppen folyó utasítást még végrehajtja:

3.    minden utasítás-töréspontban a vezérlőegység megvizsgálja, hogy van-e megszakítás. Észleli, hogy van megszakítás. Az INTACK vezérlővonal aktiválásával jelzi a megszakítási kérés elfogadását, mire a megszakítást kérő deaktiválja az INTR vonalat;

 

5.3.2. A megszakítás kiszolgálásának a hardver által végzett feladatai

 

1.    Ekkor a processzor elkezdi annak az előkészítését, hogy az eddig futó program helyett a megszakítást kiszolgálását végző programot kezdhesse végrehajtani. Ennek során a programtól általában függetlenül (tehát hardver úton) egy erre a célra kijelölt memória-tartományba, a veremtárolóba kimenti azokat az állapot-információkat (a PC és az állapotregiszterek tartalma), amelyek a megszakított programnak a megszakítás bekövetkezése utáni folytatásához szükségesek.

2.    Ezután a számítógép rátérhet mindazoknak a műveleteknek a végrehajtására, amelyek érdekében a megszakítás bekövetkezett. Ennek érdekében be kell töltenie a megszakítást feldolgozó program első utasításának címét a PC-be, továbbá esetleg, tehát nem minden architektúra esetén be kell töltenie a megszakítást kiszolgáló program futásához szükséges állapot-információkat. Ezen két adatcsoport megszerzési módja architektúra-függő. Ez benne lehet az eredeti megszakítási kérésben vagy esetleg a processzornak kell kezdeményezni - akár a megszakítást feldolgozó programban - a megszakítást kérőnél ezen adatok rendelkezésre bocsátását. Szintén architektúra-függően a megszakítást kérő program lehet egyetlen program az összes megszakítás feldolgozására, lehet egy-egy önálló program minden egyes megszakítás-típushoz, stb.

 

Mihelyt a PC-be betöltésre kerül a megszakítást kiszolgáló program első utasításának címe, a processzor készen áll a megszakítást kérő rutin futtatására..

 

5.3.3. A megszakítás kiszolgálásának a szoftver által végzett feladatai

 

1.    Azonban míg az állapottér információinak mentését a hardverre bíztuk, még hátravan a megszakított program adatterének (pontosabban az aktuális regiszter-tartalmának) mentése, hiszen a regisztereket a megszakítást kiszolgáló program is használhatja s ezáltal tönkretenné a megszakított programok által beállított értékeket. Általában a megszakítást feldolgozó program első utasításai pont ezen regiszter-tartalmak mentését végzik, szintén a veremtárolóba.

2.    Amennyiben egyetlen megszakítás-kiszolgáló program van, vagy egy megszakítás-típushoz több egység is tartozik, először beazonosítja a megszakítás-kérő egységet.

3.    A megszakítás tényleges kiszolgálása. Ennek során például I/O megszakítás esetén beolvassa a megszakítást kérő I/O port adatregiszterének tartalmát, esetleg további parancsokat küldhet az I/O egység számára, s azok végrehajtását is ellenőrizheti az I/O egység státuszregiszterének újabb beolvasásával (mint a hardver 2. pontban említett esetben az állapot-információk átküldését kérheti explicit).

4.    A megszakítás kiszolgálásának befejeződése után (amennyiben a megszakítás nem okozott rendszer-leállítást) gondoskodni kell arról, hogy egy programmal visszaírjuk a megfelelő regiszterekbe a megszakítási veremtárolóból a megszakított program folytatásához szükséges adatokat, majd ezután megkezdődhet a megszakított program következő utasításának végrehajtása.

 

A megszakítás tehát abban különbözik a közönséges programtól, hogy a program futásának megszakítása során a megszakított programtól teljesen függetlenül lejátszódik egy olyan folyamat, amelynek eredményeképpen az összes jellemző regiszter pillanatnyi állapota tárolódik egy verem-memóriában.

 

5.4.A megszakítási rendszerek szintek szerint

 

Maguk a megszakítási rendszerek hardver szempontból egy vagy többszintűek lehetnek.

 

Egyszintű megszakítási rendszerek

 

Az egyszintű megszakítási rendszer esetén egyetlen megszakítási szint van, tehát

-           vagy két program-állapot regisztert találunk a CPU-ban (egyet a normál és egyet a megszakítási állapot számára);

-           vagy pedig a régi program-állapot szó tárolására és az új elővételére bármely forrás esetén ugyanaz a főtárrekesz-pár van kijelölve.

 

Így ha egy megszakítás létrejön, újabb megszakításra nincs mód mindaddig, amíg vissza nem térünk a normál állapotba. A jobb megértés kedvéért egy példában tételezzük fel, hogy mindössze három meggszakítási forrásunk van. A legmagasabb prioritású forrást jelöljük 1-essel, a prioritási sorban második forrást 2-essel és a legalacsonyabb prioritásút 3-assal.

 

 

Most tegyük fel, hogy egy normál állapotban futó program valamely utasításának végrehajtása során megszakítás-kérés érkezik a 2-es és a 3-as forrásból, és a maszk-regiszter az összes forrás szerinti megszakítást egyaránt engedélyezi. Egyszintű megszakítás-rendszer esetén a kiválasztó logika mindig a legmagasabb prioritású engedélyezett megszakítás-kérést keresi. Az utasítás végrehajtásának befejeződésekor tehát a kiválasztó logika megállapítja, hogy pillanatnyilag ez a 2-es forrás kérése a jelző-regiszterben és egyidejűleg automatikusan beíródik a 2-es forrás súlykódja a CPU egy meghatározott regiszterébe. A megszakító rutin később ennek alapján keresi meg a megszakítás pontos forrását, majd feldolgozza azt, végül visszaadja a vezérlést a normál állapotra, a megszakított programnak. A 3-as forrásból érkezett megszakítás-kérés elfogadására és feldolgozására legkorábban most kerülhet sor. Ez még nem is volna baj, hiszen a 3-as kérés az éppen feldolgozás alatt állónál alacsonyabb prioritású volt; azonban elképzelhető, hogy - mint az ábrán is látható - közben befut egy magasabb prioritású megszakítás-kérés is. Ez, bár a nálánál alacsonyabb prioritású kéréseket  (jelen esetben a 3-as forrásét) maga mödé utasítja, maga is várakozni kénytelen. A 2-es forrás szerinti kérés feldolgozása hosszabb ideig is eltarthat, viszont az 1-es forrás megszakítás-kérése esetleg nem tűrhet ekkora halasztást.

 

Többszintű megszakítási rendszerek

 

Az előzőekben vázolt problémát a többszintű megszakításrendszerek oldják meg. Tegyük fel, hogy minden egyes forráshoz külön megszakítási szint és

-           vagy saját programállapot-regiszter tartozik,

-           vagy külön rekesz-pár az operatív memóriában az Old PSW és a New PSW tárolására. A többszintű megszakításrendszerek szokásos működését előző példánkon mutatjuk be:

 

 

A kiválasztó logika működésének egy lehetséges algoritmusa többszintű megszakításrendszerben a következó: keresi a pillanatnyi CPU-szintnél magasabb prioritás-szintű engedélyezett megszakítás-kéréseket. Ha talál ilyeneket, kiválasztja közülük a legalacsonyabb prioritás-szintűt és megszakítást hajt végre erre a szintre, PSW-csere esetén ez oly módon zajlik le, hogy a megszakított szint PSW-je Old PSW-ként tárolódik az új szinthez rendelt főtár-rekesz pár egyik rekeszében, a másik rekesz tartalma pedig New PSW-ként betöltődik a programállapot-regiszterbe. Az elfogadott megszakítás-kérés nyugtázódik (jelző-flipflopja törlődik). Ezzel azonban a kiválasztó logika működése még nem zárult le. Mielőtt az új szinten futó program első utasítása megkezdődhetnék, a kiválasztó logika megismétli a leírt vizsgálatot, és újabb és újabb megszakításokat hoz létre, míg működési algoritmusa ezt előírja. Végül már nem talál a legutoljára beállított szintnél magasabb prioritású engedélyezett kérést és megengedi a legutolsó New PSW-ben megjelölt utasítás végrehajtását.

 

Ezzel az algoritmussal a CPU végeredményben az összes, a jelenleginél magasabb prioritás-szintű engedélyezett megszakítás-kérésre szinte azonnal reagál, és a legmagasabb prioritás-szintű kérés feldolgozását kezdi meg elsőnek. Egy megszakítás-kérés feldolgozása után a megszakító rutin "Load PSW" utasítással mindig annak a szintnek adja vissza a vezérlést, ahonnan kapta. Így a megszakítás-kérések egymás utáni feldolgozása is fontossági sorrendjükben következik be.

 

 

Az elmondottaknak megfelelően a példánkban a következő történik: A 2-es és a 3-as forrás egyidejű beérkezése után először megszakítás történik a 3-as forrás szintjére, majd onnan azonnal tovább a 2-es szintre. Itt megkezdődik a 2-es ok elemzése és feldolgozása. Az időközben az 1-es forrásból érkező kérés miatt a feldolgozás abbamarad, és megszakítás történik az 1-es szintre. Itt megtörténik az 1-es ok feldolgozása, majd visszaadódik a vezérlés a 2-es szintre, ahol folytatódik a 2-es feldolgozása. Ennek befejeztével visszaadódik a vezérlés a 3-as szintre, és a 3-as feldolgozása is megtörténik. Végül a vezérlést ismét a normál szintű program kapja meg.

 

Az elmondottak még annyiban szorulnak kiegészítésre, hogy - mivel egy megszakításkor az új PSW-vel egy új maszk-szó is aktiválódik - a további megszakítások engedélyezése szempontjából már nyilván az új maszk-szó az érvényes.