En afbrydelse er, når en mikroprocessor skal stoppe sin normale udførelse af et program for at reagere på en begivenhed, som ligger uden for programmets direkte kontrol. Ofte kommer afbrydelsen som et elektrisk signal fra hardware (fx et tastetryk eller en færdig dataoverførsel), men den kan også stamme fra software (fx en systemopkalds- eller fejltilstand). Afbrydelser kan indtræffe når som helst, mens processoren kører et program, uanset hvor i programmets kildekode den befinder sig.

Hvorfor bruges afbrydelser?

  • Reager hurtigt på hardware-begivenheder: Fx når der trykkes på taster på et tastatur, når en timer udløber, eller når en perifer enhed har færdigbehandlet en dataoverførsel.
  • Effektiv ressourceudnyttelse: I stedet for konstant at tjekke (polling) om en enhed er færdig, kan CPU'en sove eller udføre andet arbejde og kun blive vækket af en afbrydelse.
  • Fejlhåndtering: Fejltilstande som division med nul eller page faults rapporteres som afbrydelser/undtagelser, så systemet kan reagere passende.

Typer af afbrydelser

  • Hardwareafbrydelser: Asynkrone signaler fra eksterne enheder (tastatur, netkort, DMA, timer).
  • Softwareafbrydelser: Synchronous opkald fra programmet, fx systemopkald eller instruktioner der bevidst genererer et afbrud (traditionelt "int" i ældre x86-kode).
  • Undtagelser (exceptions): Synchronous fejltilstande som divide-by-zero eller adgang til ugyldigt hukommelsesområde.
  • Maskerbare vs. ikke-maskerbare: Maskerbare afbrydelser kan midlertidigt deaktiveres (maskes) af CPU'en; non-maskable interrupts (NMI) kan ikke maskes og bruges til kritiske fejl.

Sådan håndterer CPU'en en afbrydelse

Når en afbrydelse opstår følger CPU'en typisk disse skridt:

  1. Detektering: CPU'en modtager et afbrydelsessignal fra hardware eller software. Moderne CPU'er opdager afbrydelsen ved instruktionsgrænser og/eller præcise undtagelsespunkter.
  2. Acknowledge og prioritering: Et afbrydelseskontroller (fx PIC eller APIC) kan afgøre prioriteten, især hvis flere afbrydelser forekommer samtidigt.
  3. Gemme konteksten: CPU'en gemmer vigtig tilstand (programtæller, statusregistre og ofte et sæt general purpose registre) så det afbrudte program senere kan fortsætte korrekt.
  4. Spring til en afbryderrutine (ISR/handler): CPU'en bruger en afbrydelsestabel eller interrupt vector (fx IDT i x86) for at finde startadressen for den korrekte handler og begynder at udføre den.
  5. Udførelse af handleren: ISR'en håndterer begivenheden (læser data fra en enhed, opdaterer tilstand, vækker en ventende proces osv.). Handleren bør være så kort og hurtig som muligt for at minimere latenstid.
  6. Gendannelse: Når handleren er færdig, genopretter CPU'en den tidligere gemte kontekst og fortsætter udførelsen af programmet, normalt via en særlig instruks (fx IRET på x86).

Nogle vigtige begreber

  • Interrupt vector / IDT: En tabel med adresser til de forskellige afbryderrutiner. Når en afbrydelse indtræffer, slår CPU'en vektoren op og hopper til den korrekte kode.
  • ISR (Interrupt Service Routine): Den kode, der udfører selve håndteringen af afbrydelsen.
  • Nested interrupts: Muligheden for at lade højere-prioritets afbrydelser afbryde en kørende ISR. Dette kræver ekstra kontekststyring.
  • Masking/disable: Systemet kan midlertidigt forhindre visse afbrydelser for at beskytte kritiske sektioner, men det øger risikoen for forsinkelse af vigtige hændelser.
  • Latency: Tiden fra et afbrydelsessignal udsendes, til den tilhørende ISR begynder at køre. Denne tid afhænger af CPU-arkitektur, prioriteringsmekanismer og omfanget af kontekst, der skal gemmes.

Eksempler

  • Tastatur: Når en tast trykkes, sender tastaturet et hardware-signal — CPU'en modtager en afbrydelse og en driver læser tasten.
  • Timer: Operativsystemets planlægger bruger typisk en timerafbrydelse for at skifte mellem processer (tidskvantestyring).
  • DMA-komplettering: En perifer enhed har afsluttet en stor dataoverførsel og signalerer CPU'en, så data kan viderebehandles.
  • Page fault: Et program forsøger at få adgang til en hukommelsesside, der ikke er i RAM — CPU'en rejser en undtagelse, og operativsystemet kan hente siden fra disk.

God praksis ved programmering af afbryderrutiner

  • Hold ISR'er korte: Flyt tidskrævende arbejde ud til en baggrundsopgave eller et arbejdeskø-system.
  • Gem og genopret kun de nødvendige registre for at minimere omkostninger.
  • Undgå blokering i ISR: Vent ikke på ressourcer i en afbryderkontekst.
  • Håndter prioritering konsekvent og brug ikke-maskerbare afbrydelser kun til kritiske fejl.

Sammenfattende er afbrydelser et centralt værktøj i moderne systemer, fordi de gør det muligt for CPU'en hurtigt at reagere på både hardware- og softwarebegivenheder uden konstant at spilde tid på at tjekke enheder. Forståelse af, hvordan afbrydelser opstår, prioriteres og håndteres, er grundlæggende for at udvikle effektive operativsystemer, drivere og indlejrede systemer.