Las interrupciones son señales que se envían a través de IRQ (línea de solicitud de interrupción) por un hardware o software.
Las interrupciones permiten que dispositivos como teclados, tarjetas seriales y puertos paralelos indiquen que necesitan atención de la CPU.
Una vez que la CPU recibe la solicitud de interrupción, la CPU detendrá temporalmente la ejecución del programa en ejecución e invocará un programa especial llamado Interrupt Handler o ISR (rutina de servicio de interrupción).
Se puede encontrar el servicio de interrupción o la rutina del controlador de interrupción en la tabla de vectores de interrupción que se encuentra en una dirección fija en la memoria. Después de que se maneja la interrupción, la CPU reanuda el programa interrumpido.
En el momento del arranque, el sistema identifica todos los dispositivos y los controladores de interrupciones apropiados se cargan en la tabla de interrupciones.
Las siguientes son dos formas de solicitar la atención de la CPU:
- Basado en interrupciones
- Basado en encuestas
Todos los sistemas operativos basados en Linux están controlados por interrupciones.
Cuando presionamos una tecla en el teclado, los teclados le dicen a la CPU que se ha presionado una tecla. Pero la CPU puede estar ocupada procesando algunas cosas de la RAM, el reloj del sistema, la tarjeta NIC, puede ser un bus de video o PCI. En ese caso, Keyboard coloca un voltaje en la línea IRQ asignada a ese hardware, aquí en este caso [Keyboard]. Este cambio de voltaje sirve como una solicitud del dispositivo que indica que el dispositivo tiene una solicitud que necesita procesamiento.
/proc/archivo de interrupciones
En una máquina Linux, el archivo /proc/interrupts contiene información sobre las interrupciones en uso y cuántas veces se ha interrumpido el procesador
# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 3710374484 0 0 0 IO-APIC-edge timer 1: 20 0 0 0 IO-APIC-edge i8042 6: 5 0 0 0 IO-APIC-edge floppy 7: 0 0 0 0 IO-APIC-edge parport0 8: 0 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 240 0 0 0 IO-APIC-edge i8042 14: 11200026 0 0 0 IO-APIC-edge ide0 51: 61281329 0 0 0 IO-APIC-level ioc0 59: 1 0 0 0 IO-APIC-level vmci 67: 19386473 0 0 0 IO-APIC-level eth0 75: 94595340 0 0 0 IO-APIC-level eth1 NMI: 0 0 0 0 LOC: 3737150067 3737142382 3737145101 3737144204 ERR: 0 MIS: 0
En el archivo anterior:
- La primera columna es el número de IRQ.
- La segunda columna indica cuántas veces se ha interrumpido el núcleo de la CPU. En el ejemplo anterior, el temporizador es el nombre de la interrupción [Reloj del sistema] y 3710374484 es la cantidad de veces que se ha interrumpido la CPU0. I8042 es un controlador de teclado que controla teclados y ratones PS/2 en PC.
- Para interrupciones como rtc [reloj en tiempo real], la CPU no ha sido interrumpida. RTC están presentes en los dispositivos electrónicos para realizar un seguimiento del tiempo.
- NMI y LOC son controladores utilizados en el sistema que no son accesibles/configurados por el usuario.
El número de IRQ determina la prioridad de la interrupción que debe manejar la CPU.
Un valor de número de IRQ pequeño significa mayor prioridad.
Por ejemplo, si la CPU recibe una interrupción del teclado y el reloj del sistema simultáneamente. La CPU atenderá el reloj del sistema primero ya que tiene el número 0 de IRQ.
- IRQ 0:temporizador del sistema (no se puede cambiar);
- IRQ 1:controlador de teclado (no se puede cambiar)
- IRQ 3:controlador de puerto serie para el puerto serie 2 (compartido con el puerto serie 4, si está presente);
- IRQ 4:controlador de puerto serie para el puerto serie 1 (compartido con el puerto serie 3, si está presente);
- IRQ 5:puerto paralelo 2 y 3 o tarjeta de sonido;
- IRQ 6:controlador de disquete;
- IRQ 7:puerto paralelo 1. Se utiliza para impresoras o para cualquier puerto paralelo si no hay una impresora presente.
Para dispositivos como joystick, la CPU no espera a que el dispositivo envíe una interrupción. Dado que el Joystick se usa para juegos y el movimiento del joystick será rápido, será ideal usar el sondeo y verificar si el dispositivo necesita atención. La desventaja detrás de este método es que la CPU puede entrar en espera ocupada, verificando el dispositivo muchas veces.
En una nota relacionada, también es esencial manejar las señales correctamente en Linux.
Interrupciones de hardware
Todos los escenarios discutidos anteriormente son ejemplos de interrupciones de hardware.
Las interrupciones de hardware se clasifican además en dos categorías principales:
- Interrupciones no enmascarables [NMI]:como su nombre indica, la CPU no puede ignorar ni suprimir este tipo de interrupciones. Los MNI se envían a través de una línea de interrupción separada y generalmente se usan para errores críticos de hardware como errores de memoria, trampas de hardware que indican fallas en el ventilador, fallas en el sensor de temperatura, etc.
- Interrupciones enmascarables:estas interrupciones pueden ser ignoradas o retrasadas por la CPU. El registro de máscara de interrupción enmascara las interrupciones que se activan en los pines externos del controlador de caché. Al establecer un bit escribiendo un 0, se desactiva la activación de la interrupción en el pin
Interrupciones de software
Estas interrupciones se generan cuando la CPU ejecuta una instrucción que puede causar una condición de excepción en la propia CPU [unidad ALU].
Por ejemplo, dividir un número por cero que no es posible, conducirá a una excepción de división por cero, lo que hará que la computadora abandone el cálculo o muestre un mensaje de error.
El archivo /proc/stat también forma parte del sistema de archivos /proc, que tiene información sobre las estadísticas del kernel del sistema y también contiene información sobre interrupciones.
# cat /proc/stat cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0 cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0 cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0 cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0 cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0 intr 417756956 --- Output Truncated
La línea intr muestra el recuento de interrupciones atendidas desde el momento del arranque. La primera columna es el total de todas las interrupciones atendidas. Cada columna subsiguiente es el total de una interrupción en particular.
SMP_AFFINITY
El multiprocesamiento simétrico es el procesamiento de programas por múltiples procesadores.
El archivo smp_affinity contiene el valor de afinidad de interrupción para un número de IRQ. El archivo smp_affinity asociado con cada número de IRQ se almacena en el archivo /proc/irq/IRQ_NUMBER/smp_affinity. El valor en el archivo se almacena en máscara de bits hexadecimal que representa todos los núcleos de CPU en el sistema. smp_affinity funciona para dispositivos que tienen controladores de dispositivo habilitados para IO-APIC.
Por ejemplo, la entrada smp_affinity para el controlador Ethernet se muestra a continuación:
grep eth0 /proc/interrupts 67: 23834931 0 0 0 IO-APIC-level eth0
El número de IRQ para eth0 es 67 y el archivo smp_affinity correspondiente se encuentra en:
cat /proc/irq/67/smp_affinity 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
El equivalente decimal para el valor '000000001' es '1'. es decir, todas las interrupciones relacionadas con el controlador de Ethernet serán atendidas por la CPU0.
Podemos cambiar manualmente la afinidad del procesador cambiando los valores en el archivo smp_affinity para un controlador en particular o usando irqbalance.
Saldo de IRQ
Irqbalance es una utilidad de Linux que distribuye interrupciones en los núcleos del procesador en su sistema informático, lo que ayuda a mejorar el rendimiento.
El objetivo de Irqbalance es encontrar un equilibrio entre el ahorro de energía y un rendimiento óptimo.
Si irqbalance no está instalado en su sistema, instálelo usando yum como se muestra a continuación.
# rpm -qa | grep irqbalance irqbalance-0.55-15.el5 # yum search irqbalance # yum install irqbalance.x86_64
Inicie el servicio irqbalance:
service irqbalance start
El siguiente es un resultado de muestra de una máquina Linux donde está instalado irqbalance. Pudimos ver que las interrupciones ahora se distribuyen entre las CPU.
# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 950901695 0 0 0 IO-APIC-edge timer 1: 13 0 0 0 IO-APIC-edge i8042 6: 96 10989 470 0 IO-APIC-edge floppy 7: 0 0 0 0 IO-APIC-edge parport0 8: 1 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 109 1787 0 0 IO-APIC-edge i8042 15: 99 84813914 0 0 IO-APIC-edge ide1 51: 17371 0 46689970 0 IO-APIC-level ioc0 67: 1741 0 0 225409160 PCI-MSI eth0 83: 0 0 0 0 PCI-MSI vmci NMI: 0 0 0 0 LOC: 950902917 950903742 950901202 950901400 ERR: 0 MIS: 0
Irqbalance es especialmente útil en sistemas con procesadores multinúcleo, ya que las interrupciones generalmente solo serán atendidas por el primer núcleo.