FACULTAD DE CIENCIAS FISICAS Y MATEMATICAS INGENIERIA CIVIL EN COMPUTACION E INFORMATICA SISTEMAS OPERATIVOS Sistemas Paralelos Non Uniform Memory Access (NUMA) Grupo 5 Profesor: Daniel Hormazábal Curso: Sistemas Operativos Integrantes Felipe Calderón Leonardo Pérez Fernando Valdés INDICE 1. Resumen Ejecutivo 3 2. Historia 4 3. Características 7 3.1. ¿Qué es un multiprocesador? 3.2. Tipo de acceso a los datos (UMA – NUMA) 3.3. Sistemas Operativos en multiprocesadores 3.4. Transporte de SO monoprocesador: UNIX 3.5. Diseño de sistemas operativos para multiprocesadores 3.6. Afinidad al procesador 4. Programación Paralela 4.1 Introducción 4.2 Estructura del lenguaje 7 8 10 11 11 12 13 13 13 2 1. RESUMEN EJECUTIVO En el presente informe detallaremos parte de la historia y evolución que han sufrido los Sistemas Operativos en paralelo y sus principales características que hablan de un mejor desempeño de los actuales Sistemas. Los sistemas operativos paralelos se refieren sobre todo a manejar los recursos de máquinas paralelas. Describiremos las tendencias principales en Sistemas Operativos paralelos. Hablaremos de las versiones actuales del Unix y de Windows NT donde un solo sistema operativo centralmente maneja todos los recursos. El trabajo con la memoria en un Sistema Operativo en paralelo es de vital importancia y por lo mismo destacaremos la utilidad de la NUMA (NonUniform Memory Access) y sus características. 3 1. HISTORIA 1955 IBM introduce los 704. El arquitecto principal es gene Amdahl; es la primera máquina comercial con hardware floating-point, y es capaz del kFLOPS aproximadamente 5. 1956 IBM comienza el proyecto 7030 (conocido como ESTIRAMIENTO) para producir el superordenador para el laboratorio nacional de Los Alamos (LANL). Su meta es producir una máquina con 100 veces el funcionamiento de disponible en ese entonces. El proyecto de LARC (computadora automática de la investigación de Livermore) comienza a diseñar el superordenador para el laboratorio nacional de Lorenzo Livermore (LLNL). El proyecto del atlas comienza en el Reino Unido como empresa a riesgo compartido entre la universidad de Manchester y Ferranti Ltd. El arquitecto principal es Tom Kilburn. 1962 La CDC entrega primera CDC 1604. La máquina es similar a IBM 7090, ofreciendo 48 palabras del pedacito y una duración de ciclo de memoria de 6 microsec. La computadora del atlas llega a ser operacional. Es la primera máquina para utilizar memoria virtual y la paginación; se canaliza su ejecución de la instrucción, y contiene las unidades aritméticas fijas y floating-point separadas, capaces del kFLOPS aproximadamente 200. C. A. Petri describe las redes de Petri, un marco teórico para describir y analizar las características de sistemas concurrentes. Burroughs introduce el multiprocesador simétrico de D825 MIMD. 1 a 4 CPU tienen acceso a 1 a 16 módulos de la memoria usando un interruptor de barra transversal. Las CPU son similares al B5000 más último; el sistema operativo es simétrico, con una fila de procesos preparados compartida. 1965 Los laboratorios de GE, del MIT, y de AT&T Bell comienzan el trabajo sobre Multics. La puntería del proyecto es desarrollar un sistema en tiempo repartido del multiprocessing de uso general de la compartir-memoria. Edsger Dijkstra describe y nombra el problema crítico de las regiones. El trabajo en sistemas concurrentes se dedica mucho más adelante a encontrar maneras seguras, eficientes de manejar regiones críticas. 4 James W. Cooley y Juan W. Tukey describe el Fourier rápido transforma el algoritmo, que es más adelante uno de los solos consumidores más grandes de ciclos floating-point. 1966 La CDC introduce CDC 6500, conteniendo dos procesadores de la CDC 6400. El arquitecto principal es Jim Thornton. La división de UNIVAC de Sperry Rand Corporation entrega el primer multiprocesador 1108. Cada uno contiene hasta 3 CPU y 2 reguladores de la entrada-salida; su sistema operativo de EXEC 8 proporciona el interfaz para la ejecución de programa multithread. Michael Flynn publica un papel que describe la taxonomía arquitectónica que lleva su nombre. El Minsk-222 terminó por el E. V. Yevreinov en el instituto de las matemáticas, Novosibirsk. 1968 Duane Adams de la universidad de Stanford acuña el término “flujo de datos” mientras que describe modelos gráficos del cómputo en su tesis de Ph.D. El grupo formó en los datos de control para estudiar las necesidades que computaban del proceso de imagen; esto conduce a la CDC AFP y a los diseños de Cyberplus. La máquina celular de IBM 2938 entregó a geofísico occidental (quién puntualmente pintura que compite con rayas en ella). Primera máquina comercial para sostener 10 MFLOPS en 32 operaciones floating-point del pedacito. Un procesador programable de la señal numérica, prueba muy popular en la industria petrolera. Edsger Dijkstra describe los semáforos, e introduce el problema de los filósofos que cena, que se convierte en más adelante un ejemplo estándar en teoría de la concurrencia. 1969 George Paul, M. Wayne Wilson, y el Cree de Charles comienzan el trabajo en IBM en VECTRAN, una extensión a FORTRAN 66 con los operadores poner en orden-valorados, funciones, e instalaciones de la entrada-salida. La CDC produce el superordenador canalizado de la CDC 7600 como continuación a la CDC 6600. El trabajo comienza en Compass Inc. en un recopilador de FORTRAN que hacía parelelismo para el ILLIAC-IV llamó IVTRAN. Honeywell entrega el primer sistema de Multics (multiprocesador simétrico con hasta 8 procesadores). 5 1976 El sistema del recopilador de Parafrase se desarrolla en la universidad de Illinois bajo dirección de David Kuck. Un sucesor a un programa llamado el analizador, Parafrase se utiliza como testbed para el desarrollo de muchas nuevas ideas en la transformación del vectorization y del programa. Carl Hewitt, en el MIT, inventa a agentes modela, en quienes las estructuras del control son patrones de mensajes. Este modelo es la base para un trabajo mucho más último sobre modelos de alto nivel de la programación paralela. Coma flotante Systems Inc. entrega su primera 38 máquina celular del pedacito AP-120B. La máquina publica instrucciones canalizadas múltiples cada ciclo. La investigación de Cray entrega el primer CRAY-1 Freón-refrescado al laboratorio del nacional de Los Alamos. Fujitsu entrega el primer procesador del vector FACOM-230 al laboratorio aeroespacial nacional japonés (NAL). El tándem envía sus primeras máquinas fault-tolerant directas de la desunirmemoria con 2 a 16 procesadores de encargo, autobúses duales del interprocesador, y un sistema operativo mensaje-basado. Las máquinas se utilizan sobre todo para el tratamiento transaccional en línea. El trabajo sobre el multiprocesador PS-2000 comienza en el instituto de los problemas del control en Moscú (IPU) y el instituto de investigación científico de las computadoras de control en Severodonetsk, Ucrania (NIIUVM). La tesis de Utpal Banerjee en la universidad de Illinois formaliza el concepto de la dependencia de los datos, y describe y pone el algoritmo del análisis en ejecución nombrado después de él. La CDC entrega el procesador flexible, una unidad de proceso programable de señal con una palabra de la instrucción de 48 pedacitos. Borroughs entrega el procesador sociable de PEPE. Coma flotante Systems Inc. describe el lazo que se envuelve, que se utiliza para programar procesadores múltiples canalizados de la edición de la instrucción. 6 3.1 CARACTERISTICAS ¿Qué es un multiprocesador? A partir de la definición más sencilla -múltiples procesadores en una misma máquina, empezaremos con una clasificación tradicional de los sistemas paralelos, para ir determinando el sistema que ha sido objeto de nuestro estudio. Se han hecho diferentes clasificaciones de sistemas multiprocesadores basándose en las características de sus diferentes componentes y la manera de acceder a ellos: Homogéneos versus heterogéneos, según esté compuesto por procesadores todos iguales o diferentes. En un sistema homogéneo, todos los procesadores son de igual potencia e intercambiables. Fuertemente acoplados versus débilmente acoplados. En el primer caso, cada procesador tiene memoria privada y recursos de entrada/salida propios, y puede comunicar con otros procesadores por intercambio de mensajes. En los procesadores fuertemente acoplados, cada procesador tiene acceso directo a toda la memoria y a los dispositivos de entrada/salida. El reloj también es común. Interconexión por bus versus interconexión por red, según el tipo de interconexión para la comunicación con memoria: los sistemas basados en el bus y los basados en la conmutación, también conocidos como sistemas multi-etapa. El sistema de bus común, o bus de tiempo compartido, es el sistema de interconexión más sencillo, aunque tiene un grave problema de degradación en el rendimiento, debido a la contención del bus y la memoria. Una solución a este problema es la incorporación de una memoria cache entre el procesador y la memoria principal que reduzca el tráfico del bus y los conflictos. Memoria compartida versus paso de mensajes, según el modelo hardware subyacente. Programas que trabajen con memoria compartida pueden ser ejecutados en un hardware de memoria compartida o de paso de mensajes. El problema es cuán eficiente puede ser una implementación en cada caso y cual será el rendimiento obtenido. Master/slave versus simétricos, según las funciones que lleguen a un determinado procesador (por ejemplo, repartición de las interrupciones). Aunque el software de sistema considere por igual a todos los procesadores en cuanto a recurso que ofrece a las aplicaciones, es normal encontrar sistemas con uno de sus procesadores dedicado a la atención de interrupciones. 7 3.2 Acceso a los datos, nos encontramos con: Multiprocesadores de memoria compartida, donde cada módulo de memoria es accesible desde todo procesador y compartido por todo ellos. De acuerdo al coste del acceso a la memoria, pueden clasificarse a su vez en: o Multiprocesadores con Acceso Uniforme a Memoria (UMA), en los que el tiempo de acceso a cualquier módulo de memoria es el mismo para todos los procesadores del sistema. Un ejemplo son las arquitecturas basadas en un bus común. o Multiprocesadores con Acceso no Uniforme a Memoria (NUMA), en los que el tiempo de acceso puede variar dependiendo del módulo de memoria y del procesador que accede a ella. Generalmente, han entrado en esta categoría los multiprocesadores con memoria local asociada a cada procesador: el acceso a la memoria local era más rápido que el acceso a cualquier otro módulo. Ejemplos de estas arquitecturas son el BBN Butterfly y el actual supercomputador Kendall Square Research (KSR). Las arquitecturas UMA son las más comunes para multiprocesadores en la actualidad, debido en parte a que la mayoría de máquinas se emplea únicamente para aumentar el throughput de la multiprogramación, en sistemas multiusuario de tiempo compartido, más que para la ejecución de programas paralelos de mayor escala. Es interesante observar, sin embargo, que la tecnología actual está implementando cada vez más las máquinas hacia el tipo de acceso NUMA. En parte, debido a la distancia a la que se ha llegado entre la velocidad de los componentes de cálculo, por un lado, y la velocidad de acceso a memoria y de los componentes de comunicación, por otro. También por el incremento en el uso de memorias locales y caches para reducir la contención en el acceso al bus -o buses- compartidos. Debido a que las arquitecturas NUMA permiten un orden más elevado en el número de procesadores del sistema -de 128 a 512- y una mayor escalabilidad, muchos sistemas experimentales son máquinas NUMA y su número y popularidad se va incrementando en la actualidad. Las máquinas NORMA, por su parte, son de un acoplamiento más débil que las NUMA, ya que no tienen soporte hardware para acceder de manera directa a módulos remotos de memoria. Sin embargo, avances recientes en la tecnología de los supercomputadores van acortando la diferencia de relación entre los accesos locales y los remotos en arquitecturas NORMA (1:500 de un acceso local frente a uno remoto) que las aproximan a los tiempos de acceso de máquinas NUMA, como la KSR (1:100). Se intuye que en el futuro tanto las máquinas NUMA como las NORMA van a requerir de un soporte similar por parte del sistema operativo y de unas 8 similares herramientas en el soporte de la programación para lograr un rendimiento eficiente. Vamos a centrarnos más en el primer aspecto del sistema operativo: como gestor de recursos que proporciona la posibilidad de paralelismo a los usuarios. A partir de los primeros sistemas operativos multiprocesadores, pensados como una extensión de los monoprocesadores, surgen los SO propiamente para arquitecturas multiprocesadores. Es un tipo de arquitectura de procesamiento paralelo en que cada procesador tiene su propia memoria local pero puede también tener acceso a la memoria de otros procesadores. Está es llamada no-uniforme porque un procesador puede acceder su propia memoria local más rápido que la memoria no local (memoria que está en otro procesador o compartida entre procesadores). La arquitectura NUMA ofrece la "escalabilidad" de MPP y la programación simple de SMP. MPP o procesamiento paralelo masivo (Massively Parallel Processing) es un tipo de arquitectura que usa muchas CPUs separadas corriendo en paralelo para procesar un solo programa. MPP es similar a procesamiento simétrico (SMP: Symmetric Multiprocessing), con la principal diferencia que en los sistemas SMP todas las CPUs comparten la misma memoria, mientras que en los sistemas MPP cada CPU tiene su memoria propia. Los sistemas MPP son por eso más difíciles de programar porque las aplicaciones se deben dividir en tal manera que todos los segmentos que se ejecutan se puedan comunicar unos con otros. En cambio, MPP no tiene los problemas de cuello de botella inherente en los sistemas SMP cuando todas las CPUs intentan acceder la misma memoria al mismo tiempo. SMP o multiprocesamiento simétrico (Symmetric Multiprocessing) es una arquitectura de computadores que provee un rápido desempeño haciendo que múltiples CPUs estén disponibles para completar procesos individuales simultáneamente (multiprocesamiento). En forma distinta a procesamiento asimetrico, se le puede asignar a cualquier tarea cualquier procesador ocioso, y se pueden agregar CPUs para aumentar el desempeño y así manejar el aumento de cargas. Una variedad de sistemas operativos especializados y arreglos de hardware estan disponibles para dar soporte a SMP. Las aplicaciones específicas se pueden beneficiar de SMP si el códifigo permite hacer multithreading. 9 SMP usa un solo sistema operativo y comparte porciones de memoria común y recursos de entrada/salida de disco. Ambos UNIX y Windows NT soportan SMP. 3.3 Sistemas Operativos en multiprocesadores El rendimiento que pueda obtenerse en cualquier sistema informático es resultado de la combinación del hardware y del software; y como elemento radical del software, el sistema operativo. Con la aparición de máquinas de propósito general de más de un procesador, surge la necesidad de adaptar los sistemas operativos ya existentes para la gestión de un nuevo recurso con múltiples instancias: el procesador. Al hablar de sistemas operativos en entornos paralelos, hemos de distinguir cuidadosamente dos aspectos del trabajo paralelo. Por un lado, el sistema operativo como gestor de los recursos que utilizan los usuarios, ha de ser capaz de dar soporte a trabajos paralelos; por ejemplo, que un único programa pueda utilizar varios procesadores. Por otro lado, el propio sistema operativo está corriendo en un sistema multiprocesador y, por tanto, él mismo es un programa paralelo. Las mismas rutinas del sistema operativo han de adaptarse al nuevo funcionamiento del entorno, ahora paralelo, y con problemas de concurrencia y exclusión mutua muchas veces encubiertos. La mayoría de las realizaciones de sistemas multiprocesadores suelen incluir el diseño de mecanismos para la sincronización y comunicación entre procesadores. Para una mayor eficiencia, se intenta incluso que estos mecanismos formen parte del hardware de la máquina, aumentando o modificando, si es posible, el conjunto de instrucciones del procesador. Tres configuraciones básicas han sido adoptadas a la hora de clasificar un sistema operativo, según su comportamiento en presencia de múltiples procesadores: supervisores separados, master/slave y simétricos. En cuanto al sistema operativo, como programa paralelo, se puede decir que su evolución ha pasado por diferentes etapas, como vamos a ver a continuación. 10 3.4 Transporte de SO monoprocesador: UNIX Por sus características y su popularidad en todo el mundo informático, el sistema operativo más transportado a arquitecturas multiprocesador ha sido UNIX. Pero el planteamiento de base sobre el que está construido pone un límite a la explotación del paralelismo. Por una parte, su construcción monolítica hace costoso el trabajo de paralelizar todas las partes del sistema operativo. Choca, además, frontalmente con la exclusión mutua implícita original que le hace trabajar en el código de kernel comportándose como un monitor3 y despreocupándose, muchas veces, de garantizar la ejecución atómica de ciertas partes de código. Por otro lado, su diseño ya parte de limitaciones importantes en la granularidad de recursos que puede ofrecer a las aplicaciones: a partir del proceso, ni puede dar soporte a que el código de usuario trabaje con más de un procesador, ni puede tampoco permitirlo a nivel de servicio del propio sistema. 3.5 Diseño de sistemas operativos para multiprocesadores En las dos últimas décadas se construyen nuevos sistemas operativos para máquinas multiprocesador, diseñados desde cero. Se rompe la atomicidad en la ejecución de código de sistema, hasta donde lo permita la semántica de las operaciones. Se separan los mecanismos -soportados por el kernel- de las políticas -gestionadas a niveles superiores-, potenciando más la versatilidad de las arquitecturas (Hydra ). La solución definitiva es plasmar la sencillez de UNIX en las operaciones de sistema a través de una realización multi-hebra. Los servicios del sistema operativo ya no se realizan como secuencias de llamadas a rutinas, sino que pasan a ser flujos con una identidad propia que pueden moverse en paralelo por el código de sistema, respetando pequeñas partes que se acceden en exclusión mutua (Sprite). Hace falta, sin embargo, subir el paralelismo al nivel de usuario. Se hace necesaria la aparición de nuevos objetos, de nuevas abstracciones que permitan dar paralelismo también a los programas, limitados todavía a un único fluir secuencial: el proceso. 11 3.6 Afinidad al procesador En entornos multiprogramados, en los que el número de procesos es bastante superior, a veces, al número de procesadores, una utilización eficiente de la memoria cache puede ser un factor decisivo en el rendimiento del sistema. A la hora de asignar un proceso a un procesador, puede ser determinante el que, siendo el procesador en el que había corrido anteriormente dicho proceso (afinidad al procesador), se mantengan todavía en la cache los datos, o la mayoría de los datos, necesarios para empezar a arrancar el proceso (footprint)6. Existen diferentes tipos de scheduling basados en la afinidad de un proceso a un procesador. La política más sencilla es la de scheduling fijo, consistente en ligar un proceso a un procesador. Otra política utilizada es la de mínima intervención, que consiste en seleccionar, dentro de los procesos ejecutables, aquel que más recientemente se ha ejecutado en dicho procesador, con lo cual la probabilidad de que todavía queden datos suyos en la cache, en principio es más alta que para cualquiera del resto de procesos seleccionables. La decisión de elegir políticas que tengan en cuenta este hecho tendrá mayor o menor repercusión según el tipo de aplicación (que tenga un footprint más o menos grande o que se conserven sus datos de una a otra ejecución, por ejemplo): aunque es un factor que puede influir decisivamente en el rendimiento del sistema, pueden darse aplicaciones en las que de una ranura de tiempo a la siguiente se haya cambiado todo el contenido de la cache, ante lo cual, poco puede hacerse. En general, para cargas reales, se ha comprobado que los beneficios de la afinidad son pequeños cuando los procesadores son compartidos entre varias aplicaciones. 12 4. Introducción 4.1 Programación Paralela Concurrencia es la noción de que dos o más cosas pueden suceder al mismo tiempo. Cuando realmente suceden, hablamos de paralelismo. Desde la aplicación, el concepto de concurrencia implica diferentes flujos de control en un programa, independientemente del número de procesadores subyacente. El número máximo de flujos que pueden ejecutarse concurrentemente en una aplicación diremos que es su grado de concurrencia y de alguna manera, está identificando el máximo potencial de paralelismo que se puede conseguir de dicha aplicación. Los sistemas multiprocesadores que han aparecido con las nuevas tecnologías, permiten paralelismo en la multiprogramación entre diferentes aplicaciones. Actualmente, el desarrollo del software y el mayor conocimiento de las aplicaciones permiten además la ejecución de una aplicación con varios flujos y explotar la concurrencia que, de manera inherente muchas veces se Encuentra en los programas. Aunque se trabaje sólo con un procesador, la programación paralela mejora la concurrencia y facilita la claridad y sencillez en la resolución de los problemas. Uno de los objetivos principales en las aplicaciones actuales es, pues, explotar al máximo el paralelismo que le ofrece la tecnología; en definitiva, diseñar programas paralelos. Programar con paralelismo supone una nueva filosofía en el modo de programar, equivalente a la innovación que introdujo el objetivo de simplicidad en el diseño de UNIX. 4.2 Estructuras del lenguaje Algunos lenguajes permiten crear y destruir flujos que ejecuten rutinas en paralelo. La idea que hay detrás del diseño de los “lenguajes paralelos” es que el programador se encargue de identificar qué trabajos pueden realizarse concurrentemente y tome las decisiones de cómo dividir ese trabajo, a partir de procesos o tasks . Para ello, se ve un programa como compuesto de una parte principal y de un conjunto de subrutinas o funciones que son llamadas para ejecutar un determinado trabajo. Cada una de estas rutinas y funciones, en un lenguaje imperativo, consta de un bloque de activación propio, que define su punto actual de ejecución, sus variables locales y su pila. Si en lugar de una secuencia de ejecución, se permiten varias, pueden definirse procesos que ejecuten las funciones y subrutinas en paralelo, con puntos de comunicación entre ellos para recoger los resultados. 13 BIBLIOGRAFIA Fuentes obtenidas desde Internet: http://www.dcc.uchile.cl/~rbaeza/cursos/proyarq/choviedo/numa_definicion.html http://www.infor.uva.es/~bastida/Arquitecturas%20Avanzadas/Memoria.pdf http://www.dynamics.unam.edu/DinamicaNoLineal/Proyectos/Supercomputo/Co mputacionParalela.pdf http://www.tesisenred.net/TESIS_UPC/AVAILABLE/TDX-0621101121305//1partei.pdf http://dac.escet.urjc.es/docencia/LAAC/LAAC_Tema1.pdf http://ei.cs.vt.edu/~history/Parallel.html Libro de Sistemas Operativos: Tannenbaum 14 15