Apuntes_Victoria_23-2-07

__**Apuntes 23/02/07**__

Existen distintas formas de implementar arquitecturas de altas prestaciones con procesadores especializados. Todos estos procesadores tienen unas __características comunes__:

- //VLIW// - //Paralelismo asimétrico//: existen varios procesadores y cada uno tiene una funcionalidad. - //Multithreading//. - //Paralelismo simétrico//.

A todo lo anterior de le añade la //conectividad//. Hoy en día casi todo los ordenadores llevan incorpoorados Bluetooth... porque hoy día se da por sentado que la mayor parte de los ordenadores van a trabajar interactuando con el exterior. Así pues, vemos que hay arquitecturas complejas dentro del ordenador, y a eso se le añade la posibilidad de conectarse con otros equipos.

El objetivo de la arquitectura de altas prestaciones en todo momento será **aprovechar de forma eficiente los recursos del ordenador**, tratando, por ejemplo, de implementar las aplicaciones con varios hilos de ejecución en paralelo. Esta forma de aprovechar los recursos es lo que se conoce como //**programación concurrente o distribuida**//.

¿Qué lenguaje de programación usaremos? En programación concurrente o distribuida, se puede usar en cada caso el **lenguaje más adecuado**. Nos centraremos especialemente en: - Ruby. - Perl - Javascript

Todo lo que veremos será a nivel de aplicación, y trabajaremos de forma independiente del lenguaje. El motivo por el que nos centraremos en la aplicación y no en mejorar el Hw, es porque el Hw es algo muy cambiante y no merece la pena estudiar en profundidad una arquitectura determinada, pues se queda obsoleta inmediantamente.

__Definición de computación distribuida__

Se habla de computación distribuida cuando se tienen varios sistemas con capacidad de procesamiento que trabajan de forma conjunta. Trataremos de programar estos sistemas distribuidos y tartaremos que sean **abiertos** y **escalables**. La escalabilidad es una propiedad muy importante, de modo que no sea un inconveniente añadir un nodo más al sistema. También deben ser **transparentes** y **tolerantes a fallos.** La transparencia have referencia a que no se tenga que especificar implícitamente qué recursos de qué sistema se están usando.

¿Qué diferencia hay entre computación paralela y distribuida? En la computación paralela hay que tener conocimiento de cada uno de los nodos. En la distribuida no, sólo hay que tener conocimiento de los nodos existentes y de cómo están conectados, pero hay cierta transparencia. La computación paralela por el contrario es complemente opaca, hay que conocer qué hace cada máquina, y esto hace que esté en desuso.

__Tipos de sistemas distribuidos__:

- //Sistema Cluster//: son de bajo coste y homogéneos. El arranque se hace de forma síncrona, casi todos los sitemas cuando se arranacan hacen una determinada tarea. El prinicipal inconveniente es que hay que tener control sobre todos los equipos, hay un sólo administrador. Los ordenadores deben estar **físicamente unidos**,

- //Sistemas Grid//: se diferencian de los anteriores en que ahora no hay un sólo adminstrador, sino varios, por lo que es mucho más senncillo su control. En este caso no es necesario que los ordneadores estén físicamente unidos, aunque sí tendrán que tener características comunes.

- //Redes overlay//: son redes que están por encima de otras redes, y se crean a nivel de aplicación. Un ejemplo sería la red emule, que se construye a partir de todas las personas que están ejecutando el programa.

- //Sistemas entre pares//: también están basados en aplicación, y su característica principal es que no diferencia entre cliente y servidor, no hay una jerarquía explícita en la red. Tiene un sistema de superpares que tienen unas capacidades específicas. Algunas redes P2P son Bittorrent y eMule. Ambos son similares en el sentido de que descaragan de varios sitios para opmitimizar los recursos de la red. La diferencia es en Bitttorrent la red es a nivel de ficheros, la red la forman todos los que tienen el fichero, es realmente una red entre pares, y en emule la red es completamente de aplicación.

//- Computación de ciclos redundantes:// muchos porcesadores tienen ciclos "para tirar", ciclos redundantes, y se trata de aprovechar dichos ciclos para realizar cálculos.

Todos los sistemas anteriores son sistemas **distribuidos simétricos**. Pero existen otros **sistemas de distribución asimétricos** más clásicos que son los sitemas //cliente-servidor//. Han evolucionado hacia sistemas multi-tier, que se caracterizan porque entre el cliente y el servidor hay muchas etapas intermedias. Es lo que se denomina middleware, que es cualquier cosa situada entre el cliente y el servidor.

__Servicios Web__

El cliente conoce la sintaxis de comunciación con el servidor y conoce, cuando utiliza una función, qué es lo que va a devolver esa función. Utiliza el paradigma de la FUNCION, frente al paradigma del fichero. Los objetos, las funciones son perfectamente conocidas por todas las partes.