Pregunta

He visto varias preguntas aquí sobre excepciones, y algunos de ellos insinúan interrupciones como excepciones, pero ninguno aclara la conexión.

  • ¿Qué es una interrupción?

  • ¿Qué es una excepción?(explique qué excepciones hay para cada idioma que conoce, ya que existen algunas diferencias)

  • ¿Cuándo una excepción es una interrupción y viceversa?

¿Fue útil?

Solución

Una interrupción es una señal de CPU generada por hardware o instrucciones específicas de la CPU.Estos hacen que se ejecuten controladores de interrupciones.Cosas como las señales de E/S del hardware de E/S generan interrupciones.

Se puede considerar una excepción como una versión de software de una interrupción, que solo afecta su proceso.

No estoy seguro de los detalles exactos, pero es una excepción. podría ser implementado por una interrupción.

Otros consejos

Su procesador tendrá varios pines de interrupción externos.Normalmente, estos pines están conectados al hardware y se utilizan para indicar cuándo ocurre algún evento externo.Por ejemplo, si está utilizando un puerto serie, el UART elevará un pin que está conectado a uno de los pines de interrupción del procesador para indicar que se ha recibido un byte.

Otros periféricos como temporizadores, controladores USB, etc.También generará interrupciones en base a algún evento externo.

Cuando el procesador recibe una señal en uno de sus pines de interrupción externos, inmediatamente saltará a alguna ubicación designada en la memoria y comenzará a ejecutarse.El código ejecutado normalmente se denomina ISR o rutina de servicio de interrupción.A menos que esté implementando controladores o utilizando algún tipo de software integrado, es poco probable que alguna vez se encuentre con ISR.

Desafortunadamente, la respuesta a la pregunta sobre las excepciones es un poco menos clara: se han enumerado 3 significados diferentes en otras respuestas de esta página.

La respuesta de Ron Savage se refiere a la construcción del software.Esta es puramente una excepción a nivel de aplicación, donde un fragmento de código puede indicar un error que puede ser detectado por otro fragmento de código.Aquí no hay ninguna participación de hardware en absoluto.

Luego está la excepción vista por una tarea.Esta es una construcción a nivel de sistema operativo que se utiliza para finalizar una tarea cuando hace algo ilegal, como dividir por 0, acceder ilegalmente a la memoria, etc.

Y en tercer lugar, está la excepción del hardware.En términos de comportamiento, es idéntico a una interrupción en el sentido de que el procesador saltará inmediatamente a alguna ubicación de memoria designada y comenzará a ejecutarse.Lo que diferencia una excepción de una interrupción es que una excepción es causada por alguna actividad ilegal que el procesador ha detectado.Por ejemplo, la MMU del procesador detectará accesos ilegales a la memoria y provocará una excepción.Estas excepciones de hardware son el desencadenante inicial para que el sistema operativo realice sus tareas de limpieza (como se describe en el párrafo anterior).

Las interrupciones son generadas por dispositivos externos a la CPU (tic del temporizador, finalización de la operación del disco, llegada de paquetes de red, etc.) y son asincrónico con la ejecución del programa.Las excepciones son sincrónico con la ejecución del programa (p. ej.división por cero, acceder a una dirección no válida).

A menos que su programa se esté ejecutando sin un sistema operativo (o esté desarrollando un sistema operativo), nunca verá una excepción/interrupción sin formato.Son capturados por el sistema operativo y manejados por él (interrupciones), o convertidos a alguna otra forma antes de reflejarse en el programa de usuario (por ejemplo,señales en UNIX, manejo estructurado de excepciones (SEH) en Windows) donde tiene posibilidades de manejarlo.

Las interrupciones indican que algo externo al núcleo del procesador requiere su atención.Interrumpe el flujo normal del programa, ejecuta una Rutina de Servicio de Interrupción (ISR) y generalmente regresa a donde estaba antes de que ocurriera la interrupción.

Hay muchas variaciones sobre este tema básico:Las interrupciones pueden ser generadas por software, otra tarea puede obtener la CPU después del ISR, etc.El punto clave es que las interrupciones pueden ocurrir en cualquier momento por una razón que el código/CPU haya sin control sobre.

Una excepción es un poco más complicada de definir porque tiene potencialmente tres niveles de significado:

Excepciones de hardware

Ciertos procesadores (PowerPC por ejemplo) definen excepciones para indicar que se ha producido algún tipo de condición inusual:Restablecimiento del sistema, dirección no válida, pérdida de caché de traducción de alguna dirección virtual, etc.

