Keskeytys (tietotekniikka)

**Keskeytys** on mekanismi, jonka avulla saadaan tietokoneen suoritin keskeyttämään meneillään olevan tietokoneohjelman suoritus ja siirtymään suorittamaan keskeytyskohtaisen keskeytyskäsittelijän () koodia. 

Keskeytys voi olla joko laitteistopohjainen tai ohjelmallinen. 

## Laitteistokeskeytys

Laitteistokeskeytyksen aiheuttaa tyypillisesti jokin asynkroninen tapahtuma (), esimerkiksi tietokoneen oheislaite kuten kiintolevy. Tällainen keskeytys voidaan tarvittaessa estää, ja tyypillisesti keskeytys aiheuttaa suorittimen siirtymisen keskeytyspalveluun, kun suorituksessa oleva konekäsky on tehty loppuun asti.

Oheislaitteiden aiheuttamat keskeytykset ovat asynkronisia, eli ne eivät liity siihen konekäskyyn, jonka aikana ne virittyvät.

## Ohjelmistokeskeytys

Ohjelmistokeskeytyksen aiheuttaa konekäsky, jonka parametrien perusteella käyttöjärjestelmän ydin päättelee oikean keskeytyspalvelun. Tällaista konekäskyä kutsutaan myös ansaksi (). Ohjelmistokeskeytys on loogisesti hyvin lähellä aliohjelmakutsua. Sitä ei kuitenkaan voi korvata aliohjelmakutsumekanismilla, sillä se vaihtaa suorittimen tilan käyttäjätilasta () etuoikeutettuun tilaan (). Vastaava vaihdos tapahtuu kaikissa keskeytyksissä. Koska ohjelmistokeskeytys johtuu ajettavasta konekäskystä, sen sanotaan olevan synkroninen keskeytys.

## Ohjelmavirhekeskeytys

Virheellinen tai kyseisessä suorittimen tilassa kielletty konekäsky aiheuttaa ohjelmavirhekeskeytyksen. Virhe voi olla viittaus olemattomaan tai suojattuun muistiosoitteeseen tai olematon konekäsky. Edellä olleisiin keskeytyksiin nähden erityistä on, että suoritettava käsky voidaan keskeyttää ennen sen suorittamista loppuun.
Ohjelmavirhekeskeytys on luonnollisesti synkroninen.

Ohjelmavirhekeskeytyksen tarkoitus on pysäyttää toiminto virheen tullessa. Mekanismia on käytetty myös mahdollistamaan käskykannan laajentaminen siten, että ohjelmavirhekeskeysrutiini tunnistaa tuntemattoman konekäskyn ja suorittaa sitä vastaavat toimenpiteet. Näin uudemman suoritinversion käskykantaa on voitu ajaa vanhemmassakin suorittimessa, tosin tehokkuuden kustannuksella.

## Läsnäolokeskeytys

Edellisten lisäksi virtuaalimuisti voi aiheuttaa läsnäolokeskeytyksen. 
Läsnäolokeskeytys pystyy keskeyttämään ajossa olevan käskyn; joissain suorittimissa jopa niin, että käskyä voidaan jatkaa sen keskeltä, kun virtuaalimuistijärjestelmä on saanut haettua tarvittavat tiedot keskusmuistiin. Vaihtoehtona on aloittaa käsky alusta, mikä on tyypillinen ratkaisu RISC-arkkitehtuurin mukaisissa suorittimissa.

## Keskeytysten toiminta
Keskeytyksen tullessa suoritin joko vaihtaa rekisterisarjaansa tai osa suorittimen tilasta tallennetaan pinoon, pienissä suorittimissa usein koko tila. Samalla suorittimen tila vaihtuu käyttäjän tilasta etuoikeutettuun () tilaan, jossa voidaan käsitellä käyttöjärjestelmän rakenteita ja ohjata laitteiston toimintaa.
Samalla laitteistokeskeytyksen tullessa kielletään saman tai alemman tason laitteistokeskeytykset keskeytyspalvelun ajaksi. Ohjelmisto-, ohjelmavirhe- ja läsnäolokeskeytyksiä ei voi estää.

Keskeytyksen aiheuttajan mukaan valitaan keskeytysvektorin avulla oikea keskeytyskäsittelijä, joka tarvittaessa tallettaa suorittimen koko tilan sille osoitettuun paikkaan (ns. ensitason keskeyskäsittelijä, ). Tämän jälkeen keskeytyskäsittelijä tekee keskeytykseen liittyvät toimenpiteet.
Oheislaitteen osalta tämä voi tarkoittaa esimerkiksi seuraavan tiedonsiirron aloittamista ja edellistä siirtoa odottavan prosessin herättämistä. Tähän liittyy tarvittaessa myös keskeytyksen kuittaus, jotta oheislaite ei keskeytä heti uudelleen; tavallisesti keskeytys kuittaantuu automaattisesti, kun laitteen data- tai ohjausrekisteri luetaan. Ohjelmallinen keskeytys voi esimerkiksi avata tiedoston prosessin käyttöön.  Ohjelmavirhekeskeytys tyypillisesti johtaa kutsuneen ohjelman keskeyttämiseen. Lopuksi keskeytyksen käsittelijä joko palaa keskeytettyyn ohjelmaan tai kutsuu käyttöjärjestelmän vuorontajaa, joka valitsee seuraavan ajoon otettavan prosessin.

Keskeytyksillä on keskinäinen prioriteetti, eli jos enemmän kuin yksi keskeytys tulee samaan aikaan, prioriteetiltaan korkein keskeytys valitaan palveltavaksi.  Kun tästä keskeytyksestä palataan, suoritetaan seuraavaksi korkein odottava keskeytys jne.  Tyypillisesti keskeytykset ovat keskeytysvektorissa niiden prioriteettijärjestyksessä.

Tietyissä tilanteissa moninkertainen keskeytys voi aiheuttaa käyttöjärjestelmän kaatumisen; esimerkiksi silloin, jos ohjelmavirhekeskeytys tulee suoritettaessa käyttöjärjestelmän ytimen koodia.

## Lähteet
*