Afbrydelse (interrupt): Definition, årsager og hvordan CPU'en håndterer det
Forstå afbrydelse (interrupt): hvad det er, typiske årsager og hvordan CPU'en prioriterer og håndterer dem — teknisk, klart og med praktiske eksempler.
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:
- Detektering: CPU'en modtager et afbrydelsessignal fra hardware eller software. Moderne CPU'er opdager afbrydelsen ved instruktionsgrænser og/eller præcise undtagelsespunkter.
- Acknowledge og prioritering: Et afbrydelseskontroller (fx PIC eller APIC) kan afgøre prioriteten, især hvis flere afbrydelser forekommer samtidigt.
- 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.
- 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.
- 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.
- 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.
Dette diagram viser, hvad der sker, når en afbrydelse kaldes
Sådan fungerer afbrydelser
Et hardware- eller softwarekald til en afbrydelse (kendt som en afbrydelsesanmodning eller IRQ) håndteres af en "afbrydelseshåndtering" eller "afbrydelsesservicerutine" (ISR) i processoren. Den lægger det, den laver på det pågældende tidspunkt, på en stak og følger derefter bestemte instruktioner, der udfører en given opgave på systemets vegne, som ikke behøver at være en del af det program, den udfører. Når den er færdig med at følge instruktionerne, tager ISR'en det, den har lagt på stakken, tilbage og fortsætter med det, den var i gang med, før afbrydelsen fandt sted.
Mange afbrydelsescontrollere fra nutidens processorer bruger en afbrydelsesvektor til at sortere afbrydelser på baggrund af bl.a. hvorfra den kom. Vektoren indeholder typisk den kode, der skal køres, når interrupterne opstår. ISR'er er generelt ansvarlige for at håndtere, eller "servicere", afbrydelsen, sammen med at holde sig selv i orden.
Anvendelse af afbrydelser
- Udløsning af opgaver med jævne mellemrum
- Service af en ekstern enhed, der kan ske når som helst
- Fjern behovet for synkron afstemning
- Udløsning af et operativsystem (OS) til at foretage en handling
Spørgsmål og svar
Q: Hvad er et interrupt?
A: Et interrupt er en handling, der udføres af en mikroprocessor, som ikke er en del af det program, der udføres, på grund af eksterne begivenheder.
Q: Hvad får oftest afbrydelser til at forekomme på en processor?
A: Interrupts opstår oftest på en processor på grund af modtagelse af signaler fra hardware.
Q: Kan afbrydelser forårsages af software?
A: Ja, afbrydelser kan også forårsages af software, der kører parallelt med det program, der udføres.
Q: Nævn et par eksempler på hændelser, der kan forårsage et interrupt.
A: Eksempler på hændelser, der kan forårsage et interrupt, er tryk på taster på et tastatur, en timer, der går i gang, og dataoverførsler, der finder sted.
Q: Er et interrupt afhængigt af, hvor programmet kører?
A: Nej, afbrydelser kan forekomme når som helst under programudførelsen, uanset hvor programmet er i kildekoden.
Q: Er et interrupt en ønskværdig begivenhed for en mikroprocessor?
A: Interrupts er normalt uønskede hændelser for en mikroprocessor, da de forstyrrer programmets afvikling og kræver øjeblikkelig opmærksomhed.
Q: Hvordan reagerer en mikroprocessor på et interrupt?
A: En mikroprocessor afbryder midlertidigt det program, der er ved at blive udført, og udfører en interrupt service routine (ISR) for at håndtere interruptet, før den vender tilbage til det program, der er ved at blive udført.
Søge