viernes, 26 de diciembre de 2008

Administración de sistemas con multiprocesamiento

La IA-32 y la Intel 64 proporcionan mecanismos para administrar y mejorar el rendimiento de múltiples procesadores conectados al mismo bus del sistema. Esto incluyen buses de cierre y/o administración de coherencia de caches para realizar operaciones atómicas en el sistema de memoria, instrucciones de serialización, un controlador avanzado de interrupciones programable, un cache de segundo nivel, un cache de tercer nivel, y la tecnología Hyper-Threading de Intel. Estos mecanismos son particularmente útiles en sistemas de multiprocesamiento simétrico (SMP). Sin embargo, también se pueden usar cuando un procesador Intel 64 o IA-32 y un procesador de propósito especial, comparten el bus del sistema. Los mecanismos de multiprocesamiento tienen las siguientes caracteristicas: guardan la coherencia de memoria del sistema, guardan la consistencia de la cache, permiten mantener un orden predecible de las escrituras a memoria, distribuyen la administración de interrupciones a lo largo de un grupo de procesadores, e incrementan el rendimiento del sistema explotando la naturaleza de multiprocesado y de multi-thread de los sistemas operativos y aplicaciones actuales.
Los procesadores de la IA-32 de 32 bits soportan operaciones atómicas que están en localizaciones en la memoria del sistema. Esas operaciones se usan típicamente para manejar estructuras de datos compartidas en las cuales dos o más procesadores pueden intentar modificar el mismo campo o la misma bandera a la vez. El procesador usa tres mecanismos independientes para llevar a cabo operaciones atómicas encerradas en memoria: Garantiza operaciones atómicas, encierra el bus, y utiliza protocolos de coherencia de cache para asegurar que las operaciones atómicas se pueden llevar a cabo en estructuras de datos en caches. Estos tres mecanismos son interdependientes.
El acto de que un procesador escriba datos en el segmento de código ejecutable actual con la intención de ejecutar esos datos como si fuera código se llama código automodificable. Los procesadores IA-32 muestran un comportamiento diferente dependiendo del modelo específico cuando ejecutan código de este tipo. El acto de que un procesador escriba datos en un segmento de código ejecutable de un segundo procesador con la intención de que los ejecute como si fuera código, se llama código modificable cruzado. Al igual que antes, el comportamiento de los IA-32 depende del modelo específico.
El término de ordenación de memoria se refiere al orden en el cual el procesador lee y escribe a través del bus del sistemaa la memoria del sistema. La IA-32 y la Intel 64 soportan múltiples modelos de ordenación de memoria dependiendo de la implementación de la arquitectura. Para optimizar el rendimiento de las ejecuciones de instrucciones, la IA-32 proporciona departamentos desde un modelo de ordenación sólido llamado ordenación de procesador en el Pentium 4, Intel Xeon, y la familia P6. Estas variantes permiten aumentar el rendimiento de operaciones. El objetivo de cualquiera de estas variantes es aumentar la velocidad de ejecución de instrucciones, manteniendo la coherencia de la memoria a pesar de sistemas com multiprocesamiento. Los procesadores Intel Core 2 Duo, Intel Core, Pentium 4, y la familia P6 modifican las operaciones del procesador durante las operaciones de reserva de strings para maximizar el rendimiento. La IA-32 y la Intel 64 proporcionan mecanismos para fortalecer o para activar el modelo de ordenación de la memoria para administrar situaciones especiales de programación. Estos mecanismos incluyen:
- Las instrucciones de E/S, las de encerramiento, los prefijos LOCK, y las instrucciones de serialización fuerzan un ordenamiento más fuerte en el procesador.
- La instrucción SFENCE, LFENCE y MFENCE proporcionan ordenación de memoria y capacidades de serialización para tipos específicos de operaciones en memoria.
- El rango de registros de tipos de memoria (MTRRs) se puede usar para fortalecer o para activar la ordenación de memoria para un área específica de memoria física. Sólo para Pentium 4, Intel Xeon y la familia P6.
- La tabla de atributos de páginas (PAT) se puede usar también para fortalecer la ordenación en memoria ordenando una página específica o un grupo de ellas.
En un sistema multiprocesador, cuando uno de los procesadores cambia una tabla de páginas o una entrada del directorio de páginas, los cambios tienen que ser propagados a todos los otros procesadores. A esto se le llama 'TLB shootdown'. La propagación de cambios a una tabla o a una entrada se puede hacer usando semáforos basados en memoria y/o interrupciones entre los procesadores (IPI). El sistema operativo está preparado para ocuparse si los procesadores usan el mapeado pasado durante el proceso de actualización.
La IA-32 y la Intel 64 definen instrucciones de serialización. Estas fuerzan al procesador a completar todas las modificaciones en las banderas, en los registros, y en la memoria por las instrucciones previas y para vaciar todas las escrituras a memoria de todos los bufferes antes de que la siguiente instrucción se ejecute. El concepto de instrucción de serialización se introdujo en el IA-32 con el Pentium para soportar ejecución de instrucciones en paralelo. Este tipo de instrucciones no tienen ningún significado para procesadores que no ejecuten instrucciones en paralelo. Cuando el procesador serializa la ejecución de instrucciones, se asegura de que todas las transacciones de memoria pendientes se completan (incluídas las que usan el buffer) antes de que se ejecute la siguiente instrucción.
Comenzando con la familia P6, la IA-32 define el protocolo de inicialización del multiprocesamiento (a partir de ahora multiprocesamiento = MP) como "Especificaciones para multiprocesadores versión 1.4", que define el protocolo de inicialización para sistemas multiprocesador con arquitectura IA-32. Este protocolo tiene las siguientes características:
- Soporta inicialización controlada de múltiples procesadores sin requerir hardware dedicado.
- Proporciona hardware para inicializar la carga del sistema sin la necesidad de una señal dedicada o una carga predefinida del procesador.
- Proporciona la misma manera de carga para todos los procesadores IA-32.
- También se aplica a sistemas Intel 64.
Los mecanismos para llevar a cabo el protocolo de inicialización de multiprocesamiento difieren dependiendo de la familia dentro de la IA-32. El protocolo define dos clases de procesadores: los procesadores autosuficientes (BSP) y los procesadores de aplicación (AP). Después del encendido o del reseteado de un sistema MP, el sistema hardware selecciona dinámicamente uno de lo procesadores en el bus del sistema (este es el BSP). Los AP son el resto de procesadores. Para los procesadores con soporte para Intel Hyper-Threading Technology, el protocolo de inicialización MP trata cada uno de los procesadores lógicos en el bus del sistema o al dominio coherente de links como un procesador separado. Durante la carga, se selecciona uno de los procesadores lógicos que actúa como BSD y los demás como APs. Después de que la BIOS haya completado el protocolo de inicialización MP, cada procesador lógico puede ser identificado por si APIC ID local. El software puede acceder a esas APIC IDs de cualquiera de estas formas: leyendo APIC ID para una APIC local, leyendo un ACPI o una tabla de MP, leyendo un APIC ID inicial, o leyendo un APIC ID de 32 bits desde el CPUID.
La tecnología Intel Hyper-Threading y la Intel multi-core son extensiones para la IA-32 y la Intel 64 que permiten a un procesador físico único, ejecutar una o más flujos de código (llamados threads) a la vez. En la primera tecnología, un sólo núcleo de procesador proporciona dos procesadores lógicos que comparten recursos de ejecución. En la tecnología multi-core, un procesador físico contiene dos o más núcleos de procesador. Ambas configuraciones requieren chipset y BIOS que soporten estas tecnologías. El software no necesita contar con el nombre del procesador para determinar si soporta alguna de ellas; usa CPUID.
Las siguientes características son parte del estado de la arquitectura de los procesadores lógicos dentro de los IA-32 y los Intel 64 que soporten la tecnología Intel Hyper-Threading. Se pueden subdividir en tres grupos: Duplicado de cada procesador lógico, compartir entre procesadores lógicos un procesador físico, y compartir o duplicar dependiendo de la implementación. Cuando un procesador que soporta la tecnología Intel Hyper-Threading se inicializa, a cada procesador lógico se le asigna una APIC ID local. La APIC ID sirve como un ID para el procesador lógico y se guarda en el registro APIC ID del procesador lógico. El software se comunica con el procesador lógico usando la facilidad de mensajería de interrupciones entre los APICs de los procesadores. Se implementan facilidades específicas en los IA-21 que soportan la tecnología Intel Hyper-Threading como caches, translation lookaside buffers (TLBs) y facilidades de monitoreo térmico.
En general cada núcleo de procesador tiene unas características de su microarquitectura idénticas a una implementación en un procesador único de una microarquitectura subyacente sin capacidad de hardware multi-threading. Cada procesador lógico en un procesador con doble núcleo tiene sus propias funcionalidades APIC , PAT, comprobaciones de arquitectura de máquina, depuración de registros y extensiones. Cada procesador lógico administra instrucciones de serialización o código automodificable por sí mismo. El orden de memoria está mantenido de la misma forma que en la tecnología Intel Hyper-Threading. Los registros de rangos de tipos de memoria (MTRR) se comparten entre dos procesadores lógicos compartiendo un núcleo de procesador si el procesador físico soporta tecnología Intel Hyper-Threading. Los MTRR no se comparten entre procesadores lógicos localizados en diferentes núcleos. La IA-32 y la Intel 64 requieren que todos los procesadores lógicos en un sistema MP usen un mapa de memoria MTRR idéntico. Esto le da al software una vista consistente de la memoria, independientemente del procesador. Los contadores de rendimiento y los MSRs de control se comparten entre dos procesadores lógicos compartiendo un núcleo de procesador si el núcleo soporta la tecnología Intel Hyper-Threading y está basado en la microarquitectura Intel NetBurst. No se comparten entre procesadores lógicos en núcleos diferentes. Como resultado, el software tiene que administrar el uso de estos recursos basados en la topología de los recursos de monitoreo del rendimiento. Algunos campos en el MSR IA32_MISC_ENABLE se pueden compartir entre dos procesadores lógicos que comparten el mismo núcleo, o también entre núcleos diferentes de un procesador físico. Las facilidades de actualización del microcódigo se comparten entre dos procesadores lógicos que comparten un núcleo si el sistema soporta Intel Hyper-Threading. No se comparte entre procesadores lógicos si están en diferentes núcleos o en diferentes unidades físicas. Cada procesador lógico con acceso a las facilidades de actualización de microcódigo puede iniciar una actualizacióno.
En un entorno de multi-threading, puede haber ciertos recursos hardware que son físicamente compartidos en algún nivel de la topología de hardware. En sistemas MP, los buses típicos y la memoria de los subsistemas son compartidas físicamente entre múltiples sockets. Dentro de los procesadores con hardware que soporte multi-threading, se proporcionan ciertos recursos para cada núcleo, mientras otros recursos se proporcionan a cada procesador lógico.
Para detectar el número de unidades físicas, núcleos de procesador, y otras relaciones topológicas en un sistema MP, se recomiendan estos procedimientos:
- Extraer los identificadores de tercer nivel del APIC ID de cada procesador lógico permitido por el software del sistema.
- Montar los identificadores de tercer nivel de SMT_ID, CORE_ID, PACKAGE_ID en arrays para cada procesador lógico permitido.
- Para detectar el número de unidades físicas: usar PACKAGE_ID para identificar los procesadores lógicos que residen en la misma unidad física.
- Para detectar el número de núcleos: usar CORE_ID para identificar los procesadores lógicos que residen en el mismo núcleo.
Cuando un procesador lógico en un sistema MP está inactivo (sin tareas que hacer) o bloqueado, la administración adicional de los recursos de ejecución de núcleos puede ser lograda usando las instrucciones HLT, PAUSE, o MONITOR/MWAIT.
La instrucción HLT para la ejecución del procesador lógico que la ejecuta y lo establece en estado inactivo hasta nuevas noticias. Cuando un procesador lógico se para, los procesadores lógicos activos continúan teniendo acceso total a los recursos compartidos en la unidad física. Entonces los recursos compartidos usados por el procesador lógico inactivo se ponen disponibles para los procesadores lógicos activos, permitiéndoles ejecutarlos con una mayor eficiencia. Cuando el procesador lógico inactivo retoma la ejecución, los recursos compartidos se vuelven a compartir entre todos los procesadores lógicos. La instrucción PAUSE puede aumentar el rendimiento de procesadores que soportan la tecnología Intel Hyper-Threading cuando ejecutan bucles 'spin-wait' y otras rutinas donde un flujo accede a un bloqueo compartido o semáforo en un bucle limitado. Cuando se ejecuta un bucle 'spin-wait', el procesador puede sufrir una penalización grave de rendimiento cuando sale del bucle porque detecta un posible fallo en el orden de la memoria y vuelca el pipeline del núcleo del procesador. La instrucción PAUSE proporciona una pista al procesador que la secuencia del código es un bucle 'spin-wait'. El procesador usa esto para esquivar el fallo de orden de memoria y previene el vuelco del pipeline.

No hay comentarios: