Por procesamiento paralelo entendemos la capacidad de utilizar varios procesadores (elementos de proceso) para ejecutar diferentes partes del mismo programa simultáneamente. El objetivo principal del paralelismo es el reducir el número de ciclos de ejecución de un programa en relación al número de procesadores que existen en el sistema.
El concepto de resolución de problemas mediante procesamiento paralelo no es nuevo, de hecho esta basado en el viejo y conocido método de divide y vencerás utilizado para resolver problemas matemáticos, físicos o cualquier tipo de problema de carácter general. La típica analogía para explicar las ventajas y límites de este método es la siguiente: tenemos una biblioteca que hemos decidido ordenar mediante el criterio tipo-autor, una solución sería separar todos los libros por su tipo en pilas y luego ordenar cada uno de esas pilas por el nombre de su autor. La resolución paralela del problema no distaría mucho de la que hemos dado, salvo que añadiríamos una segunda persona en la primera fase de la ordenación, de manera que, cada persona catalogase según el tipo la mitad de la biblioteca, tardándose la mitad de tiempo en esta fase, y luego que cada uno fuese colocando las pilas de los tipos por autor. La solución paralela obtiene como ventaja, en este caso, la reducción del tiempo a la mitad para solucionar el problema. ¿Qué sucedería si añadiésemos más personas dedicadas a catalogar primero por tipo y luego por autor nuestra biblioteca? En un principio, cuantas más personas trabajen en el proceso, antes acabará éste, es decir, existe una relacción lineal entre el tiempo de resolución del problema y el número de personas que trabajan en la ordenación de la biblioteca, pero por otro lado, parece estúpido contratar a 200 personas para colocar una biblioteca de 200 libros. Esta analogía muestra las ventajas que puede tener la resolución de un problema mediante el paradigma del procesamiento paralelo, pero también nos muestra los límites que este pone en la solución de problemas.
Relativo al mundo de la tecnología y al campo de los procesadores en general, se descubrió que las arquitecturas paralelas podían solventar de manera más rápida cierta serie de problemas. Desde 1955 personas como Gene Amdahl2.1 han investigado en el campo de arquitecturas paralelas obteniendo aquellos parámetros que optimizaban las arquitecturas así como aquellos que hacían que el coste-rendimiento bajase. Empresas como IBM, DEC y desde luego muchas otras organizaciones como el MIT, se llevan interesando en la computación paralela desde las décadas de los 50-60, y de hecho siguen investigando y obteniendo resultados de una u otra manera en la actualidad, hasta el punto en que prácticamente todos los ordenadores que existen actualmente en el mercado, explotan de una u otra manera soluciones paralelas.
En la década de los 80, la compartición de recursos mediante redes de computadores hizo posible un nuevo planteamiento para aprovechar no solo recursos como capacidad de almacenamiento o capacidad de impresión, sino para utilizar ciclos de CPU de otras máquinas conectadas a la red (los llamados multicomputadores). En los 70 y a primeros de los 80 personas como Bruce J.Nelson2.2 de Xerox, expusieron trabajos teóricos de cómo se podía utilizar mediante software esta capacidad de procesamiento paralelo que hasta ahora estaba relegada principalmente al hardware, limitándose el software a aprovechar esta mediante técnicas de programación explícita. En 1985, Intel produjo el primer iPSC/1. Este multicomputador era una combinación de muchos 80286 conectados en una topología hipercubo a través de controladoras ethernet, mostrando que era real y posible utilizar este tipo de redes para explotar los sistemas paralelos. En la década de los 90, el uso de las redes de computadores se ha extendido de manera exagerada en comparación a otros campos como pueden ser el de los Sistemas Operativos o el de Arquitectura de Computadores.
Otro concepto muy importante que no se debe confundir con el de paralelo y que a veces encontramos como sinónimo de éste de manera incorrecta, es el término concurrente. Edger Dijstra en 1965 describió el problema de las regiones críticas en las arquitecturas paralelas y como solucionarlo mediante semáforos (solucionado en 1968), pero fue en 1975 cuando introdujo el concepto de concurrencia,basándo se en sus trabajos anteriores. Actualmente la implementación de concurrencia la realizan muchos lenguajes de programación. Si por paralelismo entendíamos procesos que se ejecutan en varios elementos de proceso para llegar la resolución conjunta de un problema, por concurrencia entendemos procesos que se ejecutan de manera independiente en un mismo procesador, para llegar a la resolución de un mismo problema. Un ejemplo de concurrencia lo tenemos en prácticamente todos los sistemas operativos que utilizamos en la actualidad, puesto que comparten el mismo procesador para prestar un único servicio al usuario. Otro ejemplo sería la utilización de un programa concurrente en el cual dos procesos solucionen un problema único2.3. El uso de concurrencia y de paralelismos conllevan principalmente un problema de comunicación entre los elementos de proceso o los procesos entre sí para que la resolución de un problema mediante estos paradigmas sea viable.
Se pueden distinguir dos épocas en las cuales los problemas que han provocado la aparición de sistemas paralelos y distribuidos han sido diferentes: por un lado, están las décadas de los 60-70-802.4, en las cuales el máximo problema era optimizar la capacidad de procesamiento, y de esta manera aumentar el rendimiento de las máquinas y la producción de estas. Por otro lado, desde la década de los 90 hasta la actualidad los problemas han aumentado: a los que existían en las décadas anteriores se han sumado los provocados por la red Internet y el fenómeno de la nueva economía. Este último punto es muy sencillo de entender, la nueva economía está formada por comercios a imagen y semejanza de los de la tradicional, pero con las ventajas aportadas por el mundo de las máquinas. Son nuevas tiendas y negocios que funcionan 24 horas al día 7 días a la semana, que no necesitan de personal, excepto técnico, para su puesta en marcha y al que se accede a través de Internet. Con este nuevo tipo de negocio, muchas empresas hacen inversiones en equipo y personal técnico, para ofrecer a nivel mundial soluciones que de otra manera podrían ser inviables por precio, tiempo u organización. Las empresas exigen a esta nuevas tecnologías, lo mismo que han exigido siempre a las antiguas:
El último punto, es importante por motivos claramente económicos y supone un gran reto en el diseño de sistemas para que estos puedan adaptarse de manera eficiente a los cambios. Este último punto nos llevará a un término muy importante que se utilizará a lo largo de todo el documento, la escalabilidad. Veamos con un ejemplo el por qué se necesitan sistemas que se adapten a los cambios.
Pongamos una empresa que quiere poner un negocio en Internet, contratan un asesor técnico que les explica que para lo que ellos quieren hacer necesitarán una capacidad de proceso equivalente al número máximo de clientes potenciales que creen que sus productos pueden acaparar en el mercado. La empresa compra los ordenadores que poseen dicha capacidad de proceso, sabiendo que éstos cumplirán con las expectativas iniciales planteadas, de manera que todos los recursos invertidos estarán siendo utilizados de manera continua. Pasado un tiempo, la empresa se da cuenta que sus productos son demasiado requeridos y que el sistema se quedó pequeño para el volumen de ventas que ellos poseen, vuelven a contactar con el asesor técnico y este les explica que la única opción es comprar un segundo sistema, esta vez el doble de potente (y varias veces más costoso) que el anterior, a lo que la empresa decide negarse por que la inversión realizada en el primer equipo aún está por amortizarse, además de el gasto inútil que habrían realizado en el primer equipo, que en un principio quedaría inoperativo después del cambio. La competencia decide invertir en otro sistema más potente y mejor diseñado, con lo que da mejor servicio a los clientes y en poco tiempo provoca la quiebra de la primera. Pasado un tiempo la demanda de esos productos decrece y los empresarios deciden intentar dedicarse a otro sector, en el cual necesitaran nuevas tecnologías, asíque llaman a otro asesor técnico (esta vez mucho más listo que el anterior), que les explica como podrían reutilizar componentes del anterior sistema ahorrándose la inversión inicial para el nuevo proyecto.
Este ejemplo, algo drástico, refleja la realidad de muchas empresas que han quebrado por su popularidad y por su incapacidad de crecimiento. En cualquier caso, no es más que un ejemplo para introducir un concepto de escalabilidad. Ilustra la ventajas de sistemas fácilmente escalables como pueden ser cluster con respecto a otros, no tan fácilmente escalables, como pueden ser mainframes y otros supercomputadores vectoriales.
Quizás la definición de escalabilidad[LM] más apropiada a los términos que se referirá en el documento es un sistema, incluyendo en él: hardware, software y recursos, se dice escalable si es capaz de escalar, es decir, de acomodar sus recursos y rendimiento a las necesidades solicitadas de manera efectiva o, en el caso de scale down, reducir costes.
En otras palabras, cuando podemos incluir y excluir componentes del sistema, acomodando éste a las características peculiares de un problema concreto. Aunque la mayoría de las veces hablamos de escalar hacia arriba, es decir de hacer el sistema más grande, no es siempre necesario, muchas veces podemos hacer el sistema más pequeño pudiendo reutilizar los componentes excluidos. Que un sistema sea escalable implica:
También es importante hacer notar que los sistemas distribuidos (y otros sistemas paralelos) son, por ahora, los sistemas que más se acercan a la escabilidad lineal, en el ejemplo anterior (supercomputador, mainframe) realmente un equipo el doble de potente no vale el doble sino que vale 4 veces más; en cambio en sistemas distribuidos al doble de precio se consigue prácticamente el doble de rendimiento. Otro ejemplo se puede ver en los precios de microprocesadores: costar el doble no significa el doble de potencia, sino que los precios siguen una curva exponencial según aumentan sus prestaciones.
Respecto a la evolución de los sistemas y con objeto de obtener mayor capacidad de procesamiento, el paralelismo a todos los niveles ha sido una de las soluciones más utilizadas, de hecho en la actualidad, la práctica totalidad de los ordenadores y microprocesadores explotan de una manera u otra tecnologías paralelas, ya sea en multiprocesadores, en multicomputadores o en procesadores independientes. Cada una de estas técnicas de explotar el paralelismo, será explicada de manera breve en el siguiente capítulo de arquitecturas paralelas.
Respecto a los requisitos de alta disponibilidad que requieren las soluciones actuales se proponen soluciones como UPS, generadores redundantes, hardware redundante2.5, soluciones software de alta disponibilidad como la tecnología HA-Linux u otros clusters de este tipo de otras compañías como Piranha de RedHat, Va-Linux, Compaq, Sun (prácticamente todas las grandes marcas de ordenadores han sacado su sistema cluster específico al mercado).
Otra solución existente es el balanceo de carga. Este tipo de cluster es muy utilizado en conjunción con los de alta disponibilidad, sobre todo en las conexiones de servidores a Internet, de manera que varios servidores dan un único servicio de manera transparente a sus usuarios (los cuales creen que solo existe un servidor). Entre estas soluciones están las ofrecidas por diversas marcas, desde Microsoft hasta SCO.
Otro balanceo distinto, relativo a los clusters de alto rendimiento y a la migración de procesos, es el ofrecido por los llamados multicomputadores, o los sistemas distribuidos. En general estos son los sistemas que se acercan más a el concepto de sistema operativo distribuido del que se hablará más adelante. Clusters o sistemas de este tipo son openMosix, Beowulf y otros en el mundo del software libre y otros tantos en el del software propietario.
Como se puede ver existen una infinidad de soluciones distintas para cada sección de problema concreto, no obstante no existe un sistema de carácter general que resuelva todos los problemas planteados debido a las dispares finalidades con que se diseñan.