una tratamiento sistemas sistema servicio rutina que operativos operativa manejo llamada interrupción interrupciones interrupcion excepciones ejemplos exception terminology interrupt

exception - tratamiento - rutina de servicio de interrupción



Interrupciones y excepciones (11)

Excepción

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

Interrumpir

Una interrupción es una excepción en el nivel de hardware (generalmente). 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 manipulador, se restaura el estado original y el procesamiento puede continuar.

Una interrupción es siempre una excepción, incluso cuando fue intencionada. Las interrupciones pueden indicar:

  • errores, como una violació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 búsqueda de memoria
  • un dispositivo de hardware requiere atención, como un paquete de red recibido, o un buffer de transmisión vacío

Estos siempre obligan al procesador a pausar su actividad actual para hacer frente a la excepción planteada, solo reanudar una vez que se completa el controlador de interrupción.

Trampas

En términos de interrupciones, las trampas comunes son las condiciones de carrera. Por ejemplo, puede tener una interrupción que periódicamente incremente un reloj global en tiempo real. El reloj podría ser de 64 bits en una máquina de 32 bits.

Si un programa está leyendo el reloj y recibe la primera palabra de 32 bits, entonces ocurre la interrupción, una vez que el manejador de interrupciones sale, el proceso obtiene la segunda palabra de 32 bits, y los datos serán incoherentes; es posible que las dos palabras no estén sincronizadas. . Si intenta utilizar un mutex o semáforo para bloquear la variable en el proceso, la interrupción se bloqueará esperando el bloqueo y detendrá el sistema (interbloqueo), a menos que tanto el controlador como los procesos que usan 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, tome una interrupción que también ejecute funcA, puede terminar con consecuencias no deseadas debido a variables compartidas (variables estáticas o de pila, clases, etc.). Por lo general, desea ejecutar el menor código posible en el manejador 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.

De alguna manera, esto es similar al desarrollo de un multiprocesador, y es una de las razones por las cuales la programación del núcleo todavía se considera magia negra por muchos.

-Adán

He visto varias preguntas aquí sobre excepciones , y algunas de ellas sugieren interrupciones como excepciones , pero ninguna hace que la conexión sea clara.

  • ¿Qué es una interrupción?

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

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

-Adán


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

Una interrupción es un evento en hardware (o disparado manualmente en ensamble) que está asociado con un vector de manejadores que pueden usarse para manejar el evento de interrupción, ya sea IO Completion, IO Error (Disk Memory Failure), IO Event (Mouse Move por ejemplo). Las interrupciones pueden dar lugar a excepciones a menudo cuando se produce una interrupción inesperada.

Una excepción es un comportamiento inesperado, la mayoría de las veces cuando se usa el hardware, estos provienen de una interrupción y se manejan por separado en el software usando un manejador 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 implementada por hardware de algún tipo. Registra un controlador para una interrupción específica (división por 0, datos disponibles en un periférico, temporizador caducado) y cuando ocurre ese evento, se detiene todo el procesamiento de todo el sistema, procesa rápidamente la interrupción y las cosas continúan. Estos generalmente se implementan en un controlador de dispositivo o kernel.

Una excepción es una forma implementada por software de manejar errores en el código. Configura un controlador para excepciones específicas (o generales). Cuando se produce una excepción, el tiempo de ejecución de los lenguajes comenzará a desenrollar la pila hasta que llegue a un controlador para ese controlador específico. En ese momento, puede manejar la excepción y continuar, o salir de su programa.


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 en este tema básico: el software puede generar interrupciones, 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 no tiene control sobre .

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

Excepciones de hardware

Ciertos procesadores (por ejemplo, PowerPC) definen excepciones para indicar que se ha producido algún tipo de condición inusual: Restablecimiento del sistema, Dirección inválida, falta de caché de traducción de direcciones virtuales, etc.

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

Excepciones de SO

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

Si su programa tiene instalado un manejador de señal, el manejador de señal se ejecutará y, con suerte, manejará la situación. Si no tiene un manejador de señal, el programa puede finalizar o suspenderse.

Consideraría que los manejadores de excepción estructurados (SEH) de window 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 proporciona el manejo de condiciones imprevistas o inusuales relacionadas 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 más arriba en la pila de ejecución del programa "atrapará" la excepción y se ejecutará. Esto es lo que hacen los bloques try / catch.


Las interrupciones son generadas por dispositivos externos a la CPU (tic del temporizador, finalización de la operación del disco, llegada del paquete de red, etc.) y son asíncronos con la ejecución del programa. Las excepciones son sincrónicas con la ejecución del programa (por ejemplo, división por cero, acceso 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 SO y manejados por él (interrupciones), o convertidos a alguna otra forma antes de ser reflejados nuevamente al programa de usuario (por ejemplo, señales en UNIX, manejo estructurado de excepciones (SEH) en Windows) donde tiene la posibilidad de manejar eso.


Manteniendo las cosas simples ...

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

Manejar una excepción implica tirar capas sucesivas de aquello en lo que está trabajando actualmente hasta que burbujea hasta un punto donde la excepción se puede manejar (atrapar).

Al manejar una interrupción, puede decidir lanzar una excepción, pero eso no significa que tenga que considerar la interrupción como una excepción. Las excepciones no "interrumpen" (ya que eso implicaría la posibilidad de regresar a lo que estaba haciendo justo antes de que lo interrumpieran); más bien "abortan" (un subconjunto de) tu actividad actual.

Y, como ya se señaló varias veces, las interrupciones generalmente son desencadenadas por entidades externas como hardware o usuarios (como un clic de mouse o una pulsación de tecla como CTRL-C) mientras que las excepciones se generan (lanzan) de forma síncrona detectando un "problema" o software condición excepcional ".


Se espera que las interrupciones ocurran regularmente (aunque a veces no son regulares). Interrumpen la CPU porque algo importante simplemente sucedió y debe atenderse 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 chocar con gracia.


Su procesador va a tener una cantidad de pines de interrupción externos. Normalmente, estos pines están conectados a hardware y se utilizan para indicar cuándo se produce algún evento externo. Por ejemplo, si está utilizando un puerto en serie, UART levantará un pin que está conectado a uno de los pines de interrupción en el procesador para indicar que se ha recibido un byte.

Otros periféricos como temporizadores, controladores usb, etc. también generarán interrupciones en función de algún evento externo.

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

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

La respuesta de Ron Savage se refiere a la construcción del software. Esto es puramente una excepción de nivel de aplicación, donde un fragmento de código puede indicar un error que puede detectarse mediante algún otro código. No hay participación de hardware aquí en absoluto.

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

Y en tercer lugar, está la excepción de 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 nominada y comenzará a ejecutarse. Donde una excepción difiere de una interrupción es que una excepción es causada por alguna actividad ilegal que el procesador ha detectado. Por ejemplo, la MMU en el procesador detectará accesos ilegales a la memoria y provocará una excepción. Estas excepciones de hardware son el disparador inicial para que el sistema operativo realice sus tareas de limpieza (como se describe en el párrafo anterior).


Una interrupción es una señal de CPU generada por hardware o instrucciones específicas de la CPU. Esto hace que los manejadores de interupt se ejecuten. Cosas como las señales de E / S del hardware de E / S generan interferencias.

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

No estoy seguro de los detalles exactos, pero una excepción podría ser implementada por un interupp.


Voy a detallar qué es una interrupción porque hay un tipo crítico de interrupción que nadie ha tratado todavía: el temporizador.

Pero primero, déjame retroceder. Cuando recibe una interrupción, se ejecuta el controlador de interrupciones (que vive en el kernel), que normalmente desactiva las interrupciones, se ocupa de cualquier asunto pendiente (maneja el paquete que acaba de llegar a la red, procesa la pulsación de tecla, etc.) y luego (recuerde Todavía está en el kernel en este punto) se da cuenta de qué proceso se supone que se ejecutará a continuación (podría ser el mismo, podría ser uno diferente, depende del planificador) y luego ejecutarlo.

Solo se ejecuta un proceso en el procesador en un momento dado. Y cuando está utilizando un sistema operativo multitarea, la forma en que cambia entre ellos se llama un cambio de contexto: básicamente los registros del procesador se vuelcan en la memoria, el flujo pasa al nuevo proceso y cuando el proceso se realiza, el contexto cambia a algo más.

Entonces, digamos que escribo un simple programa de C que cuenta todos los números, o la secuencia de Fibonacci, o cualquier otra cosa sin parar. O incluso mejor: no hace más que girar dentro de un ciclo while (1). ¿Cómo se ejecutan los otros procesos en el sistema? ¿Qué pasa si no ocurre nada que cause una interrupción?

La respuesta es que tienes un dispositivo de temporizador que constantemente está interrumpiendo. Y es lo que impide que un proceso de rotación derribe todo el sistema. Aunque señalaré que los controladores de interrupción desactivan las interrupciones, por lo que si haces algo que bloquea indefinidamente, puedes eliminar todo el sistema.


Imperaturas son básicamente controladas por hardware, como su impresora que indica que está "sin papel" o la tarjeta de red que indica 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. Me gusta:

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 que pueda manejarlos de manera similar.