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.
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:
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.
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.
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).
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
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
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 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.
Ide tartoznak az integer és a lebegőpontos számok
túlcsordulásai.
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..
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;
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..
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.
Maguk a megszakítási rendszerek hardver szempontból egy vagy többszintűek
lehetnek.
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.
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.