Przerwanie (ang. interrupt) to sygnał, który mówi procesorowi: „rzuć to, co właśnie robisz, mamy coś pilniejszego”. Procesor zawiesza bieżący wątek, zapamiętuje swój stan i przeskakuje do specjalnej procedury obsługi, czyli interrupt handler (zwanej też ISR — Interrupt Service Routine). Po jej zakończeniu wraca dokładnie tam, gdzie skończył, jakby nic się nie stało. Dzięki temu komputer reaguje na zdarzenia natychmiast, zamiast w kółko pytać każde urządzenie „i co, już coś masz?”.
Jak to działa
Przerwania dzielą się grubo na dwa rodzaje. Sprzętowe generują urządzenia: naciśnięcie klawisza, ruch myszką, pakiet z karty sieciowej, timer odmierzający kwanty czasu dla scheduler-a. Programowe wywołuje samo oprogramowanie — to mechanizm stojący za syscall, czyli wywołaniem funkcji jądra. Osobna kategoria to exceptions (np. dzielenie przez zero albo page fault), które procesor zgłasza sam, gdy coś pójdzie nie tak.
Gdy nadejdzie sygnał, kontroler przerwań (na x86 historycznie PIC, dziś APIC) przypisuje mu numer i odsyła procesor do tablicy wektorów przerwań (IDT na x86). Tam czeka adres właściwej procedury. Kluczowa zasada: handler ma być krótki. Im dłużej w nim siedzisz, tym dłużej blokujesz inne zdarzenia — dlatego w jądrach dzieli się obsługę na szybką część „górną” i odroczoną „dolną” (w Linuksie: top half i bottom half / softirq).
Przykład z praktyki
Chcesz zobaczyć przerwania na żywo na Linuksie? Zajrzyj do /proc/interrupts — zobaczysz licznik dla każdego źródła i rdzenia procesora:
cat /proc/interrupts— pokazuje, ile razy zadziałało każde przerwanie (klawiatura, dysk, sieć, timer).watch -n1 'cat /proc/interrupts'— odśwież co sekundę i poruszaj myszką: zobaczysz, jak skacze licznik przy odpowiednim IRQ.
Numer IRQ (np. dawne IRQ 1 dla klawiatury PS/2) to właśnie linia przerwania przypisana urządzeniu.
Częste błędy i mity
Mit: przerwanie to to samo co polling. Wręcz przeciwnie — polling to ciągłe odpytywanie urządzenia w pętli (marnotrawstwo CPU), a przerwanie odzywa się dopiero, gdy faktycznie jest co obsłużyć. Choć przy bardzo szybkich kartach sieciowych czasem wraca się do pollingu (NAPI), bo lawina przerwań sama w sobie potrafi zadławić procesor — to zjawisko nazywa się interrupt storm.
Druga pułapka: ciężkie obliczenia w handlerze albo blokujące operacje. ISR działa z wyłączonymi (lub ograniczonymi) innymi przerwaniami, więc każda zwłoka to opóźnienie całego systemu.
Pojęcia powiązane
Warto kojarzyć: IRQ, ISR / interrupt handler, IDT i wektor przerwania, kontroler APIC, polling, syscall, DMA oraz context switch.