Domanda

Ho visto diverse domande qui su eccezioni e alcune di esse suggeriscono si interrompe come eccezioni , ma nessuno chiarisce la connessione.

  • Che cos'è un interrupt?

  • Che cos'è un'eccezione? (spiega quali sono le eccezioni per ogni lingua che conosci, poiché ci sono alcune differenze)

  • Quando un'eccezione è un interrupt e viceversa?

È stato utile?

Soluzione

Un interrupt è un segnale della CPU generato dall'hardware o istruzioni specifiche della CPU. Ciò causa l'esecuzione di gestori di interruzioni. Cose come segnali I / O dall'hardware I / O generano interruzioni.

Un'eccezione può essere pensata come una versione software di un interrupt, che influenza solo il suo processo.

Non sono sicuro dei dettagli esatti, ma un'eccezione potrebbe essere implementata da un interrupt.

Altri suggerimenti

Il processore avrà un numero di pin di interruzione esterni. In genere questi pin sono collegati all'hardware e vengono utilizzati per indicare quando si verifica un evento esterno. Ad esempio, se si utilizza una porta seriale, UART genererà un pin collegato a uno dei pin di interruzione sul processore per indicare che è stato ricevuto un byte.

Anche altre periferiche come timer, controller USB, ecc. genereranno interruzioni sulla base di alcuni eventi esterni.

Quando il processore riceve un segnale su uno dei suoi pin di interruzione esterni, salterà immediatamente in una posizione nominata in memoria e inizierà l'esecuzione. Il codice eseguito viene in genere chiamato ISR o routine del servizio di interruzione. A meno che tu non stia implementando driver o eseguendo software embedded di qualche tipo, è improbabile che ti imbatterai mai in ISR.

Sfortunatamente la risposta alla domanda sulle eccezioni è un po 'meno chiara - ci sono stati 3 significati diversi elencati in altre risposte in questa pagina.

La risposta di Ron Savage si riferisce al costrutto software. Questa è puramente un'eccezione a livello di applicazione, in cui un pezzo di codice è in grado di indicare un errore che può essere rilevato da qualche altro pezzo di codice. Non c'è alcun coinvolgimento hardware qui.

Quindi c'è l'eccezione vista da un'attività. Questo è un costrutto a livello di sistema operativo che viene utilizzato per uccidere un'attività quando fa qualcosa di illegale - come dividere per 0, accedere illegalmente alla memoria ecc.

E in terzo luogo, c'è l'eccezione hardware. In termini di comportamento è identico a un interrupt in quanto il processore salterà immediatamente in una posizione di memoria nominata e inizierà l'esecuzione. Quando un'eccezione differisce da un interrupt è che un'eccezione è causata da un'attività illegale rilevata dal processore. Ad esempio, la MMU sul processore rileverà accessi alla memoria illegali e causerà un'eccezione. Queste eccezioni hardware sono il trigger iniziale per il sistema operativo per eseguire le attività di pulizia (come descritto nel paragrafo precedente).

Gli interrupt sono generati da dispositivi esterni alla CPU (tick timer, completamento operazione disco, arrivo pacchetto di rete, ecc.) e sono asincroni con l'esecuzione del programma. Le eccezioni sono sincrone con l'esecuzione del programma (ad es. Divisione per zero, accesso a un indirizzo non valido).

A meno che il programma non venga eseguito senza un sistema operativo (o non si stia sviluppando un sistema operativo), non vedrà mai un'eccezione / interruzione non elaborata. Vengono catturati dal sistema operativo e gestiti da esso (interrompe) o convertiti in qualche altra forma prima di essere riflessi nel programma utente (ad es. Segnali su UNIX, gestione delle eccezioni strutturata (SEH) su Windows) dove ha una possibilità di gestione esso.

Gli interrupt indicano che qualcosa di esterno al core del processore richiede la sua attenzione. Interrompe il normale flusso del programma, esegue una routine di servizio di interruzione (ISR) e generalmente ritorna dove si trovava prima dell'interruzione.

Esistono molte variazioni su questo tema di base: gli interrupt potrebbero essere generati dal software, un'altra attività potrebbe ottenere la CPU dopo l'ISR, ecc. Il punto chiave è che gli interrupt possono verificarsi in qualsiasi momento per un motivo il codice / La CPU non ha nessun controllo su .

Un'eccezione è un po 'più complicata da definire perché ha potenzialmente tre livelli di significato:

Eccezioni hardware

Alcuni processori (ad esempio PowerPC) definiscono eccezioni per indicare che si è verificata una sorta di condizione insolita: Ripristino del sistema, Indirizzo non valido, mancata memorizzazione nella cache di una traduzione di un indirizzo virtuale, ecc ...