Estas excepciones también se utilizan para implementar puntos de interrupción y llamadas al sistema.En este caso, actúan casi como interrupciones.

Excepciones del sistema operativo

Algunas de las excepciones de hardware serán manejadas por el sistema operativo.Por ejemplo, su programa accede a una memoria no válida.Esto provocará una excepción de hardware.El sistema operativo tiene un controlador para esa excepción, y lo más probable es que el sistema operativo envíe un señal a su aplicación (SIGSEGV por ejemplo) indicando que hay un problema.

Si su programa tiene un controlador de señales instalado, el controlador de señales se ejecutará y, con suerte, solucionará la situación.Si no tiene un controlador de señales, el programa puede finalizarse o suspenderse.

Consideraría que los controladores de excepciones estructurados (SEH) de Windows son este tipo de excepciones.

Excepciones de software

Algunos lenguajes como Java, C++ y C# tienen el concepto de excepciones de software, donde el lenguaje permite el manejo de condiciones imprevistas o inusuales. relacionado con el funcionamiento del programa.En este caso, se genera una excepción en algún punto del código y algún código que se encuentra más arriba en la pila de ejecución del programa "captará" la excepción y se ejecutará.Esto es lo que hacen los bloques try/catch.

Voy a explicar qué es una interrupción porque hay un tipo crítico de interrupción con el que nadie se ha ocupado todavía:el cronómetro.

Pero primero déjame retroceder.Cuando recibe una interrupción, se ejecuta su controlador de interrupciones (que reside en el espacio del kernel), lo que normalmente desactiva las interrupciones, se ocupa de cualquier asunto pendiente (manejar el paquete que acaba de llegar a la red, procesar la pulsación de tecla, etc.) y luego (recuerde que Todavía estamos en el kernel en este punto) determina qué proceso se supone que se ejecutará a continuación (podría ser el mismo, podría ser uno diferente, depende del programador) y luego lo ejecuta.

Sólo se ejecuta un proceso en el procesador en un momento dado.Y cuando se utiliza un sistema operativo multitarea, la forma en que cambia entre ellos se llama cambio de contexto: básicamente, los registros del procesador se descargan en la memoria, el flujo pasa al nuevo proceso y, cuando el proceso finaliza, se cambia de contexto a algo. demás.

Entonces, digamos que escribo un programa C simple que cuenta todos los números, o la secuencia de Fibonacci, o algo más sin parar.O mejor:no hace nada más que girar dentro de un bucle while(1).¿Cómo tienen la oportunidad de ejecutarse los demás procesos del sistema?¿Qué pasa si no sucede nada que cause una interrupción?

La respuesta es que tienes un dispositivo temporizador que interrumpe constantemente.Y es lo que evita que un proceso giratorio destruya todo el sistema.Aunque señalaré que los manejadores de interrupciones desactivan las interrupciones, por lo que si haces algo que se bloquee indefinidamente, puedes acabar con todo el sistema.

Excepción

Una excepción es cuando el procesador ejecuta código que no se encuentra en su ruta normal.Esta es una "excepción" al funcionamiento normal, que es esencialmente un movimiento lineal a través de código y estructuras de control.Diferentes lenguajes admiten varios tipos de excepciones, que generalmente se usan para manejar errores durante la operación del programa.

Interrumpir

Una interrupción es una excepción a nivel de hardware (en general).La interrupción es una señal física en el procesador que le dice a la CPU que almacene su estado actual y salte al código del controlador de interrupción (o excepción).Una vez que finaliza el controlador, se restaura el estado original y el procesamiento puede continuar.

Una interrupción es siempre una excepción, incluso cuando así se pretende.Las interrupciones pueden indicar:

  • errores, como una infracción de acceso a la memoria
  • que el sistema operativo necesita realizar una operación para admitir un programa en ejecución, como una interrupción de software o una solicitud de paginación de memoria
  • un dispositivo de hardware requiere atención, como un paquete de red recibido o un búfer de transmisión vacío

Estos siempre obligan al procesador a pausar su actividad actual para lidiar con la excepción planteada, y solo se reanudan una vez que se completa el controlador de interrupciones.

Escollos

En términos de interrupciones, los errores más comunes son las condiciones de carrera.Por ejemplo, es posible que tenga una interrupción que incremente periódicamente un reloj global en tiempo real.El reloj puede ser de 64 bits en una máquina de 32 bits.

