domingo, 11 de septiembre de 2011

APIC

Como sabéis, ReactOS está aún en fase alfa, lo que implica que no está completo, y le faltan características. Una de ellas, que no es muy visible para el usuario normal, pero que sí es muy importante, es el soporte APIC.

¿Qué narices es eso del APIC? Para resolver esta pregunta, nadie mejor que el desarrollador que lo está trayendo a ReactOS. Hemos podido hablar con Timo Kreuzer (tkreuzer) sobre el tema, para que nos ayude a comprender mejor el funcionamiento de este elemento del sistema.

Advanced Programmable Interrupt Controller

"Controlador Programable de Interrupciones Avanzado", en su traducción al castellano. Las interrupciones son señales que pueden ser enviadas por software, o por los dispositivos, cuando requieren ejecutar operaciones de E/S. Para controlar estas señales, los equipos con arquitectura x86 implementaron originalmente un chip, llamado PIC ("Programmable Interrupt controller", o Controlador Programable de Interrupciones ).

Con la introducción de los sistemas multiprocesador, se añade una nueva gama de interrupciones al sistema: aquellas que van de un procesador a otro. Son las interrupciones IPI ("inter processor interrupt"). Así que se añadieron nuevos chips para manejar esta información: los chips APIC.

¿Dos chips? En realidad el sistema APIC siempre se cuenta como una sola entidad. O se habilita, o no se habilita. Pero Este sistema consta de dos elementos:

  1. APIC local. Este chip no es visible en ninguna parte del sistema, porque va integrado dentro de la CPU. Es responsable del manejo de interrupciones dentro del procesador, y el envío de las mismas a otras CPUs en caso necesario.
  2. IOAPIC (o "I/O APIC"). Es un chip dedicado en la placa base, que puede ser programado para recibir interrupciones del hardware de la máquina y enviarlos al chip APIC local de cada CPU, o incluso a una CPU dedicada.
Como hemos dicho anteriormente, APIC es un subsistema requerido en entornos multiprocesador, dado que se necesita de un sistema que interconecte los procesadores, y que maneje las interrupciones entre ellos. Esto también incluye a los nuevos procesadores multinúcleo, ya que emulan varias CPUs en el sistema. También es requerido en la arquitectura x64. La especificación de dicha arquitectura requiere de la presencia del controlador APIC. No ocurre lo mismo en la arquitectura x86. En este caso, el soporte APIC es opcional (a menos que se haga uso de varias CPUs).

La contrapartida más importante la tenemos cuando se usan máquinas virtuales. Hay que tener presente que la máquina virtual convierte las señales que ejecuta el equipo huésped a aquellas que el anfitrión puede manejar, y viceversa. Esto de por sí ya supone una gran carga de trabajo. Pero si además a ello le unimos las interrupciones APIC, que son muy numerosas, tenemos como resultado una gran ralentización del sistema. ¿es esto un fallo del huésped, o del anfitrión? No, no significa que sea un bug. Sencillamente, muestra el gran número de interrupciones que el sistema realiza en cada ejecución.