Operacijski sustav ne dozvoljava pojedinom korisniku izravno korištenje prekida procesora. Stoga prekide treba simulirati koristeći signale koje jezgra operacijskog sustava šalje procesima.
Struktura prekidne rutine dana je sljedećim pseudokodom:
prekidna_rutina /* pokreće se pojavom signala */ odredi uzrok prekida, tj. indeks i OZNAKA_ČEKANJA[i] = 1 dok je i > TEKUĆI_PRIORITET OZNAKA_ČEKANJA[i] = 0 PRIORITET[i] = TEKUĆI_PRIORITET TEKUĆI_PRIORITET = i obrada_prekida(i) TEKUĆI_PRIORITET = PRIORITET[i] i = 0 za j = TEKUĆI_PRIORITET + 1 do N radi ako je OZNAKA_ČEKANJA[j]<>0 tada i = j
Predložak i pomoćne funkcije za ispis (sig-win.py):
#!/usr/bin/python # -*- coding: UTF-8 -*- import time, signal, sys TEKUCI_PRIORITET = 0 PRIORITET = [0,0,0,0,0,0] OZNAKA_CEKANJA = [0,0,0,0,0,0] def ispisi_pojavu_signala(prioritet): # prioritet u rangu 1-5 print('\t' + '- ' * prioritet + 'X ' + '- ' * (5-prioritet)) def ispisi_pocetak_obrade_signala(prioritet): print('\t' + '- ' * prioritet + 'P ' + '- ' * (5-prioritet)) def ispisi_kraj_obrade_signala(prioritet): print('\t' + '- ' * prioritet + 'K ' + '- ' * (5-prioritet)) def ispisi_korak_obrade_signala(prioritet, korak): print('\t' + '- ' * prioritet + str(korak) + ' ' + '- ' * (5-prioritet)) def ispisi_korak_obrade_glavnog_programa(korak): print('\t' + str(korak%10) + ' -' * 5) def simulacija_obrade_prekida(prioritet): ispisi_pocetak_obrade_signala(prioritet) for korak in range(1,6): ispisi_korak_obrade_signala(prioritet, korak) time.sleep(1) ispisi_kraj_obrade_signala(prioritet) def prekidna_rutina(signal, frame): global TEKUCI_PRIORITET i = int(input("Unesi prioritet prekida: ")) if i == 10: print("\nZavršavam rad") sys.exit(1) ispisi_pojavu_signala(i) OZNAKA_CEKANJA[i] = 1; # ostatak koda prema gornjem pseudokodu # ... simulacija_obrade_prekida(i) # ... def main(): print("\tG 1 2 3 4 5") signal.signal(signal.SIGINT, prekidna_rutina) for korak in range(100): ispisi_korak_obrade_glavnog_programa(korak) time.sleep(1) if __name__ == "__main__": main()Primjer rada s ispisom poziva funkcija i gniježđenja
Ispis Funkcije ------------------------- G 1 2 3 4 5 main 0 - - - - - main 1 - - - - - main 2 - - - - - main 3 - - - - - main 4 - - - - - main Unesi...: 3 main=>SIGINT=>prekidna_rutina - - - X - - main=>SIGINT=>prekidna_rutina->ispisi_pojavu_signala - - - P - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - 1 - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - 2 - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida Unesi...: 5 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina - - - - - X main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->ispisi_pojavu_signala - - - - - P main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - - - 1 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - - - 2 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - - - 3 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida Unesi...: 2 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina - - X - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->ispisi_pojavu_signala - - - - - 4 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - - - 5 main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - - - K main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - 3 - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - 4 - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - 5 - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - - K - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - P - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - 1 - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - 2 - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - 3 - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - 4 - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - 5 - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida - - K - - - main=>SIGINT=>prekidna_rutina->simulacija_obrade_prekida 5 - - - - - main 6 - - - - - main