Si un programa está leyendo el reloj y obtiene la primera palabra de 32 bits, entonces se produce la interrupción; una vez que el controlador de interrupciones sale, el proceso obtiene la segunda palabra de 32 bits y los datos serán incoherentes; las dos palabras pueden no estar sincronizadas. .Si intenta utilizar un mutex o un semáforo para bloquear la variable en el proceso, entonces la interrupción se bloqueará esperando el bloqueo y detendrá el sistema (punto muerto), a menos que tanto el controlador como los procesos que utilizan los datos estén escritos con mucho cuidado.Es fácil meterse en problemas al escribir para interrupciones.

Las funciones de reentrada también son otro problema.Si está ejecutando funcA en el código del programa, realice una interrupción que también ejecute funcA; puede terminar con consecuencias no deseadas debido a variables compartidas (variables estáticas o de montón, clases, etc.).Por lo general, desea ejecutar la menor cantidad de código posible en el controlador de interrupciones y, con frecuencia, establecer un indicador para que el proceso pueda hacer el trabajo real más adelante, sin preocuparse por los conflictos.

En cierto modo, esto es similar al desarrollo para un multiprocesador y es una de las razones por las que muchos todavía consideran que la programación del kernel es magia negra.

-Adán

Se espera que las interrupciones se produzcan con regularidad (aunque a veces no lo son).ellos interrumpir la CPU porque acaba de suceder algo importante y es necesario solucionarlo de inmediato.

Se supone que las excepciones son excepciones a la regla;estos son lanzados por el software porque sucedió algo inesperado y esta es su oportunidad de intentar hacer algo al respecto, o al menos fallar con gracia.

Cuando se habla de interrupciones y excepciones, generalmente se habla cerca del código a nivel de hardware y las interrupciones y excepciones a menudo se implementan en parte mediante hardware y en parte mediante software.

Una interrupción es un evento en el hardware (o activado manualmente en el ensamblaje) que está asociado con un vector de controladores que se pueden usar para manejar el evento de la interrupción, ya sea finalización de IO, error de IO (falla de memoria del disco), evento de IO (movimiento del mouse). Por ejemplo).Las interrupciones pueden dar lugar a excepciones muchas veces cuando se produce alguna interrupción inesperada.

Una excepción es un comportamiento inesperado; la mayoría de las veces, cuando se utiliza el hardware, estos provienen de una interrupción y se manejan por separado en el software mediante un controlador de interrupciones.Los lenguajes de programación tal como los vemos casi siempre disfrazan esto como una estructura de control de algún tipo.

En general, una interrupción es una trampa de algún tipo implementada por hardware.Registra un controlador para una interrupción específica (división por 0, datos disponibles en un periférico, temporizador expirado) y cuando ocurre ese evento, todo el procesamiento en todo el sistema se detiene, procesa rápidamente la interrupción y todo continúa.Por lo general, se implementan en un controlador de dispositivo o en el kernel.

Una excepción es una forma implementada por software de manejar errores en el código.Usted configura un controlador para excepciones específicas (o generales).Cuando ocurre una excepción, el tiempo de ejecución del lenguaje comenzará a desenrollar la pila hasta que llegue a un controlador para ese controlador específico.En ese punto, puede manejar la excepción y continuar o salir del programa.

Manteniendo las cosas simples...

Cuando haya terminado de manejar una interrupción, (normalmente) volverá a lo que estaba haciendo antes de ser interrumpido.

Manejar una excepción implica desechar capas sucesivas de lo que está trabajando actualmente hasta llegar a un punto en el que la excepción pueda ser manejada (captada).

Mientras maneja una interrupción, puede decidir lanzar una excepción, pero eso no significa que deba considerar la interrupción en sí como una excepción.Las excepciones no "interrumpen" (ya que eso implicaría la posibilidad de volver a lo que estabas haciendo justo antes de ser interrumpido);más bien "abortan" (algún subconjunto de) su actividad actual.

Y, como ya se señaló varias veces, las interrupciones generalmente son activadas por entidades externas como hardware o usuarios (como un clic del mouse o una pulsación de tecla como CTRL-C), mientras que las excepciones son generadas (lanzadas) sincrónicamente por el software que detecta un "problema" o " condición excepcional".

Las interrupciones son básicamente impulsadas por hardware, como que su impresora indique que se ha quedado sin papel o que la tarjeta de red indique que ha perdido la conexión.

Una excepción es simplemente una condición de error en su programa, detectada por un bloque try/catch.Como:

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

Es una forma práctica de detectar "cualquier error" que ocurra en un bloque de código para poder manejarlo de manera similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top