Queste eccezioni vengono utilizzate anche per implementare punti di interruzione e chiamate di sistema. In questo caso, si comportano quasi come interruzioni.

Eccezioni del sistema operativo

Alcune delle eccezioni hardware saranno gestite dal sistema operativo. Ad esempio, il programma accede alla memoria non valida. Ciò causerà un'eccezione hardware. Il sistema operativo ha un gestore per tale eccezione e le probabilità sono che il sistema operativo invierà un segnale alla tua applicazione (SIGSEGV per esempio) indicando che c'è un problema.

Se nel tuo programma è installato un gestore dei segnali, il gestore dei segnali verrà eseguito e si spera che gestirà la situazione. Se non si dispone di un gestore di segnale, il programma può essere terminato o sospeso.

Considererei i Gestori di eccezioni strutturati (SEH) di Window questo tipo di eccezioni.

Eccezioni software

Alcuni linguaggi come Java, C ++ e C # hanno il concetto di eccezioni software, in cui il linguaggio prevede la gestione di condizioni impreviste o inusuali relative al funzionamento del programma . In questo caso, viene sollevata un'eccezione in qualche punto del codice e un po 'di codice più in alto nello stack di esecuzione del programma "catturerà". l'eccezione ed esegui. Questo è ciò che fanno i blocchi try / catch.

Ho intenzione di approfondire cos'è un interrupt perché esiste un tipo critico di interrupt che nessuno ha ancora affrontato: il timer.

Ma prima, fammi tornare indietro. Quando ricevi un interrupt, il tuo gestore di interrupt (che vive in kernelspace) viene eseguito, che in genere disabilita gli interrupt, si occupa di qualsiasi attività in sospeso (gestione del pacchetto appena arrivato sulla rete, elaborazione della sequenza di tasti, ecc.) E quindi (ricorda che ricordiamo che sei ancora nel kernel a questo punto) capisce quale processo dovrebbe essere eseguito successivamente (potrebbe essere lo stesso, potrebbe essere diverso, dipende dallo scheduler) e quindi eseguirlo.

Solo un processo viene eseguito sul processore alla volta. E quando si utilizza un sistema operativo multitasking, il modo in cui cambia tra loro viene chiamato interruttore di contesto: fondamentalmente i registri del processore vengono scaricati in memoria, il flusso passa al nuovo processo e quando il processo viene fatto il contesto passa a qualcosa il resto.

Quindi, diciamo che scrivo un semplice programma C che conta tutti i numeri, o la sequenza di Fibonacci, o qualcos'altro senza fermarsi. O meglio: non fa altro che girare all'interno di un ciclo while (1). In che modo gli altri processi sul sistema hanno la possibilità di essere eseguiti? E se non accadesse nulla che causasse un interruzione?

La risposta è che hai un dispositivo timer che si interrompe costantemente. Ed è ciò che impedisce a un processo di rotazione di abbattere l'intero sistema. Anche se noterò che i gestori di interrupt disabilitano gli interrupt, quindi se fai qualcosa che si blocca indefinitamente puoi eliminare l'intero sistema.

eccezione

Un'eccezione è quando il processore esegue il codice che non si trova sul suo percorso normale. Questa è un'eccezione al normale funzionamento, che è essenzialmente un movimento lineare attraverso strutture di codice e controllo. Lingue diverse supportano vari tipi di eccezioni, generalmente utilizzate per gestire gli errori durante il funzionamento del programma.

Interruzione

Un interrupt è un'eccezione a livello hardware (in genere). L'interruzione è un segnale fisico nel processore che dice alla CPU di memorizzare il suo stato corrente e saltare al codice gestore (o eccezione) di interruzione. Una volta terminato il gestore, lo stato originale viene ripristinato e l'elaborazione può continuare.

Un interrupt è sempre un'eccezione, anche quando è previsto. Gli interrupt potrebbero indicare:

  • errori, come una violazione di accesso alla memoria
  • che il sistema operativo deve eseguire un'operazione per supportare un programma in esecuzione, come un'interruzione del software o una richiesta di paging della memoria
  • un dispositivo hardware richiede attenzione, ad esempio un pacchetto di rete ricevuto o un buffer di trasmissione vuoto

Questi costringono sempre il processore a mettere in pausa la sua attività corrente per gestire l'eccezione sollevata, riprendendo solo quando il gestore degli interrupt è completo.

insidie ??

In termini di interruzioni, le insidie ??comuni sono le condizioni di gara. Ad esempio, potresti avere un interrupt che incrementa periodicamente un orologio globale in tempo reale. L'orologio potrebbe essere a 64 bit su una macchina a 32 bit.

Se un programma sta leggendo l'orologio e ottiene la prima parola a 32 bit, allora si verifica l'interruzione, una volta che l'handler di interruzione esce dal processo ottiene la seconda parola a 32 bit e i dati saranno incoerenti - le due parole potrebbero essere fuori sincrono. Se si tenta di utilizzare un mutex o un semaforo per bloccare la variabile nel processo, l'interrupt si bloccherà in attesa del blocco e arresterà il sistema (deadlock), a meno che sia il gestore che i processi che utilizzano i dati siano scritti con molta attenzione. È facile mettersi nei guai quando si scrive per gli interrupt.

Anche le funzioni di rientro rappresentano un altro problema. Se stai eseguendo funcA nel codice del programma, prendi un interrupt che esegue anche funcA che potresti finire con conseguenze indesiderate dovute a variabili condivise (variabili statiche o heap, classi, ecc.). In genere si desidera eseguire il minor codice possibile nel gestore di interrupt e spesso ha impostato un flag in modo che il processo possa svolgere il vero lavoro in un secondo momento, senza preoccuparsi dei conflitti.

In qualche modo questo è simile allo sviluppo per un multiprocessore, ed è uno dei motivi per cui la programmazione del kernel è ancora considerata da molti la magia nera.

-Adam

Ci si aspetta che si verifichino interruzioni periodiche (anche se a volte non sono regolari) .. interrompono la cpu perché è appena successo qualcosa di importante e deve essere preso immediatamente in considerazione.

Le eccezioni dovrebbero essere eccezioni alla regola; questi vengono lanciati dal software perché è successo qualcosa di inaspettato e questa è la tua occasione per provare a fare qualcosa al riguardo, o almeno a schiantarsi con grazia.

Quando si parla di interruzioni ed eccezioni, si parla generalmente di codice a livello hardware e interruzioni ed eccezioni sono spesso implementate in parte dall'hardware e in parte nel software.

Un interrupt è un evento nell'hardware (o attivato manualmente in assembly) associato a un vettore di gestori che può essere utilizzato per gestire l'evento di interruzione, sia esso IO Completion, IO Error (Disk Memory Failure), IO Event (Sposta il mouse per esempio). Gli interrupt possono generare eccezioni spesso quando si verificano interruzioni impreviste.

Un'eccezione è un comportamento imprevisto, molto spesso quando si utilizza l'hardware provengono da un interrupt e vengono gestiti separatamente nel software mediante un gestore di interrupt. I linguaggi di programmazione come li vediamo quasi sempre mascherano questo come una struttura di controllo di qualche tipo.

In generale, un interrupt è una trappola implementata dall'hardware di qualche tipo. Registri un gestore per un interrupt specifico (divisione per 0, dati disponibili su una periferica, timer scaduto) e quando si verifica quell'evento, l'elaborazione di tutti gli arresti a livello di sistema, elabora rapidamente l'interrupt e le cose continuano. Questi sono di solito impiantati in un driver di dispositivo o nel kernel.

Un'eccezione è un modo implementato dal software di gestire gli errori nel codice. È possibile impostare un gestore per eccezioni specifiche (o generali). Quando si verifica un'eccezione, il runtime delle lingue inizierà a svolgere lo stack fino a quando non raggiunge un gestore per quel gestore specifico. A quel punto puoi gestire l'eccezione e continuare, oppure uscire dal tuo programma.

Semplificando le cose ...

Quando hai finito di gestire un interrupt, (normalmente) ritorni a quello che stavi facendo prima di essere interrotto.

Gestire un'eccezione implica buttare via i livelli successivi di ciò su cui stai attualmente lavorando fino a quando non raggiungi il punto in cui l'eccezione può essere gestita (catturata).

Mentre gestisci un interrupt, puoi decidere di lanciare un'eccezione, ma ciò non significa che devi considerare l'interrupt stesso come un'eccezione. Le eccezioni non "interrompono" (poiché ciò implicherebbe la possibilità di tornare a quello che stavi facendo poco prima di essere interrotto); piuttosto "abortiscono" (alcuni sottogruppi di) attività corrente.

E, come già notato più volte, gli interrupt sono di solito innescati da entità esterne come hardware o utenti (come un clic del mouse o una sequenza di tasti come CTRL-C) mentre le eccezioni vengono generate (generate) in modo sincrono dal software che rileva un " problema " o "condizioni eccezionali".

Iterrupts sono fondamentalmente guidati dall'hardware, come la tua stampante indica che è "esaurita la carta". o la scheda di rete che indica che ha perso la connessione.

Un'eccezione è semplicemente una condizione di errore nel programma, rilevata da un blocco try / catch. Come:

Try
   {
   ... various code steps that "throw exceptions" on error ...
   }
catch (exception e)
   {
   print 'Crap! Something bad happened.' + e.toString()
   }

È un modo pratico per rilevare " qualsiasi errore " ciò accade in un blocco di codice in modo da poterli gestire in modo simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top