UNIDAD 3. ADMINISTRACIÓN DEL PROCESADOR 3.1 PLANEACIÓN DE TRABAJOS(JOB SHEDULING) 3.2 CONCEPTOS BÁSICOS 3.3 TIPOS DE PLANEACIÓN 3.3.1 First In First Out(FIFO) 3.3.2 Round Robin(RR) 3.3.3 Shortest Job First(SJF) 3.3.4 Shortest Remaining Time(STR) 3.3.5 Highest Response Ratio Next(HNR) 3.4 MULTIPROCESAMIENTO 3.5 CONCEPTOS BÁSICOS 3.6 PARALELISMO 3.7 SISTEMAS MULTIPROCESAMIENTO 3.8 ORGANIZACIÓN DEL MULTIPROCESADOR 3.9 SISTEMAS OPERATIVOS DEL MULTIPROCESADOR PLANEACIÓN DE TRABAJOS 3.2 CONCEPTOS BÁSICOS Cuando hay más de un proceso ejecutable, el sistema operativo debe decidir cuál ejecutará primero. La parte del sistema operativo que toma esta decisión se denomina planificador; el algoritmo que usa se denomina algoritmo de planificación. Antes de examinar algoritmos de planificación específicos, debemos pensar en qué está tratando de lograr el planificador. Después de todo, éste se ocupa de decidir una política, no de proveer un mecanismo. Se nos ocurren varios criterios para determinar en qué consiste un buen algoritmo de planificación. Entre las posibilidades están: 1. Equitatividad —asegurarse de que cada proceso reciba una parte justa del tiempo de CPU. 2. Eficiencia —mantener la CPU ocupada todo el tiempo. 3. Tiempo de respuesta —minimizar el tiempo de respuesta para usuarios interactivos. 4. Retorno —minimizar el tiempo que los usuarios por lotes tienen que esperar sus salidas. 5. Volumen de producción —maximizar el número de trabajos procesados por hora. 3.3 TIPOS DE PLANEACIÓN 3.3.1 First In First Out(FIFO) Primero en Llegar, Primero en ser Servido La política más simple de planificación es la de primero en llegar/primero en servirse (FCFS, First-come, First-served), también llamada primero en entrar/primero en salir (FIFO, First-in, First-out). Cada vez que un proceso esté listo para ejecutar, se incorpora a la cola de Listos. Cuando el proceso actual cesa su ejecución, se selecciona el proceso más antiguo de la cola. La figura 8.5 muestra las pautas de ejecución del ejemplo propuesto para un ciclo y la tabla 8.4 indica algunos resultados importantes. Primero, se determina el tiempo de finalización de cada proceso. A partir de él, es posible determinar el tiempo de retorno. En términos del modelo de colas, el tiempo de retorno (TAT) es el tiempo de estancia Tr o tiempo total que el elemento consume en el sistema (tiempo de espera más tiempo de servicio). Un valor más útil es el tiempo de retorno normalizado, que es la razón entre el tiempo de retorno y el tiempo de servicio. Este valor indica el retardo relativo experimentado por un proceso. Normalmente, cuanto mayor es el tiempo de ejecución, mayor es el retardo absoluto que puede tolerarse. El valor mínimo para esta proporción es de 1.0; los valores mayores corresponden a niveles decrecientes del servicio [FINK88]: El tiempo de espera normalizado para el proceso C no es tolerable: El tiempo total que pasa en el sistema es 100 veces el tiempo necesario de procesamiento. Tan larga espera tiene lugar cada vez que un proceso corto llega justo después de uno largo. Por otro lado, incluso en este ejemplo extremo, a los procesos largos no les va del todo mal. El proceso D obtiene un tiempo de retorno que es aproximadamente el doble que el de C, pero su tiempo de espera normalizado está por debajo de 2,0. Otro problema del FCFS es que tiende a favorecer a los procesos con carga de CPU frente los que tienen carga de E/S. Supóngase un conjunto de procesos, uno de los cuales usa principalmente la CPU y los otros se dedican a hacer E/S. Cuando un proceso con carga de CPU está ejecutando, todos los que tienen carga de E/S deben esperar. Algunos de ellos pueden estar en colas de E/S (estado bloqueado) pero puede ser que regresen a la cola de Listos mientras el de la carga de CPU todavía está ejecutando. Llegado este momento, todos o la mayoría de los dispositivos de E/S estarán ociosos, a pesar de que, posiblemente, haya trabajo para ellos. Cuando el proceso que está actualmente en ejecución abandone el estado Ejecutando, los procesos Listos con carga de E/S pasaran rápidamente por el estado de Ejecución y volverán a bloquearse por sucesos de E/S. Si el proceso con carga de CPU también está bloqueado, el procesador pasa a estar desocupado. Así pues, FCFS puede dar como resultado un uso ineficiente tanto del procesador como de los dispositivos de E/S. Sin embargo, se combina a menudo con un esquema de prioridades para obtener un planificador efectivo. Así pues, el planificador puede mantener un conjunto de colas, una para cada nivel de prioridad y expedir cada cola con un algoritmo primero en llegar/primero en servirse. Más tarde se planteará un ejemplo de este sistema, en el apartado "Planificación realimentada". 3.3.2 Round Robin(RR) Planificación round robin (de torneo) Examinemos ahora algunos algoritmos de planificación específicos. Uno de los más antiguos, sencillos, equitativos y ampliamente utilizados es el de round robin. A cada proceso se le asigna un intervalo de tiempo, llamado cuanto, durante el cual se le permite ejecutarse. Si el proceso todavía se está ejecutando al expirar su cuanto, el sistema operativo se apropia de la CPU y se la da a otro proceso. Si el proceso se bloquea o termina antes de expirar el cuanto, la conmutación de CPU naturalmente se efectúa cuando el proceso se bloquee. El round robin es fácil de implementar. Todo lo que el planificador tiene que hacer es mantener una lista de procesos ejecutables, como se muestra en la Fig. 2-22(a). Cuando un proceso gasta su cuanto, se le coloca al final de la lista, como se aprecia en la Fig. 2-22(b). La única cuestión interesante cuando se usa el round robin es la duración del cuanto. La conmutación de un proceso a otro requiere cierto tiempo para llevar a cabo las tareas administrativas: guardar y cargar registros y mapas de memoria, actualizar diversas tablas y listas, etc. Su pongamos que esta conmutación de proceso o conmutación de contexto requiere 5 ms. Supongamos también que usamos cuantos de 20 ms. Con estos parámetros, después de realizar trabajo útil durante 20 ms, la CPU tendrá que ocupar 5 ms en la conmutación de procesos. Se desperdiciará el 20% del tiempo de CPU en gastos extra administrativos. A fin de mejorar la eficiencia de la CPU, podríamos usar cuantos de, digamos, 500 ms. Ahora el tiempo desperdiciado es de menos del 1%, pero consideremos lo que sucede en un sistema de tiempo compartido sil0 usuarios interactivos pulsan la tecla de retomo de carro aproximadamente al mismo tiempo: diez procesos se pondrían en la lista de procesos ejecutables. Si la CPU está ociosa, el primero se iniciará de inmediato, el segundo podría no iniciarse hasta cerca de medio segundo después, y así sucesivamente. El pobre proceso que le haya tocado ser último podría tener que esperar 5 segundos antes de tener su oportunidad, suponiendo que los demás procesos utilizan su cuanto completo. Para casi cualquier usuario, un retardo de 5 segundos en la respuesta a un comando corto sería terrible. El mismo problema puede presentarse en una computadora personal que maneja multiprogramación. La conclusión puede formularse así: escoger un cuanto demasiado corto causa demasiadas Conmutaciones de procesos y reduce la eficiencia de la CPU, pero escogerlo demasiado largo puede dar pie a una respuesta deficiente a solicitudes interactivas cortas. Un cuanto de cerca de 100 ms suele ser un término medio razonable. 3.3.3 Shortest Job First(SJF) Primero el proceso más corto Otra forma de reducir el sesgo favorable al proceso más largo inherente al FCFS es la política de primero el proceso más corto (SPN, Shortest Process Next). Esta es una política no preferente en la que se selecciona el proceso con menor tiempo esperado de ejecución. Así pues, un proceso corto saltará a la cabeza de la cola, sobrepasando a trabajos largos. La figura 8.5 y la tabla 8.4 muestran los resultados para el ejemplo. Nótese que el proceso 5 recibe servicio mucho antes que con FCFS. La mejora del rendimiento global es significativa en términos de tiempo de respuesta. Sin embargo, se incrementa la variabilidad de los tiempos de respuesta, especialmente para procesos largos, reduciendo así la previsibilidad. Una dificultad que plantea la política SPN es la necesidad de conocer o, por lo menos, estimar, el tiempo exigido por cada proceso. Para trabajos por lotes, el sistema puede solicitar al programador que estime el valor y se lo proporcione al sistema operativo. Si la estimación del programador está considerablemente por debajo del tiempo de ejecución real, el sistema puede abandonar el trabajo En un entorno real de producción, se ejecutan frecuentemente los mismos trabajos y se pueden calcular estadísticas. Para los procesos interactivos, el sistema operativo puede mantener calculada una media para las ráfagas de cada proceso. El cálculo más sencillo podría ser el siguiente: Para evitar volver a calcular la suma completa cada vez, se puede reescribir esta ecuación como: Nótese que esta fórmula da el mismo peso a todos los casos. Normalmente, resulta más conveniente dar un peso mayor a los casos más recientes, ya que es más probable que reflejen el comportamiento futuro. Por ello, una técnica habitual de predicción de los valores futuros a partir de una serie de valores pasados es usar un promediado exponencial. Compárese esta ecuación con la (2). Empleando un valor constante de a (0 < α < 1), independiente del número de observaciones pasadas, se llega a una situación en la que se tienen en cuenta todos los valores pasados, pero los más distantes reciben un peso menor. Para verlo con más claridad, considérese el siguiente desarrollo de la ecuación (3): Como α y (1 - α) son menores que uno, cada uno de los sucesivos términos de la ecuación es más pequeño. Por ejemplo, para α = 0,8, la ecuación (4) se convierte en: Cuanto más antigua es la observación, su peso cuenta menos en la media. El tamaño del coeficiente, en función de su posición en el desarrollo, se muestra en la figura 8.9. Cuanto mayor es el valor de a, mayor es el peso dado a las observaciones más recientes. Para α = 0,8, prácticamente todo el peso lo reciben las cuatro observaciones más recientes, mientras que para α = 0,5, la media se distribuye sobre los valores de las ocho observaciones más recientes, más o menos. La ventaja de emplear un valor a cercano a 1 es que la media reflejará rápidamente los cambios repentinos en la cantidad observada. La desventaja es que si se produce un breve aumento en los valores observados y después se vuelve a estabilizar en algún valor medio, el empleo de un valor grande de a generará cambios bruscos en la media. En la figura 8.10 se comparan el promediado simple con el exponencial (para dos valores diferentes de a). En la parte (a) de la figura, el valor observado comienza siendo 1, crece gradual- mente hasta 10 y se estabiliza. En la parte (b), el valor observado parte de 20, desciende gradualmente hasta 10 y se estabiliza. En ambos casos, se parte de un valor estimado de So = 0. Esto otorga mayor prioridad a los procesos nuevos. Nótese que el promediado exponencial marca los cambios en el comportamiento de los procesos más rápidamente que el promediado simple y que el valor mayor de a genera una reacción rápida a los cambios del valor observado. Un riesgo que existe en SPN es la posibilidad de inanición para los procesos largos mientras exista un flujo continuo de procesos más cortos. Por otro lado, aunque SPN reduce el sesgo favorable a los procesos largos, no es conveniente para entornos de tiempo compartido o de procesamiento de transacciones, debido a la ausencia de apropiación. Volviendo al análisis del peor caso, descrito en el estudio del FCFS, los procesos A, B, C y D ejecutarían también en el mismo orden, penalizando en exceso al proceso corto C. 3.3.4 Shortest Remaining Time(STR) Menor tiempo restante La política del menor tiempo restante (SRT, Shortest Remaining Time) es una versión apropiativa del SPN, en la que el planificador siempre elige al proceso que le queda menos tiempo esperado de ejecución. Cuando sec añade un nuevo proceso a la cola de Listos, puede quedarle un tiempo esperado de ejecución menor que al proceso que está ejecutándose en ese momento. Por consiguiente, el planificador puede apropiarse del procesador siempre que un proceso nuevo esté listo. Como en el SPN, el planificador debe disponer de una estimación del tiempo de proceso para poder llevar a cabo la función de selección, existiendo el riesgo de inanición para procesos largos. El SRT no presenta el sesgo favorable a los procesos largos del PCFS. Al contrario que el turno rotatorio, no se generan interrupciones adicionales y, así, el coste se ve reducido. Por contra, se deben los tiempos de servicio transcurridos, lo que contribuye a la sobrecarga. El SRT también debe producir unos tiempos de retorno mejores que los del SPN, puesto que los trabajos cortos reciben una atención inmediata y preferente a los trabajos largos. Nótese que, en el ejemplo, los tres procesos más cortos reciben un servicio inmediato, obteniendo cada uno un tiempo de retorno normalizado de 1,0. 3.3.5 Highest Response Ratio Next(HNR) Primero el de mayor tasa de respuesta En la tabla 8.4, se ha empleado el tiempo de retomo normalizado, que es la razón entre el tiempo de retorno y el tiempo real de servicio, como valor a destacar. Para cada proceso individual, se desea minimizar esta razón, así como minimizar el valor medio de todos los procesos. Aunque ésta es una medida a posteriori, es posible aproximarla a una medida a priori, como el criterio de selección de un planificador no apropiativo. En concreto, considérese la siguiente tasa de respuesta (RR, Response Ratio): RR =_w + s_ s Donde: R= tasa de respuesta w = tiempo consumido esperando al procesador s = tiempo de servicio esperado Si el proceso con este valor se expide inmediatamente, R es igual al tiempo de retorno normalizado. Nótese que el valor mínimo de RR es 1,0, alcanzado cuando un proceso entra por primera vez en el sistema. Hasta ahora, la regla de planificación ha sido: Cuando el proceso actual termina o se bloquea, se elige el proceso listo con un valor mayor de RR. Este método es atractivo porque tiene en cuenta la edad del proceso. Aunque se favorece a los trabajos más cortos (un denominador menor produce una razón mayor), el envejecimiento sin que haya servicio incrementa el valor de la razón, de forma que los procesos más largos pasen finalmente primero, en competición con los más cortos. El tiempo esperado de servicio debe estimarse antes de emplear la técnica de la mayor tasa de respuesta (HRRN, Highest Response Ratio Next), como ya ocurría con SRT y SPN. 3.4 MULTIPROCESAMIENTO Existen varias razones para construir tales sistemas. Una ventaja es un mayor rendimiento. Al incrementar el número de procesadores, se busca realizar más trabajo en menos tiempo. Sin embargo, la razón de aceleración con n procesadores no es n, sino menor que n. Cuando varios procesadores cooperan en una tarea, se necesita una cierta cantidad de trabajo adicional para mantener a todas las partes funcionando de manera correcta. Este trabajo adicional {overhead), mas la disputa por los recursos compartidos, reduce la ganancia esperada de los procesadores adicionales. De manera similar, un grupo de n programadores trabajando juntos estrechamente no da por resultado n veces la cantidad de trabajo realizado. Los sistemas multiprocesador también pueden ahorrar dinero en comparación con múltiples sistemas con unidades de un solo procesador, debido a que los procesadores pueden compartir periféricos, almacenamiento masivo y suministro de energía. Si varios pro-gramas operan con el mismo conjunto de datos, es más barato almacenar estos datos en un disco y hacer que todos los procesadores los compartan, en lugar de tener muchas computadoras con discos locales y varias copias de los datos. Otra razón para los sistemas multiprocesador es que incrementa la confiabilidad. Si las funciones se pueden distribuir adecuadamente entre varios procesadores, entonces la falla de un procesador no detendrá al sistema, solo lo hará más lento. Si hay diez procesadores y uno falla, cada uno de los nueve restantes debe encargarse de una parte del trabajo del procesador que fallo. De esta manera, todo el sistema solo ejecuta un diez por ciento más lento, en lugar de fallar en su totalidad. Esta capacidad de continuar proporcionando servicio de manera proporcional al nivel del hardware que sigue activo se conoce como degradación suave. Los sistemas que se diseñan para esta degradación también se conocen como tolerantes a las fallas. La operación continua en presencia de fallas requiere un mecanismo que permita detectar, diagnosticar y corregir la falla (en caso de ser posible). El sistema Tandem emplea la duplicación tanto de hardware como de software para asegurar una operación continua a pesar de las fallas. El sistema consta de dos procesadores idénticos, cada uno con su propia memoria local. Los procesadores se conectan mediante un bus. Un procesador es el primario y el otro es de respaldo. Se mantienen dos copias de cada proceso: una en el procesador primario y la otra en el respaldo. En puntos de verificación fijos durante la ejecución del sistema, la información de estado de cada trabajo (incluyendo una copia de la imagen de la memoria) se copia de la maquina primaria a la de respaldo. Si se detecta una falla, la copia de respaldo se activa, y se arranca desde el punto de verificación mas reciente. Esta solución es obviamente cara, ya que existe una duplicación considerable de hardware. Los sistemas de procesadores múltiples más comunes utilizan el multiprocesamiento simétrico, en el que cada procesador ejecuta una copia idéntica del sistema operativo, y estas copias se comunican entre ellas según sea necesario. Algunos sistemas emplean el multiprocesamiento asimétrico, en el que a cada procesador se le asigna una tarea específica. Un procesador maestro controla el sistema; el otro procesador, solicita instrucciones al maestro para recibir instrucciones o tiene tareas definidas previa-mente. Este esquema define una relación de maestro-esclavo. En el multiprocesamiento simétrico {symmetric multiprocessing, SMP) todos los procesadores están al mismo nivel; no existe una relación maestro-esclavo entre ellos. Cada procesador ejecuta de manera concurrente una copia del sistema operativo. La figura 1.5 ilustra una arquitectura SMP típica. Un ejemplo del sistema SMP es la versión Encore de UNIX para la computadora Multimax. Esta computadora se puede configurar de tal manera que emplee docenas de procesadores, ejecutando todos ellos copias de UNIX. El beneficio de este modelo es que pueden ejecutarse simultáneamente muchos procesos -(JV procesos pueden ejecutar si hay JVCVU)- sin ocasionar un deterioro significativo en el rendimiento. Sin embargo, debemos controlar con cuidado las acciones de E/S para asegurar que los datos lleguen al procesador apropiado. Asimismo, debido a que las CPU son distintas, una puede estar ociosa mientras que otra está sobrecargada, dando por resultado ineficiencias. Estas ineficiencias pueden evitarse si los procesadores comparten ciertas estructuras de datos. Un sistema multiprocesador con estas características permitirá compartir de manera dinámica procesos y recursos -como la memoria- entre los diferentes procesadores, y puede reducir la varianza entre ellos. Tal sistema se debe escribir con cuidado, como veremos en el capítulo 7. Virtualmente todos los sistemas operativos modernos -incluyendo Windows NT, Solaris, Digital UNIX, OS/2 y Linux- ofrecen soporte para el SMP. La diferencia entre el multiprocesamiento simétrico y el asimétrico puede ser el resultado del hardware o del software que se utilice. Un hardware especial puede diferenciar a los multiprocesadores múltiples, o puede escribirse el software de manera que solo se permita un maestro y múltiples esclavos. Por ejemplo, el sistema operativo SunOS Versión 4 de Sun proporciona multiprocesamiento asimétrico, en tanto que la versión 5 (Solaris 2) es simétrica en el mismo hardware, A medida que los microprocesadores se vuelven menos costosos y más poderosos, se descargan funciones adicionales del sistema operativo a los procesadores esclavos, 0 back-ends. Por ejemplo, es muy fácil agregar un microprocesador con su propia memoria para administrar un sistema de discos. El microprocesador recibe una secuencia de solicitudes desde la CPU principal e implementa su propia cola en disco y algoritmo de planificación. Este arreglo libera a la CPU principal del trabajo adicional de la planificación de discos. Las PC contienen un microprocesador en el teclado para convertir las pulsaciones de las teclas en códigos que se envían a la CPU. De hecho, este empleo de los microprocesadores se ha vuelto tan común que ya no se considera como multiprocesamiento. 3.5 CONCEPTOS BÁSICOS Una manera tradicional de incrementar las prestaciones de un sistema consiste en utilizar varios procesadores que puedan ejecutar en paralelo una carga de trabajo dada. Las dos organizaciones de múltiples procesadores más comunes son los multiprocesadores simétricos (SMP) y los «clusters». Reciente-mente, los sistemas de acceso a memoria no uniforme (NUMA) han aparecido comercialmente. Un SMP es un computador constituido por varios procesadores similares, interconectados mediante un bus o algún tipo de estructura de conmutación. El problema más crítico a resolver en un SMP es la coherencia de cache. Cada procesador tiene su propia cache, y es posible que una línea de datos dada esté presente en más de una cache. Si esa línea se altera en una cache, entonces tanto la memoria principal como las otras caches tienen versiones no validas de dicha línea. Un «cluster» es un grupo de computadores completos interconectados y trabajando juntos como un solo recurso de computo, proporcionando la ilusión de ser una única maquina. El termino computador completo significa que puede funcionar autónomamente fuera del cluster. Un sistema NUMA es un multiprocesador de memoria compartida, en el que el tiempo de acceso de un procesador a una palabra de memoria varía según la ubicación de la palabra en memoria. Tradicionalmente, el computador se ha visto como una maquina secuencial. La mayoría de los lenguajes de programación del computador requieren que el programador especifique los algoritmos mediante una secuencia de instrucciones. Los procesadores ejecutan los programas procesando instrucciones maquina de una en una. Cada instrucción se ejecuta mediante una secuencia de operaciones (captar instrucción, captar operandos, realizar la operación y almacenar los resultados). Esta visión del computador no es completamente cierta. En el nivel de micro operación, se generan al mismo tiempo múltiples señales de control. La segmentación de las instrucciones, al menos en cuanto al solapamiento de las operaciones de captación y ejecución, se ha utilizado desde hace tiempo. Ambos casos son ejemplos de funciones que se realizan en paralelo, Es el mismo enfoque de la organización superescalar, que aprovecha el paralelismo entre instrucciones. Un procesador superescalar dispone de varias unidades de ejecución, que pueden ejecutar en paralelo varias instrucciones del mismo programa. A medida que la tecnología de los computadores se ha desarrollado, y ha disminuido el costo del hardware del computador, los diseñadores de computadores han visto más y más posibilidades en el paralelismo, normalmente para mejorar las prestaciones y, en algunos casos, para mejorar la fiabilidad. Después de una revisión de conceptos, en este capítulo se examinan las tres organizaciones paralelas de más éxito. En primer lugar se estudian los multiprocesadores simétricos (SMP), una de las primeras y, todavía, el ejemplo más común de organización paralela. Un SMP incluye varios procesadores que comparten la memoria principal común. La organización SMP pone de manifiesto el problema de la coherencia de cache, al que se dedica una sección específica. Después se describen los «clusters», que están constituidos por varios computadores independientes, organizados para poder trabajar cooperativamente. Los «clusters» han llegado a ser bastante comunes a la hora de procesar car-gas de trabajo que sobrepasa la capacidad de un SMP. La tercera aproximación al uso de varios procesadores está representada por las maquinas de acceso no uniforme a memoria (NUMA). La alternativa NUMA es relativamente nueva, y todavía no se ha extendido comercialmente, pero, a menudo, se considera la alternativa a los computadores SMP y a los «clusters». Finalmente, el capitulo estudia las aproximaciones hardware a la computación vectorial. Estas propuestas optimizan la ALU para el procesamiento de vectores o matrices de números en coma flotante. Se han utilizado en la implementación de los sistemas conocidos como supercomputadores. 3.6 PARALELISMO Organizaciones con varios procesadores TIPOS DE SISTEMAS DE PARALELOS La taxonomía introducida primeramente por Flynn [FLYN72] es todavía la forma más común de clasificar a los sistemas según sus capacidades de procesamiento paralelo. Flynn propuso las siguientes categorías o clases de computadores: • Una secuencia de instrucciones y una secuencia de datos (SISD, Single Instruction, Single Data): Un único procesador interpreta una única secuencia de instrucciones, para operar con los datos almacenados en una única memoria. Los computadores monoprocesador caen dentro de esta categoría. • Una secuencia de instrucciones y múltiples secuencias de datos (SIMD, Single Instruction Multiple Data): Una única instrucción maquina controla paso a paso la ejecución simultánea y sincronizada de un cierto número de elementos de proceso. Cada elemento de proceso tiene una memoria asociada, de forma que cada instrucción es ejecutada por cada procesador, con un conjunto de datos diferentes. Los procesadores vectoriales y los matriciales pertenecen a esta categoría. • Múltiples secuencias de instrucciones y una secuencia de datos (MISD): Se transmite una secuencia de datos a un conjunto de procesadores, cada uno de los cuales ejecuta una secuencia de instrucciones diferente. Esta estructura nunca ha sido implementada. • Múltiples secuencias de instrucciones y múltiples secuencias de datos (MIM0): Un conjunto de procesadores ejecuta simultáneamente secuencias de instrucciones diferentes con conjuntos de datos diferentes. Los SMP, los «clusters», y los sistemas NUMA son ejemplos de esta categoría. En la organización MIMD, los procesadores son de uso general; cada uno es capaz de procesar todas las instrucciones necesarias para realizar las transformaciones apropiadas de los datos. Los computadores MIMD se pueden subdividir, además, según la forma que tienen los procesadores para comunicarse (Figura 16.1). Si los procesadores comparten una memoria común, entonces cada procesador accede a los programas y datos almacenados en la memoria compartida, y los procesadores se comunican unos con otros a través de esa memoria. La forma más común de este tipo de sistemas se conoce como multiprocesador simétrico (SMP), que se examinara en la Sección 16.2. En un SMP, varios procesadores comparten una única memoria mediante un bus compartido u otro tipo de mecanismo de interconexión. Una característica distintiva de estos sistemas es que el tiempo de acceso a memoria principal es aproximadamente el mismo para cualquier procesador. Un desarrollo más reciente es la organización con acceso no uniforme a memoria (NUMA), que se describe en la Sección 16.5. Como el propio nombre indica, el tiempo de acceso a zonas de memoria diferentes puede diferir en un computador NUMA. Un conjunto de computadores monoprocesador independientes, o de SMP, pueden inter-conectarse para formar un «cluster». La comunicación entre los computadores se realiza mediante conexiones fijas o mediante algún tipo de red. Organizaciones paralelas La Figura 16.2 muestra los esquemas generales de las clases de la taxonomía de la Figura 16.1. La Figura 16.2a corresponde a la estructura de un SISD. Se dispone de una unidad de control (UC) que proporciona una secuencia de instrucciones (SI) a una unidad de proceso (UP). La unidad de proceso actúa sobre una única secuencia de datos (SD) captados desde la unidad de memoria (UM). En una maquina SIMD, también existe una sola unidad de control, que proporciona una única secuencia de instrucciones a cada elemento de proceso. Cada elemento de proceso puede tener su propia memoria dedicada (mostrada en la Figura 16.2b), o puede haber una memoria compartida. Finalmente, en un computador MIMD hay múltiples unidades de control, y cada una proporciona una secuencia de instrucciones separada a su propio elemento de proceso. El MIMD puede ser un multiprocesador de memoria compartida (Figura 16.2c), o un multicomputador de memoria distribuida (Figura 16.2d). Los aspectos de diseño relacionados con los SMP, los «clusters», y los NUMA, son complejos, implicando cuestiones relativas a la organización física, las estructuras de interconexión, el diseño de los sistemas operativos, y el software de las aplicaciones. Nuestro interés se centra fundamentalmente en la organización, aunque se describirán brevemente aspectos del diseño de los sistemas operativos. 3.7 SISTEMAS MULTIPROCESAMIENTO Multiprocesadores Simétricos Hasta hace poco, prácticamente todos los computadores personales y estaciones de trabajo utilizaban un único microprocesador de uso general. A medida que aumenta la demanda de mayores prestaciones, y dado que el coste de los microprocesadores continúa reduciéndose, los fabricantes han introducido los sistemas SMP. El termino SMP se refiere a la arquitectura hardware del computador, y también al comportamiento del sistema operativo que utiliza dicha arquitectura. Un SMP puede definirse como un computador con las siguientes características: 1. Hay dos o más procesadores similares de capacidades comparables. 2. Estos procesadores comparten la memoria principal y las E/S, y están interconectados mediante un bus u otro tipo de sistema de interconexión, de forma que el tiempo de acceso a memoria es aproximadamente el mismo para todos los procesadores. 3. Todos los procesadores comparten los dispositivos de E/S, bien a través de los mismos canales, o bien mediante canales distintos que proporcionan caminos de acceso al mismo dispositivo. 4. Todos los procesadores pueden desempeñar las mismas funciones (de ahí el término simétrico). 5. El sistema está controlado por un sistema operativo integrado, que proporciona la interacción entre los procesadores y sus programas en los niveles de trabajo, tarea, fichero, y datos. El significado de los puntos 1 a 4 es claro. El punto 5 corresponde a una de las diferencias con los sistemas multiprocesador débilmente acoplados, tales como los «clusters». En estos, la unidad de interacción física es normalmente un mensaje o un fichero completo. En un SMP, la interacción se puede producir a través de elementos de datos individuales, y puede existir un elevado nivel de cooperación entre procesadores. El sistema operativo de un SMP planifica la distribución de procesos o hilos (threads) entre todos los procesadores. Un SMP tiene las siguientes ventajas potenciales con respecto a una arquitectura monoprocesador: • Prestaciones: Si el trabajo a realizar por un computador puede organizarse de forma que partes del mismo se puedan realizar en paralelo, entonces un sistema con varios procesadores proporcionara mejores prestaciones que uno con un solo procesador del mismo tipo (Figura 16.3). • Disponibilidad: En un multiprocesador simétrico, debido a que todos los procesadores pueden realizar las mismas funciones, un fallo en un procesador no hará que el computador se detenga. • Crecimiento incremental: Se pueden aumentar las prestaciones del sistema, añadiendo más procesadores. • Escalado: Los fabricantes pueden ofrecer una gama de productos con precios y prestaciones diferentes, en función del número de procesadores que configuran el sistema. Es importante resaltar que los anteriores son beneficios potenciales, más que beneficios garantizados. El sistema operativo debe disponer de herramientas y funciones que permitan explotar el paralelismo presente en un SMP. Una característica atractiva de un SMP es que la existencia de varios procesadores es transparente al usuario. El sistema operativo se encarga de la sincronización entre los procesadores, y de la planificación de los hilos o de los procesos, asignándolos a los distintos procesadores. 3.8 ORGANIZACIÓN DEL MULTIPROCESADOR La Figura 16.4 describe en términos generales la organización de un sistema multiprocesador. Hay dos o más procesadores. Cada procesador es autónomo, incluyendo una unidad de control, una ALU, registros y, posiblemente, cache. Cada procesador tiene acceso a una memoria principal compartida y a los dispositivos de E/S, a través de alguna forma de mecanismo de interconexión. Los procesadores pueden comunicarse entre sí a través de la memoria (mensajes e información de control almacenada en áreas comunes para datos). También es posible que los procesadores intercambien señales directamente. La memoria, a menudo, se organiza de forma que sean posibles los accesos simultáneos a bloques de memoria separados. En algunas configuraciones, cada procesador puede tener también su propia memoria principal privada y sus canales de E/S, además de los recursos compartidos. La organización de un sistema de multiprocesador puede clasificarse como sigue: • Bus de tiempo compartido o común • Memoria multipuerto • Unidad de control central Bus de tiempo compartido El bus de tiempo compartido es el mecanismo mis simple para construir un sistema multiprocesador (Figura 16.5). La estructura y las interfaces son básicamente las mismas que las de un sistema de un único procesador que utilice un bus para la interconexión. El bus consta de líneas de control, dirección y datos. Para facilitar las transferencias de DMA con los procesa-dores de E/S, se proporcionan los elementos para él: • Direccionamiento: Debe ser posible distinguir los módulos del bus para determinar la fuente y el destino de los datos. • Arbitraje: Cualquier modulo de E/S puede funcionar temporalmente como maestro. Se proporciona un mecanismo para arbitrar entre las peticiones que compiten por el con trol del bus, utilizando algún tipo de esquema de prioridad. • Tiempo compartido: Cuando un modulo está controlando el bus, los otros módulos no tienen acceso al mismo, y deben, si es necesario, suspender su operación hasta que dispongan del bus. Estas características monoprocesador son utilizables directamente en una configuración de SMP. En este caso, hay varias CPU, además de varios procesadores de E/S, que intentan tener acceso a uno o más módulos de memoria a través del bus. La organización del bus presenta diversas ventajas en comparación con otras propuestas: • Simplicidad: Es la aproximación mas simple para organizar el multiprocesador. La interfaz física, y la lógica de cada procesador para el direccionamiento, para el arbitraje, y para compartir el tiempo del bus, es el mismo que el de un sistema con un solo procesador. • Flexibilidad: Es generalmente sencillo expandir el sistema conectando mas procesadores al bus. • Fiabilidad: El bus es esencialmente un medio pasivo, y el fallo de cualquiera de los dispositivos conectados no provocaría el fallo de todo el sistema. La principal desventaja de la organización de bus son las prestaciones. Todas las referencias a memoria pasan por el bus. En consecuencia, la velocidad del sistema está limitada por el tiempo de ciclo. Para mejorar las prestaciones, es deseable equipar a cada procesador con una memoria cache. Esta reduciría dramáticamente el número de accesos. Típicamente, los PC y las estaciones de trabajo de tipo SMP tienen dos niveles de cache: una cache LI interna (en el mismo chip que el procesador), y una cache L2 externa o interna. El uso de caches introduce algunas consideraciones de diseño nuevas. Puesto que cada cache local contiene una imagen de una parte de la memoria, si se altera una palabra en una cache, es concebible que eso podría invalidar una palabra en otra cache. Para evitarlo, se debe avisar a los otros procesadores de que se ha producido una actualización de memoria. Este problema se conoce como problema de coherencia de cache, que es resuelto típicamente por el hardware, más que por el sistema operativo. La Sección 16.3 trata este punto. Memoria multipuerto La propuesta de memoria multipuerto permite el acceso directo e independiente a los módulos de memoria desde cada uno de los procesadores y los módulos de E/S (Figura 16.6). Se necesita una cierta lógica asociada a la memoria para resolver los conflictos. El método que se utiliza a menudo para resolver conflictos consiste en asignar prioridades fijas a cada puerto de memoria. Normalmente, la interfaz física y eléctrica en cada puerto es idéntica a la que aparece en un modulo de memoria de un solo puerto. Así, se necesitan pocas o ninguna modificación en los procesadores o en los módulos de E/S para acomodar la memoria multipuerto. La aproximación de la memoria multipuerto es más compleja que la aproximación de bus, precisándose añadir al sistema de memoria una buena cantidad de lógica. No obstante, se consiguen mejores prestaciones, puesto que cada procesador tiene un camino dedicado a cada modulo de memoria. Otra ventaja del multipuerto es que permite configurar partes de la memoria como «privadas» para uno o más procesadores y/o módulos de E/S. Esta característica permite incrementar la seguridad frente a accesos no autorizados, y para el almacenamiento de rutinas de restablecimiento en zonas de memoria no susceptibles de ser modificadas por otros procesadores. Otra cuestión más: se debe utilizar una estrategia de escritura directa {«writethrough») para controlar la cache, puesto que no hay forma de avisar a los otros procesadores de una actualización de memoria. Unidad de control central La unidad de control central encauza las distintas secuencias de datos entre los distintos módulos independientes: procesador, memoria y E/S. El controlador puede almacenar temporal-mente peticiones, y realizar las funciones de arbitraje y temporización. Además, puede transmitir mensajes de estado y control entre los procesadores y alertar sobre cambios en las caches. Puesto que toda la lógica de coordinación de la configuración de multiprocesador se con-centra en la unidad central de control, las interfaces de E/S, memoria y procesador, no sufren cambios esenciales. Esto proporciona la flexibilidad y la simplicidad de las interfaces en la aproximación de bus. Las desventajas clave de esta aproximación son que la unidad de control es bastante compleja, y que representa un cuello de botella potencial para las prestaciones. La estructura de unidad de control central es bastante común en grandes computadores (mainframes) de varios procesadores, tales como los miembros más grandes de la familia S/ 370 de IBM. Hoy día, esta alternativa es poco frecuente. 3.9 SISTEMAS OPERATIVOS DEL MULTIPROCESADOR Consideraciones de diseño de un sistema operativo de multiprocesador Un sistema operativo de SMP gestiona los procesadores y demás recursos del computador, para que el usuario perciba un solo sistema operativo controlando los recursos del sistema. De hecho, el computador debería parecer un sistema monoprocesador con multiprogramación. Tanto en un SMP como en un sistema monoprocesador, pueden estar activos varios trabajos o procesos al mismo tiempo, y es responsabilidad del sistema operativo planificar su ejecución y asignar los recursos. Un usuario puede desarrollar aplicaciones que utilizan varios procesos o varios hilos dentro de un proceso, sin tener en cuenta si se dispone de uno o de varios procesadores. proporcionar Así, toda un la sistema operativo funcionalidad de de un multiprocesador, sistema operativo debe con multiprogramación, más las características adicionales que permitan utilizar varios procesadores. Entre los puntos clave de diseño están: • Procesos concurrentes simultáneos: Las rutinas del sistema operativo deben ser reentrantes, para permitir que varios procesadores puedan ejecutar simultáneamente el mismo código IS. Con varios procesadores ejecutando la misma o distintas partes del sistema operativo, las tablas y las estructuras de gestión del sistema operativo deben manejarse apropiadamente, para evitar bloqueos u operaciones no validas. • Planificación: La planificación puede realizarla cualquier procesador, por lo que deben evitarse los conflictos. El planificador debe asignar los procesos preparados a los procesadores disponibles. • Sincronización: Puesto que hay varios procesos que pueden acceder a espacios de memoria y a recursos de E/S compartidos, debe proporcionarse una sincronización efectiva. La sincronización asegura la exclusión mutua y la ordenación de eventos. • Gestión de Memoria: La gestión de memoria en un multiprocesador debe comprender todos los aspectos propios de los computadores monoprocesadores, discutidos en el Capitulo 7. Además, el sistema operativo debe explotar el paralelismo que proporciona el hardware (por ejemplo, las memorias multipuerto) para obtener mejores prestaciones. Los mecanismos de paginación en procesadores distintos deben coordinarse para mantener la consistencia cuando varios procesadores comparten una página o un segmento y para decidir sobre el reemplazo de páginas. • Fiabilidad y tolerancia ante los fallos: El sistema operativo debería hacer posible una degradación gradual, cuando se produce un fallo en un procesador. El planificador y otros elementos del sistema operativo, deben reconocer la pérdida de un procesador y reestructurar las tablas de gestión en consecuencia. Un SMP como gran computador La mayoría de los PC y estaciones de trabajo de tipo SMP utilizan una estrategia de interconexión basada en un bus, tal y como muestra la Figura 16.5. Resulta ilustrativo analizar una aproximaci6n alternativa, que se utiliza en las implementaciones más recientes de la familia de grandes computadores (mainframes) IBM S/39Q [MAK97]. La Figura 16.7 muestra la organización general del SMP S/390. Esta familia de sistemas incluye, desde computadores monoprocesador con un módulo de memoria principal, hasta sistemas con diez procesadores y cuatro módulos de memoria en la gama alta. La configuración incluye uno o dos procesadores adicionales, que se utilizan como procesadores de E/S. Los componentes clave de la configuración son los siguientes: • Procesador (PU, Processor Unit): Es un microprocesador CISC, en el que las instrucciones más frecuentemente ejecutadas se encuentran cableadas; mientras que las restantes se ejecutan por el «firmware». Cada PU incluye una cache LI unificada almacena datos e instrucciones) de 64 Kbytes. El tamaño de la cache LI se ha determinado para que quepa en el mismo chip del PU, de forma que se consiga acceder a ella en un solo ciclo. • Cache L2: Cada cache L2 contiene 384 Kbytes. Las caches L2 se organizan en grupos de dos, de forma que cada grupo recibe accesos de tres PU, y proporciona acceso a todo el espacio de memoria principal. • Adaptador bus-red de interconexión (BSN, Bus-switching network): Los BSN interconectan las caches L2 y la memoria principal. Cada BSN también incluye una cache de nivel 3 (L3), con un tamaño de 2 Mbytes. • Módulos de memoria: Cada módulo dispone de 8 Gbytes de memoria, con una capacidad total de 32 Gbytes de memoria. Hay una serie de características interesantes en la configuración del SMP S/390 que pasamos a discutir: • Interconexión conmutada • Caches L2 compartidas • Cache L3 Interconexión conmutada En los PC y las estaciones de trabajo de tipo SMP, es común utilizar una organización basada en un único bus compartido (Figura 16.5). Con esta organización, el bus pasa a ser un cuello de botella que afecta a la escalabilidad (escalado de las prestaciones cuando se amplía el sistema) del diseño. El S/390 se enfrenta a este problema de dos formas. En primer lugar, la memoria principal se distribuye en cuatro módulos, cada una con su propio controlador de almacenamiento que puede gestionar los accesos a memoria a velocidades elevadas. El tráfico de cargas desde memoria se reduce en un factor de cuatro, gracias a los cuatro caminos independientes que hay a las cuatro áreas en las que se ha dividido la memoria. En segundo lugar, las conexiones desde los procesadores (en concreto desde las caches L2) a cada modulo de memoria, no se producen como en un bus compartido, sino más bien como en un enlace punto a punto, donde cada enlace conecta un grupo de tres procesadores, a través de una cache L2, con un BSN. El BSN, por otra parte, realiza la función de un conmutador que puede encaminar datos entre sus cinco enlaces (cuatro enlaces con las memorias L2 y uno con el modulo de memoria). Con respecto a los cuatro enlaces con las caches L2, el BSN conecta los cuatro enlaces físicos a un bus de datos lógico. De esta forma, una señal proveniente de uno de los cuatro enlaces con las caches L2, se reenvía a cada uno de los restantes tres enlaces a las caches L2. Esto es necesario para permitir la coherencia de cache. Hay que tener en cuenta que, aunque hay cuatro módulos de memoria distintas, cada PU y cada L2 solo tienen dos puertos físicos en la dirección de memoria principal. Esto se debe a que cada cache L2 solo almacena datos de la mitad de la memoria principal. Se necesitan dos caches para dar servicio a toda la memoria principal, y cada PU debe conectarse a ambas caches. Caches L2 compartidas En un esquema típico de cache de dos niveles para un SMP, cada procesador tiene caches LI y L2 propias. En los últimos años, ha aumentado el interés en el concepto de utilizar una cache L2 compartida. En una de las primeras versiones del SMP S/390, conocida como generación 3 (G3), IBM utilizaba caches L2 específicas para cada procesador. En las versiones más recientes (G4 y G5), se utilizan caches L2 compartidas. Dos consideraciones han causado este cambio: 1. En el cambio de la versión G3 a la G4, IBM pasó a utilizar microprocesadores con el doble de velocidad. Si se hubiese mantenido la organización G3, se hubiese producido un incremento significativo del tráfico a través del bus. Al mismo tiempo, se deseaba utilizar tantos componentes de las versiones G3 como fuese posible. A no ser que se mejorase significativamente el bus, el BSN podría llegar a ser un cuello de botella. 2. El análisis de las cargas de trabajo de un S/390 típico mostraba un nivel elevado de instrucciones y datos compartidos por los procesadores. Estas consideraciones llevaron al equipo de diseño de la versión G4 del S/390 a considerar el uso de una o más caches L2 compartidas por varios procesadores (cada procesador dispone de una cache LI interna). A primera vista, compartir la cache L2 podría parecer una mala idea. El acceso a memoria desde los procesadores podría ser más lento, debido a que los procesadores deben pugnar por el acceso a la cache L2. Sin embargo, si, de hecho, varios procesadores comparten un elevado volumen de datos, una cache compartida puede incrementar el rendimiento en lugar de disminuirlo, ya que los datos compartidos que se encuentran en la cache compartida se obtienen más rápidamente que si se debiera acceder a ellos a través del bus. Una propuesta considerada en el diseño de la versión G4 del S/370 fue utilizar una única cache de gran tamaño y compartida por todos los procesadores. Esta alternativa podría proporcionar una mejora de las prestaciones del sistema gracias a la elevada eficiencia de la cache, pero se hubiera requerido un rediseño completo de la organización del bus del sistema. No obstante, el análisis de prestaciones indicaba que utilizar caches compartidas en cada uno de los BSN existentes, proporcionaría gran parte de las ventajas de utilizar caches compartidas con un tráfico reducido a través del bus. La eficacia de las caches compartidas se confirmo a través de medidas de prestaciones, que mostraban que la cache compartida mejoraba significativamente los niveles de aciertos frente al esquema de caches locales que se utilizaba en la organización de las versiones G3 [MAK97]. Estudios sobre la eficacia de las caches compartidas por los microprocesadores de los SMP de pequeña escala confirman que esta aproximación es correcta (por ejemplo [NAYF96]). Cache L3 Otra característica interesante del SMP S/390 es el uso de un tercer nivel de cache (L3)1. Las caches L2 se sitúan en los BSN y de esta forma, cada cache L3 proporciona un buffer entre las caches L2 y una tarjeta de memoria. La cache L3 reduce el retardo de acceso a los datos que no estén, ni en la cache LI, ni en la cache L2 del procesador que los solicita. El dato está disponible mucho más rápidamente que si hubiera que acceder a la memoria principal, en el caso de que la línea de cache este siendo compartida con otro procesador y no se haya utilizado recientemente por el procesador que la solicita. La Tabla 16.1 muestra las prestaciones que se obtienen en este SMP con tres niveles de cache, para el caso de una carga de trabajo típica de una aplicación comercial del S/390, que carga considerablemente el bus y la memoria [DOET97]2. La penalización de acceso al almacenamiento es el retardo entre la petición del dato a la jerarquía de caches, y el momento en el que se obtiene el primer bloque de datos de 16 bytes. La cache LI muestra un porcentaje de aciertos del 89 %, de forma que el 11 % de los restantes accesos a memoria deben resolverse en el nivel L2, L3, o en memoria. De este 11 %, un 5 % se resuelven en la cache L2, y así sucesivamente. Utilizando estos tres niveles de cache, solo un 3 % de las referencias necesitan acceder a memoria. Sin el tercer nivel, la proporción de accesos a memoria principal se duplicaría. Tabla 16.1. Porcentajes típicos de aciertos de cache en una configuración del SMP S/390 Subsistema de memoria Cache Li Cache L2 Cache L3 Memoria Penalización de acceso (ciclos de PU) 15 14 32 Tamaño de cache 32 KB 256KB 2MB 8 GB Porcentaje de aciertos 89 5 33