Download tamaño: 2103808B

Document related concepts
no text concepts found
Transcript
Tema I:
Introducción a la
computación distribuida
Luis López Fernández
Tema I: Contenidos
1.1: Definiciones y conceptos básicos
1.2: Algunas nociones (muy) básicas sobre Java
1.3: Disciplinas base de la computación distribuida
1.4: IPC (Inter Process Communications): Comunicación entre procesos
1.5: Paradigmas de la computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
Lección 1.1
1.1: Definiciones y conceptos básicos
1.2: Algunas nociones (muy) básicas sobre Java
1.3: Disciplinas base de la computación distribuida
1.4: IPC (Inter Process Communications): Comunicación entre procesos
1.5: Paradigmas de la computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
El vocabulario de la computación distribuida
•En ingeniería es imprescindible conocer qué significa cada vocablo sin ambigüedad
•En el ámbito de la computación distribuida, no existe un vocabulario universal
•Esto es debido a:
•Hay múltiples actores involucrados (industria, universidades, individuos)
•Cada actor tiene sus propios intereses (quizás en conflicto)
•El estado del arte evoluciona a gran velocidad
•Esto produce que:
•Se fomente la confusión entre los diferentes actores involucrados
•Se dificulte la estandarización
•En esta asignatura vamos a mantener una serie de convenciones en relación a la
nomenclatura y al vocabulario para poder “hablar con precisión”
•Para ello, definiremos un conjunto de términos de manera precisa
•Habrá que tener en cuenta que, en otros contextos, los términos aquí definidos
pueden tener significados (sensiblemente) diferentes
Tema I: Introducción a las computación distribuida
Luis López Fernández
Modelos de computación y programación
•Definición de Modelo de Computación (Programación):
“Paradigma que proporciona y determina la visión que un programador tiene sobre la
ejecución (y desarrollo) de un programa”
Podemos establecer diferentes clasificaciones de los Modelos de
Computación/Programación dependiendo del criterio que deseemos utilizar:
•Criterio basado en la modularidad del código:
•Modelo de programación orientado a objetos
•Modelos de programación procedimental
•Criterio basado en el tipo de sistema sobre el que ejecuta el programa:
•Modelo de computación monolítica
•Modelo de computación paralela
•Modelo de computación distribuida
•Modelo de computación cooperativa (computación P2P)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Modelos de Computación
•Computación Monolítica
•Procesadores: El programa ejecuta en un solo procesador
•Ligazón: Ninguna
•Requiere: Se requiere el hardware de un ordenador
•Ejemplo: Ejecución de programas en un PC
•Cuestión: ¿Soporta la computación monolítica los sistemas multiusuario?
•Computación Paralela
•Procesadores: El programa ejecuta en un conjunto de procesadores que están
fuertemente ligados
•Ligazón
•Los procesadores cooperan íntimamente y se sincronizan
•Los procesadores comparten memoria principal
•Los procesadores comparten otros recursos del ordenador (periféricos, etc.)
•Requiere:
•Se requiere el hardware de un ordenador
•Se requiere el hardware de varios procesadores (CPUs)
•Se requiere un mecanismo de interconexión y control de los procesadores
•Ejemplo: Ejecución de programas en un ordenador con núcleo dual.
•Cuestión: ¿Puede un mismo programa secuencial ejecutar en múltiples
procesadores?
Tema I: Introducción a las computación distribuida
Luis López Fernández
Modelos de Computación Cont.
•Computación Distribuida
•Procesadores: El programa ejecuta en un conjunto de procesadores que están
ligeramente ligados
•Ligazón:
•Los procesadores pueden intercambiar mensajes
•Los procesadores no comparten (directamente) memoria principal
•Los procesadores no comparten (directamente) sus recursos hardware
•Requiere: (Un sistema distribuido)
•El hardware de varios ordenadores
•Una red de ordenadores
•Hardware de interconexión
•Ejemplo: Ejecución de un programa en una red de área local
•Computación Cooperativa y Computación P2P (un tipo de Comput. Distribuida)
•Procesadores: El programa ejecuta en un conjunto dinámico y muy grande de
procesadores que están débilmente ligados. Se asume que los recursos de
procesador de los que el programa puede disponer están restringidos.
•Ligazón: Similar a la de la computación distribuida
•Requiere: Un sistema distribuido + una red de área extendida (Internet p.e.)
•Ejemplo: Ejecución de un programa en Internet (SETI@home)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Computación Distribuida
•Definición de Computación Distribuida
“Modelo de computación que se caracteriza por estar adaptado a la ejecución de
programas en sistemas distribuidos”
•Definición de Sistema Distribuido
“Sistema informático compuesto por un conjunto de nodos de procesamiento
(ordenadores) que se encuentran ligados a través de una red que permite el intercambio
de mensajes entre los mismos”
•La computación distribuida (los sistemas distribuidos) se ha convertido en un
elemento esencial en la industria en las últimas décadas
•Redes de área local
•Internet
•Aplicaciones Cliente/Servidor
•¿Por qué la computación distribuida es tan popular?
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ventajas de la Computación Distribuida
•Compartición de recursos
•Cualquier recurso disponible en la red puede ser accedido por otros nodos
•Ejemplos: Servidores de ficheros, Servidores de BD, Impresoras, etc.
•Ahorro de costes
•Los ordenadores son baratos, conectar ordenadores en red es barato  Construir
un sistema distribuido es barato
•Computación distribuida  se pueden compartir los recursos más caros
•Ejemplos: Impresora a color, hardware específico, memoria, etc.
•Escalabilidad
•Con computación monolítica, los recursos disponibles están limitados a los
presentes en un solo ordenador
•Con computación distribuida, los recursos disponibles se pueden escalar
introduciendo nuevos nodos (ordenadores) en el sistema soporte
•Tolerancia a fallos
•Un recurso crítico puede ser replicado en varios nodos (distantes) de la red.
•Ejemplo: Copias de seguidad (Backups)
•Ventajas de la Comunicación
•No es posible intercambiar información entre ordenadores distantes sin utilizar un
modelo de computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
Inconvenientes de la Computación Distribuida
•Si hay tantas ventajas, ¿por qué no todas las aplicaciones son distribuidas?
La computación distribuida también presenta serios inconvenientes
Modelo de fallos más complejo y difícil de gestionar
•Computación monolítica
•Lo habitual es que todas las partes de un programa fallen de manera simultánea
•No existe el concepto de fallo de comunicación
•Cuando hay fallos, es posible recuperar el estado de cada parte del programa
•En computación distribuida
•Cada parte del programa falla de manera independiente
•Hay (frecuentemente) fallos en las comunicaciones. La red no es fiable
•Cuando hay fallos, no hay conocimiento global sobre el estado del programa.
Habitualmente no es posible que unas partes del programa puedan tener
información relativa al estado de otras
•Hay más elementos susceptibles de fallo: “un sistema distribuido es aquel en el
que el fallo de un ordenador que, ni siquiera sabes que existe, puede dejar tu
propio ordenador inutilizable” – Leslie Lamport.
Tema I: Introducción a las computación distribuida
Luis López Fernández
Inconvenientes de la Computación Distribuida Cont.
Mayor vulnerabilidad frente a ataques intencionados (aspectos de seguridad)
•Computación monolítica
•Es muy difícil manipular la información que se intercambia entre las distintas
partes de un programa
•Es muy difícil suplantar partes de un programa
•Existe un único administrador conocido y “fiable”
•La administración está centralizada
•Los problemas siempre “vienen de dentro del sistema” (p.e. virus)
•En computación distribuida
•La seguridad de la comunicación no está, en principio, garantizada
•La identidad de las partes no está, en principio, validada
•Puede haber diferentes administradores con “fiabilidad” desconocida
•La administración es descentralizada
•En sistemas abiertos (p.e. Internet), se fomenta el que cualquiera pueda formar
parte del sistema distribuido
•Los problemas pueden venir de fuera (p.e. gusanos) o de dentro del sistema
(p.e. virus)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Inconvenientes de la Computación Distribuida Cont.
Mayor complejidad de desarrollo
•Computación monolítica
•Hay un solo hardware en el que se ejecuta la aplicación
•El modelo de fallos es sencillo de gestionar
•Los problemas de seguridad son mínimos
•Hay información global sobre el estado de las distintas partes del programa
•La comunicación entre los miembros es potente y flexible
•En computación distribuida
•Puede haber múltiples plataformas hardware en las que el programa ejecuta
•El modelo de fallos es complejo y difícil de gestionar
•Los problemas de seguridad son abundantes y con soluciones complejas
•No hay información global sobre el estado de las distintas partes del programa
•La comunicación está limitada (en ancho de banda, en latencia, etc.)
•Diferentes sistemas utilizan diferentes formatos de representación de datos
Tema I: Introducción a las computación distribuida
Luis López Fernández
Las Falacias de la Computación Distribuida
… by Peter Deutsch, James Gosling
•
Las Falacias de la Computación Distribuida son un conjunto de suposiciones
erróneas que suelen asumir los programadores inexpertos en desarrollo de
software distribuido
“All prove to be false in the long run and all cause big trouble and painful learning
experiences” – Peter Deutsch
1.
2.
3.
4.
5.
6.
7.
8.
La red es fiable
La latencia es cero
El ancho de banda es infinito
La red es segura
La topología no cambia
Hay un administrador
El coste de transporte es cero
La red es homogénea
Tema I: Introducción a las computación distribuida
Luis López Fernández
Lección 1.2
1.1: Definiciones y conceptos básicos
1.2: Algunas nociones (muy) básicas sobre Java
1.3: Disciplinas base de la computación distribuida
1.4: IPC (Inter Process Communications): Comunicación entre procesos
1.5: Paradigmas de la computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
Nociones sobre el lenguaje de programación Java
•Java es un lenguaje de programación orientado a objetos desarrollado por James
Gosling en Sun Microsystems a comienzos de los 90
•Los programas Java no se compilan a código nativo (código máquina)
•El código fuente Java no se interpreta (no es un lenguaje de script)
•El código Java se compila a bytecode (un código intermedio menos abstracto que el
código fuente pero más abstracto que el código máquina)
•El bytecode es único (no depende del hardware ni del sistema operativo)
•El bytecode es ejecutado por la Máquina Virtual Java. Hoy en día, lo
más habitual es utilizar compilación JIT (Just-In-Time). El bytecode se
compila a código nativo como paso previo a la ejecución
•Los programas Java pueden ejecutar en cualquier plataforma sobre la
que exista una JVM (Java Vírtual Machine)
•Filosofía “Write once, run anywhere”
•Por tanto, los programas Java son independientes de la plataforma
… digamos que sólo en teoría
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Algo de jerga
•JVM (Java Virtual Machine): Software que virtualiza el entorno de ejecución. Es la
parte que se ocupa de que una aplicación pueda ejecutar con independencia de la
plataforma
•JRE (Java Runtime Environment): Paquete de programas que permiten la ejecución
de una aplicación Java. Incluye una JVM + una API
Dependiendo de la plataforma hardware, se han definido diferentes familias de APIs
JME (Java Platform Micro Edition: para entornos con recursos limitados
JSE (Java Platform Standard Edition): para ordenadores personales
JEE (Java Platform Enterprise Edition): para aplicaciones de empresa distribuidas
•JDK (Java Development Kit): JRE + herramientas necesarias para desarrollar
aplicaciones en el lenguaje Java (compiladores, depuradores, etc.)
•Netbeans: IDE distribuido por Sun Microsystems para el desarrollo en Java
•Eclipse: IDE para el desarrollo en Java distribuido como software libre
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: tipos de programas
•En Java hay tres tipos de programas: las aplicaciones, los applets y los servlets
•Existen otros tipos de programas muy específicos (MIDlets, etc.) pero no los
estudiaremos en este curso
Aplicaciones Java (Java stand-alone applications)
•El programa se ejecuta como un proceso independiente
•El flujo de ejecución debe comenzar siempre en un método estático con nombre
main que se encuentre en una clase pública
public class HolaMundo{
public static void main(String[] args){
System.out.println(“Hola mundo!”);
}
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: tipos de programas Cont.
Java applets
•El programa se ejecuta empotrado en otra aplicación (normalmente un navegador)
•Debe existir una clase pública que extienda la clase Applet de la API estándar y
redefina el método paint de la misma
•El flujo de ejecución comienza en el método paint de la citada clase
•El applet se descarga desde una máquina remota y se ejecuta en una máquina
virtual local
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet {
public void paint(Graphics gc) {
gc.drawString("Hello, world!", 65, 95);
}
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: tipos de programas Cont.
Java servlets
•El programa se ejecuta empotrado en otra aplicación (normalmente un servidor)
•Se debe implementar la interfaz Servlet definida en la API Servlet
•El servlet el un objeto que ejecuta en una máquina remota e interactúa con un
proceso local mediante un protocolo de petición – respuesta
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println(“<html><body>Hello, world!</body></html>");
pw.close();
}
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Hola mundo
•Toda clase pública está definida en un fichero con el mismo nombre que la clase
•El compilador (javac) espera el nombre de un fichero como argumento
•El intérprete (java) espera el nombre de una clase como argumento
•Los ficheros fuente tienen extensión .java, los compilados (bytecode) .class
# vi HolaMundo.java
public class HolaMundo{
public static void main(String[] args){
System.out.println(“Hola mundo!”);
}
}
# javac HolaMundo.java
# ls
HolaMundo.java
HolaMundo.class
# java HolaMundo
Hola mundo!
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Clases y objetos
•Las clases y los objetos son los dos conceptos básicos de Java
•Lleva algún tiempo comprender como manejarlas correctamente
•Un objeto es una entidad que se puede manipular en un programa
•Las clase son una definición de qué “cosas” tienen los objetos
•Las “cosas” que puede tener un objeto son: atributos y métodos
•Los atributos son variables tipadas
•Los métodos son secuencias de instrucciones que actúan sobre los atributos
•Los objetos son siempre instancias de una clase
public class Persona{
private String nombre;
private String apellidos;
public Persona (String nombre, String apellidos){
this.nombre = nombre;
this.apellidos = apellidos;
}
public String getNombreCompleto(){
return nombre + “ “ + apellidos;
}
...
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Miembros estáticos
•Miembro = atributo o método
•En Java, los miembros pueden ser de instancia o de clase
•Un miembro de instancia está asociado a un objeto concreto de esa clase (cada
objeto tiene su propio miembro)
•Un miembro de clase está asociado a una clase (todos los objetos que sean
instancia de esa clase comparten el mismo miembro)
•A un miembro de instancia se accede precediéndolo del identificador de la instancia
•A un miembro de clase se accede precediéndolo de un identificador de instancia o
bien del nombre de la clase
•Los miembros de clase se preceden de la palabra clave static
public class Alumno{
private static numAlumnos = 0;
}
...
Alumno.numAlumnos ++;
Alumno alumno = new Alumno();
System.out.println(“Hay “ + alumno.numAlumnos + “ alumnos”);
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Tipos
•En Java hay dos tipos de datos: objetos y tipos primitivos
•Los tipos primitivos incluyen: int, float, double, byte, boolean, etc.
•Para cada tipo primitivo existe una clase asociada (Integer-int, Float-float, etc.)
•Desde Java 1.5 la conversión de tipos primitivos a sus “objetos” equivalentes es
automática (mecanismo de autoboxing)
•Las variables de tipo primitivo “contienen” su valor
•Las variables de tipo “objeto” contienen una referencia al objeto
•Por seguridad, hay objetos inmutables (no se pueden cambiar)
•Los objetos de la clase String son inmutables
Persona p1 = new Persona(“Luis”, “López”);
Persona p2 = p1;
p2.setNombre(“Patata”);
System.out.println(p1.getNombreCompleto); //Imprime “Patata López”
int a = 22;
int b = a;
b = 3;
System.out.println(“a=” + a); //Imprime “a=22”
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Herencia
•En Java, las clases pueden extenderse mediante un mecanismo de herencia
class ClaseHija extends ClasePadre{…}
•La clase hija “hereda” (posee) los atributos y métodos de la clase padre
•La clase hija solo “ve” los atributos y métodos declarados con visibilidad de
paquete, públicos o protegidos, pero no “ve” los privados
•En Java, todas las clases heredan de la clase Object definida
•En Java no se soportan herencia múltiple
class Empleado extends Persona {
public Empleado(String nombre, String apellidos){
super(nombre, apellidos);
}
public int sueldo;
}
...
Empleado e = new Empleado(“Pedro”, “González”);
System.out.println(e.getNombreCompleto);//Imprime “Pedro González”
...
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Interfaces
•En Java, las interfaces proporcionan un conjunto de declaraciones de métodos
•Las interfaces no proporcionan implementación, son solo declaración
•Las clases pueden “implementar” una interfaz determinada, para ello, deben
proporcionar una implementación de todos los métodos declarados en la interfaz
class MiClase implements MiInterfaz{…}
•Las interfaces son muy útiles para crear abstracciones y reducir el acoplamiento
entre clases
public interface Coin {
public double unitsPerEuro();
}
...
public class Peseta implements Coin{
public double unitsPerEuro(){
return 166.3;
}
...
Peseta peseta = new Peseta();
Coin coin = peseta;
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Excepciones
•En Java, las excepciones son un mecanismo utilizado para indicar que se ha
producido un problema algún tipo de problema durante la ejecución
•Las excepciones se “elevan” o “lanzan” ante situaciones de error o conflicto
throw new IOException(“El fichero no se encuentra”);
•Una excepción “lanzada” rompe el flujo de ejecución del programa y le hace
“saltar” hasta “el llamante” de manera recursiva
•Las excepciones pueden manejarse en cualquier punto de la jerarquía de llamadas
•Una excepción no manejada va progresando en la jerarquía de llamadas hasta que
alcanza el programa principal (método main()) y se detiene el programa en curso
try{
//código que puede elevar una excepción
}catch(TipoDeExcepción e){
//código a ejecutar en caso de excepción
}finally(){
//código que se ejecuta haya o no excepción
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Paquetes
•En Java, existe el paquete como instrumento para organizar grandes proyectos
•El espacio de nombres de paquete es jerárquico y compuesto por etiquetas
separadas por puntos.
•Para declarar que una clase está en un paquete, añadimos al comienzo del fichero
package nombre.de.paquete;
•Para poder utilizar las clases (e interfaces) declaradas en un paquete sin necesidad
de incluir el nombre completo del paquete, podemos utilizar imports
import java.io.*;
import mi.paquete.MiClase;
package mi.paquete;
import java.io.*;
import java.lang.*; //importado por defecto en todos los ficheros
public class MiClase{
//definición de la clase
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Java: Hay que saber más.
•Estas nociones básicas no son suficientes para “saber programar” en Java
•Existen infinidad de libros y de documentación en Internet que pueden ser de ayuda
para aprender o profundizar en las tecnologías Java
Libros:
•Gay Horstmann, “Big Java”, John Wiley & Sons, 2002 (bueno para empezar)
•Bruce Eckel, “Piensa en Java”, Prentice Hall, 2003
Tutoriales y libros en la web:
•Java Programming en Wikibooks: http://en.wikibooks.org/wiki/Java_Programming
•Thinking in Java 3rd Ed: http://www.mindview.net/Books/TIJ/
•Página oficial de Java en Sun Microsystems: http://java.sun.com
•Conocer los fundamentos del lenguaje es condición necesaria para poder
desarrollar aplicaciones en Java, pero no suficiente … tarde o temprano hay que
acudir a la especificación de la API estándar
•http://java.sun.com/j2se/1.4.2/docs/api/ (Para Java 1.4.2)
•http://java.sun.com/j2se/1.5.0/docs/api/index.html (Para Java 1.5)
• … (Para Java 1.6)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Lección 1.3
1.1: Definiciones y conceptos básicos
1.2: Algunas nociones (muy) básicas sobre Java
1.3: Disciplinas base de la computación distribuida
1.4: IPC (Inter Process Communications): Comunicación entre procesos
1.5: Paradigmas de la computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
Disciplinas utilizadas en Computación Distribuida
•La computación distribuida parte de la base de programas que se ejecutan en
múltiples ordenadores que se comunican mediante el intercambio de mensajes
•Para poder enfrentarnos a la problemática de la computación distribuida hay que
contar con conocimientos básicos de tres disciplinas
•Sistemas operativos
•Programas y procesos
•Procesos e hilos
•Concurrencia
•Redes de ordenadores
•Arquitectura de redes
•Protocolos de nivel de red, de nivel de transporte y de nivel de aplicación
•Tecnologías de red
•Ingeniería del software
•Abstracción
•Programación procedimental Vs programación orientada a objetos
•Patrones y arquitecturas
•Modelado de aplicaciones
Tema I: Introducción a las computación distribuida
Luis López Fernández
Programas y procesos
•Definición de Programa Software
“Artefacto construido por un desarrollador utilizando alguna forma de lenguaje de
programación”
•Definición de Proceso
“Un programa que se ejecuta incluyendo: los valores actuales, la información de estado y
los recursos utilizados por el sistema operativo para la ejecución del programa”
•Un proceso es una entidad dinámica, solo existe cuando un programa se ejecuta
Un proceso atraviesa diferentes estados durante su ejecución
Inicio
Terminado
encolado
Diagrama simplificado
de las transiciones de
estado de un proceso
Listo
evento
fin
planificado
espera
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejecutando
Computación Concurrente
•Definición de Computación Concurrente
“Ejecución simultánea de varias tareas computacionales que interactúan entre sí”
•El término “Simultánea” debe ser entendido en sentido amplio: modelos paralelos,
modelos de time-slicing, etc.
•“Concurrency occurs when two or more execution flows are able to run
simultaneously” -- Edsger Dijkstra
•Es necesario que haya interacción para que se considere que hay un “problema de
concurrencia” en un entorno de computación
•Las tareas pueden implementarse como programas separados (que ejecutan en
procesos separados), o como procesos o hilos de ejecución creados por un solo
programa.
¿Qué diferencia hay entre un proceso y un hilo?
Tema I: Introducción a las computación distribuida
Luis López Fernández
Hilos de ejecución (threads) y procesos
Procesos
•Los procesos son independientes
•El proceso tiene una información de estado voluminosa
•Los procesos tienen espacios de memoria separados (desde un proceso no se
puede acceder a las variables de otro)
•Los procesos poseen recursos de manera exclusiva (ficheros, sockets, etc.)
•Dos procesos sólo pueden interactuar con intermediación del sistema operativo
•Los cambios de contexto entre procesos son costosos y lentos
Hilos (pertenecientes al mismo proceso)
•Un solo proceso puede tener múltiples hilos de ejecución
•Todos estos hilos comparten la información de estado del proceso
•Todos los hilos comparten los recursos del proceso (ficheros, sockets, etc.)
•Cada hilo tiene una pequeña información adicional (pila, pc, registros)
•Todos los hilos de un proceso comparten el mismo espacio de memoria
•Los cambios de contexto entre hilos del mismo proceso son muy rápidos
Tema I: Introducción a las computación distribuida
Luis López Fernández
Concurrencia y computación distribuida
•La computación distribuida requiere el uso intensivo de programación concurrente
•Hay tres escenarios muy habituales
Procesos concurrentes ejecutados en múltiples ordenadores
•Aparece en la mayor parte del software distribuidos
•En cada ordenador (nodo) el software ejecuta como un proceso independiente
•Los procesos interactúan sólo a través del intercambio de mensajes (red)
Procesos concurrentes ejecutados en un único ordenador
•Aparece en ordenadores con capacidad multitarea (real o simulada)
•Los procesos interactúan compartiendo recursos o por intercambio de mensajes
Programación concurrente dentro de un mismo proceso
•Aparece cuando múltiples hilos ejecutan dentro de un mismo proceso
•Todos los hilos comparten el espacio de memoria y los mismos recursos
•Aparecen múltiples problemas asociados a la concurrencia
•Son necesarios mecanismos de control de concurrencia dentro de un proceso
Tema I: Introducción a las computación distribuida
Luis López Fernández
Creación de hilos en Java
Creación de hilos en Java
•En Java, un mismo proceso puede tener múltiples hilos de ejecución
•Creación de un nuevo hilo de ejecución en Java (método I)
•Definimos una clase que extienda la clase Thread de la API estándar
•Redefinición del método run() con el código que ejecutará el hilo
public class MiClaseHilo extends Thread{
public void run(){
..código a ejecutar en el hilo
}}
•Lanzamos un nuevo hilo al invocar start() sobre una instancia de la clase
MiClaseHilo obj = new MiClaseHilo();
obj.start();
•Creación de un nuevo hilo de ejecución en Java (método II)
•Definimos una clase que implemente la interfaz Runnable
public class MiClaseHilo implements Runnable{
public void run(){ ...
Lanzamos un hilo con una nueva instancia de la clase Thread
MiClaseHilo obj = new MiClaseHilo();
new Thread(obj).start();
Tema I: Introducción a las computación distribuida
Luis López Fernández
Javadoc de la clase Thread
public class Threadextends Objectimplements Runnable
A thread is a thread of execution in a program. The Java Virtual Machine allows an
application to have multiple threads of execution running concurrently.
Every thread has a priority. Threads with higher priority are executed in preference to
threads with lower priority. Each thread may or may not also be marked as a daemon. When
code running in some thread creates a new Thread object, the new thread has its priority
initially set equal to the priority of the creating thread, and is a daemon thread if and
only if the creating thread is a daemon.
When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which
typically calls the method named main of some designated class). The Java Virtual Machine
continues to execute threads until either of the following occurs:
•The exit method of class Runtime has been called and the security manager has
permitted the exit operation to take place.
•All threads that are not daemon threads have died, either by returning from the
call to the run method or by throwing an exception that propagates beyond the run
method.
•
There are two ways to create a new thread of execution. One is to declare a class to be a
subclass of Thread. This subclass should override the run method of class Thread. An
instance of the subclass can then be allocated and started. For example, a thread that
computes primes larger than a stated value could be written as follows:
Tema I: Introducción a las computación distribuida
Luis López Fernández
(algunos) Métodos de la clase Thread
public static Thread currentThread()
Returns a reference to the currently executing thread object.
public static void yield()
Causes the currently executing thread object to temporarily pause and allow other threads
to execute.
public static void sleep(long millis) throws InterruptedException
Causes the currently executing thread to sleep (temporarily cease execution) for the
specified number of milliseconds. The thread does not lose ownership of any monitors.
Parameters: millis - the length of time to sleep in milliseconds.
Throws:InterruptedException - if another thread has interrupted the current thread. The
interrupted status of the current thread is cleared when this exception is thrown.
public void interrupt()
Interrupts this thread. […] If this thread is blocked in an invocation of the wait(),
wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long),
join(long, int), sleep(long), or sleep(long, int), methods of this class, then its
interrupt status will be cleared and it will receive an InterruptedException.
If this thread is blocked in an I/O operation upon an interruptible channel then the
channel will be closed, the thread's interrupt status will be set, and the thread will
receive a ClosedByInterruptException.
If this thread is blocked in a Selector then the thread's interrupt status will be set
and it will return immediately from the selection operation, possibly with a non-zero
value, just as if the selector's wakeup method were invoked.
If none of the previous conditions hold then this thread's interrupt status will be set.
Throws: SecurityException - if the current thread cannot modify this thread
Tema I: Introducción a las computación distribuida
Luis López Fernández
(algunos) Métodos de la clase Thread
public final void join(long millis) throws InterruptedException
Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait
forever.
Parameters: millis - the time to wait in milliseconds.
Throws: InterruptedException - if another thread has interrupted the current thread. The
interrupted status of the current thread is cleared when this exception is thrown.
public final void setDaemon(boolean on)
Marks this thread as either a daemon thread or a user thread. The Java Virtual Machine
exits when the only threads running are all daemon threads.
This method must be called before the thread is started.
public static boolean holdsLock(Object obj)
Returns true if and only if the current thread holds the monitor lock on the specified
object.
This method is designed to allow a program to assert that the current thread already
holds a specified lock:
Parameters: obj - the object on which to test lock ownership
destroy(), stop():
Estos métodos permiten destruir/parar un thread “en seco”. No se liberan los locks, por
lo que su uso no se recomienda (las nuevas APIs los consideran deprecated). Si estamos
usando alguno de estos métodos para algo es muy probable que estemos haciendo algo mal.
Tema I: Introducción a las computación distribuida
Luis López Fernández
Control de concurrencia
Condiciones de carrera
•Las condiciones de carrera suceden cuando se intercalan de manera arbitraria
comandos procedentes de hilos diferentes sobre un mismo recurso
•Las condiciones de carrera se traducen en comportamientos no deterministas y
arbitrarios de los programas
Ejemplo
•Imaginemos una aplicación bancaria concurrente
•Cada cuenta tiene un saldo medido en euros
•Múltiples hilos de ejecución pueden operar sobre el saldo (p.e. ingreso)
•Transferencia entre cuentas
Hilo I (transf. 100)
Hilo II (transf. 1)
x1 = leerCuenta(A);
x1 = x1 – 100
escribirCuenta(A, x1)
y1 = leerCuenta(B)
y1 = y1 + 100
escribirCuenta(B, y1)
x2 = leerCuenta(A);
x2 = x2 – 1
escribirCuenta(A, x2)
y2 = leerCuenta(B)
y2 = y2 + 1
escribirCuenta(B, y2)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Control de concurrencia Cont.
Hilo I (transf. 100)
Hilo II (transf. 1)
A
B
x1
y1
x2
y2
x1 = leerCuenta(A);
110
0
110
-
-
-
x1 = x1 – 100
110
0
10
-
-
-
escribirCuenta(A, x1)
10
0
10
-
-
-
y1 = leerCuenta(B)
10
0
10
0
-
-
y1 = y1 + 100
10
0
10
100
-
-
escribirCuenta(B, y1)
10
100
10
100
-
-
x2 = leerCuenta(A);
10
100
-
-
10
-
x2 = x2 – 1
10
100
-
-
9
-
escribirCuenta(A, x2)
9
100
-
-
9
-
y2 = leerCuenta(B)
9
100
-
-
9
100
y2 = y2 + 1
9
100
-
-
9
101
9
101
-
-
9
101
escribirCuenta(B, y2)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Control de concurrencia Cont.
Hilo I (transf. 100)
Hilo II (transf. 1)
A
B
x1
y1
x2
y2
x1 = leerCuenta(A);
110
0
110
-
-
-
x1 = x1 – 100
110
0
10
-
-
-
10
0
10
-
-
-
x2 = leerCuenta(A);
10
0
10
-
10
-
x2 = x2 – 1
10
0
10
-
9
-
escribirCuenta(A, x2)
9
0
10
-
9
-
9
0
10
-
9
0
y1 = leerCuenta(B)
9
0
10
0
9
0
y1 = y1 + 100
9
0
10
100
9
0
escribirCuenta(B, y1)
9
100
10
100
9
0
y2 = y2 + 1
9
100
10
100
9
1
escribirCuenta(B, y2)
9
1
10
100
9
1
escribirCuenta(A, x1)
y2 = leerCuenta(B)
Se han perdido 100 euros por un problema de control de concurrencia!!
Tema I: Introducción a las computación distribuida
Luis López Fernández
Control de concurrencia en Java
•El control de concurrencia básico consta de dos pasos:
1- Detectar qué partes del programa no pueden ser ejecutadas de manera
simultánea por varios hilos de ejecución. A estas partes se les denomina
secciones críticas.
2- Utilizar algún mecanismo que impida la ejecución simultánea de las
secciones críticas por parte de dos o más hilos.
•Los programas, objetos y librerías que no presenta problemas de concurrencia se
dice que son thread-safe
•Existen diferentes mecanismos para el control de concurrencia en programas
multihilo (dependiendo del SO, del lenguaje de programación, etc.)
Ejemplos: Cerrojos, Semáforos, Monitores, Mutex, Barreras, etc.
•En Java existe la posibilidad de utilizar todos estos mecanismos, normalmente son
suficientes los mecanismos de sincronización nativos
•En Java, todo objeto (instancia de una clase) tiene automáticamente asociado un
(único) monitor que actúa como un cerrojo
•El propio lenguaje proporciona mecanismos que permiten utilizar ese cerrojo de
manera sencilla para el programador
Tema I: Introducción a las computación distribuida
Luis López Fernández
Control de concurrencia en Java Cont.
•La palabra clave synchronized
•Cualquier bloque de código etiquetado con la palabra clave synchronized se
convierte en una sección crítica de ejecución exclusiva
•Solamente puede haber un hilo ejecutando código synchronized en un objeto
Proceso de sincronización:
•Por defecto, el cerrojo del objeto está abierto
•Cuando un hilo entra en un bloque synchronized, cierra el cerrojo del objeto y
toma posesión del mismo
•El hilo sólo libera el cerrojo cuando concluye la ejecución del bloque
•Si un hilo tiene que ejecutar un bloque de código synchronized y encuentra el
cerrojo cerrado, debe esperar a que el cerrojo se abra para poder continuar
•Si hay varios hilos esperando por un cerrojo y este se abre, el cerrojo será asignado
a uno solo de los hilos en espera, que lo cerrará y comenzará la ejecución de la
sección synchronized
•No se ofrecen garantías sobre qué hilo será el que cierre el cerrojo y lo posea
•El cierre y la apertura de los cerrojos son operaciones atómicas
•Un hilo que posee el cerrojo de un objeto puede llamar a bloques synchronized
sin necesidad de esperar a otros hilos
Tema I: Introducción a las computación distribuida
Luis López Fernández
Synchronized: ejemplo de uso
public class SynchronizedClass {
public synchronized void metodoI(){
//Sección crítica I
}
public void metodoII(){
//obj es cualquier objeto, podría ser ‘this’
synchronized (obj) {
//Sección crítica II
}
}
}
•
En cada objeto que sea una instancia de SynchronizedClass, no podrá
haber más de un hilo ejecutando bloques synchronized
•
Si un hilo está ejecutando un bloque synchronized, cualquier otro
hilo que quiera entrar en cualquier bloque synchronized sobre el
mismo objeto se bloqueará al comienzo del citado bloque
•
Si un hilo posee el cerrojo y está ejecutando un bloque
synchronized, lo liberará al terminar el bloque
Tema I: Introducción a las computación distribuida
Luis López Fernández
wait(), notify() y notifyAll()
•El uso de la palabra clave synchronized permite solucionar múltiples problemas
de control de concurrencia, pero no todos
•Existe un mecanismo adicional que permite obtener mayor flexibilidad y que
proporcionan los métodos wait(), notify() y notifyAll() de la clase Object
 wait(): hace que el hilo que lo invoca pierda el cerrojo y se bloquee. Obsérvese
que el hilo que invoca wait() debe poseer el cerrojo ¿qué implica esto?
 notify(): cuando un hilo lo invoca, permite otro hilo que está bloqueado (tras
una invocación a wait()) se desbloquee. Si hay varios hilos bloqueados, sólo se
desbloquea uno de ellos. No se ofrecen garantías sobre cuál
 notifyAll(): permite que todos los hilos que están bloqueados (tras una
invocación a wait()) se desbloqueen
 wait(long millis): equivalente a wait(), pero indicando un tiempo máximo
de bloqueo en milisegundos del hilo invocante
•Un hilo “desbloqueado” tras un nofity()/notifyAll()/millis sigue respetando
las reglas de acceso exclusivo definidas mediante la palabra clave synchronized
•El mecanismo wait/nofity permite detener un hilo hasta que se cumpla una
determinada condición que lo permita continuar
Tema I: Introducción a las computación distribuida
Luis López Fernández
Problema de control de concurrencia
Desarrollar una clase con un mecanismo productor-consumidor que cumpla:
•El elemento de intercambio es el entero (int)
•Hay una cola de intercambio de tamaño uno
•Se puede leer el elemento de la cola mediante el método get(). Si la cola está vacía
el hilo invocante se bloquea hasta que se deposite un elemento
•Se puede depositar un elemento en la cola mediante el método put(). Si la cola
está llena el hilo invocante se bloquea hasta que se lea el elemento
public class Intercambiador {
//?
public synchronized int get(){
//?
}
public synchronized void put(int value){
//?
}
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Problema de control de concurrencia: Solución
public class Intercambiador {
private int sharedValue;
private boolean available = false;
public synchronized int get(){
while(available == false){
try{
wait();
}catch(InterruptedException ie){}
}
available = false;
notifyAll(); //si ponemos solo nofity(), se podría desbloquear un lector
return sharedValue;
}
public synchronized void put(int value){
while(available == true){
try{
wait();
}catch(InterruptedException ie){}
}
sharedValue = value;
available = true;
notifyAll(); //si ponemos notify() se podría desbloquear un escritor
}
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Control de concurrencia con mecanismos prefabricados
•El paquete java.util.concurrent de la API estándar (a partir de la versión 5.0)
contiene un conjunto de clases e interfaces de gran utilidad para el desarrollo de
aplicaciones concurrentes. A continuación mostramos un ejemplo:
BlockingQueue<E>
Interfaz generificada que permite acceder una funcionalidad de cola con inserción,
extracción y borrados atómicos y comportamiento síncrono.
Métodos (sólo algunos):
void put(E o) Añade el elemento especificado a la cola. Si no hay espacio
suficiente en la cola (es tamaño de la cola se puede seleccionar en construcción), el
hilo llamante se bloquea hasta que haya espacio disponible
E take() Recupera la “cabeza” de la cola, si no hay ningún elemento en la cola
espera hasta que se presente alguno
Implementaciones:
ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue,
PriorityBlockingQueue, SynchronousQueue
Tema I: Introducción a las computación distribuida
Luis López Fernández
Redes de ordenadores
•Debemos también tener nociones de redes de ordenadores
Arquitectura de redes
Modelos basados en niveles y encapsulamiento
•El modelo OSI
•El modelo Internet
Protocolos de nivel de red, de nivel de transporte y de nivel de aplicación
•El protocolo IP
•El problema de la congestión
•Protocolos de nivel de transporte en Internet (TCP/UDP)
•Protocolos y servicios de nivel de aplicación (HTTP, DNS, etc.)
Tecnologías de red
•Tecnologías basadas en transmisión por cable
•Tecnologías basadas en transmisión inalámbrica
•Redes de área local y Ethernet
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ingeniería del software: Abstracción
•Es necesario comprender algunos conceptos sobre ingeniería del software para
poder continuar con la asignatura, los repasamos brevemente
Definición de Abstracción:
“Proceso por el que se reduce el contenido de información de un concepto con el fin de
retener solamente la que sea relevante para un objetivo concreto”
•El uso de la abstracción en ingeniería se traduce en una reducción de la
complejidad, lo que facilita la conceptualización de un dominio de conocimiento y
mejora su comprensión por parte de los seres humanos
•La abstracción consiste en obviar los detalles y retener lo esencial
•La parte “esencial” de un mecanismo complejo depende del objetivo pretendido
•En ingeniería, el objetivo suele ser lograr que un ser humano comprenda el
funcionamiento y la interacciones de un determinado sistema
•Por tanto, al realizar el proceso de abstracción, solo conservamos la información
relevante que es necesaria para “explicar” y/o “comprender” lo deseado
•Dependiendo del grado de comprensión que se desee alcanzar, se utilizará un
mayor o menor nivel de abstracción en la representación del sistema
Tema I: Introducción a las computación distribuida
Luis López Fernández
Abstracción: ejemplo
•El motor de un coche es un sistema extremadamente complejo que funciona
gracias a la interacción de elementos mecánicos, eléctricos, reacciones químicas, ...
•Una persona que conduce un coche no tiene necesidad de comprender todos los
detalles, le basta con realizar una abstracción que retenga lo relevante
•¿Será suficiente ese nivel de abstracción para un mecánico que repare motores?
•¿Qué nivel de abstracción tendrá el ingeniero que diseña motores?
•¿Y el que diseña los lubricantes?
Representación para un conductor
Sistema complejo
Acelerar
Abstracción
Frenar
Tema I: Introducción a las computación distribuida
Luis López Fernández
Abstracción en el desarrollo de software
•En el mundo del software, la abstracción oculta detalles usando encapsulación
•David J. Barnes
“Habitualmente usamos la abstracción cuando no es necesario conocer los detalles
exactos de cómo algo funciona o se representa, porque podemos usarlo en su forma
simplificada. A menudo, entrar dentro del detalle tiende a oscurecer lo que estamos
intentando entender en lugar de iluminarlo […] la abstracción juega un papel muy
importante en la programación porque lo que a menudo queremos modelar, en software,
es una versión simplificada de la cosas que existen en el mundo real […] sin necesidad de
construir cosas reales”
•En el mundo del software, todo lo que no sea programar con 0s y 1s es abtracción
•Los compiladores son abstracciones de las complejidades del código máquina
•Los IDES son abstracciones de las complejidades del código de los lenguajes
•Etc.
•A medida que el nivel de abstracción aumenta
Ventaja: se eliminan elementos complejos y se facilita el uso
Inconveniente: se restringen las posibilidades de actuar sobre el sistema
(funcionalidades)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Abstracción en Computación Distribuida
El principal problema de los ingenieros que desarrollan
software en general, y muy particularmente de los que
desarrollan software distribuido, es el de la complejidad.
Los programas distribuidos son muy complejos.
Cualquier estrategia que ayude a minimizar la complejidad
de diseñarlos, comprenderlos, implementarlos o
mantenerlos será de sumo interés para el ingeniero
Tema I: Introducción a las computación distribuida
Luis López Fernández
Abstracción en Computación Distribuida
•Los programas y sistemas distribuidos son muy complejos
•Es necesario utilizar abstracción para diseñarlos, implementarlos, mantenerlos, etc.
•Dependiendo del objetivo que persigamos, el nivel de abstracción subirá o bajará
•Son muy habituales las representaciones abstractas que se “concentran” en la
interacción entre los diferentes componentes de un programa o sistema
•Estas representaciones se suelen realizar con “cajas” y “flechas”
•Ejemplo: Interacción entre un servidor web y un cliente web
Abstracción
Permite entender interacciones
Sistemas muy complejos
Servidor
HTTP
Navegador
Petición
Red
Abstracción
Servidor
HTTP
Tema I: Introducción a las computación distribuida
Luis López Fernández
Respuesta
Navegador
Abstracción en Computación Distribuida Cont.
•En arquitectura de redes, el nivel más alto de abstracción lo representan los
modelos en capas (OSI, TCP/IP, etc.)
•En computación distribuida, podemos utilizar también modelos en capas para
representar la arquitectura de los sistemas con un nivel muy elevado de abstracción
•El modelo en tres niveles que presentamos aquí clasifica las partes de una
aplicación distribuida utilizando como criterio la función que desempeñan
Presentación
Lógica de la aplicación (negocio)
Servicios
Tema I: Introducción a las computación distribuida
Luis López Fernández
Abstracción en Computación Distribuida Cont.
Presentación
•Proporciona la interfaz de usuario. Por ejemplo, para un comercio electrónico, serán
un conjunto de páginas HTML con formularios que permitan interaccionar con
posible comprador. Suelen existir APIs muy completas que facilitan la creación del
nivel de presentación
Lógica de la aplicación (negocio)
•Suele consistir en un desarrollo específico que proporciona la funcionalidad básica
requerida por la aplicación. Por ejemplo, en un comercio electrónico, la lógica de
negocio debe incluir: verificación de las tarjetas de crédito, cálculo de costes e
impuestos, procesamiento de los pedidos, etc. Dependiendo de la complejidad de la
lógica de negocio, puede ser que no existan APIs específicas para el desarrollo de
esta capa
Servicios
•La capa de servicios proporciona un conjunto de funcionalidades genéricas (que no
son específicas del “negocio”) que permiten el funcionamiento de las otras capas.
Siguiendo con el ejemplo de comercio electrónico: el sistema de gestión de base de
datos, servicios de directorio (DNS), servicios de comunicaciones (HTTP), etc.
Multitud de fabricantes de software hacen pingües negocios comercializando
herramientas y APIs que proporcionan servicios a las aplicaciones distribuidas
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ingeniería del software: orientación a objetos
•Para esta asignatura, es imprescindible comprender la diferencia entre los modelos
de programación orientados a objetos y los procedimentales
•Ambos modelos han sido concebidos para tratar de minimizar la complejidad
El modelo de programación procedimental
•Define el concepto de procedimiento (o función)
•Un procedimiento (o función) es una abstracción que se utiliza para encapsular un
conjunto de instrucciones que guardan una relación estrecha entre sí
•Así, es posible “razonar” en términos de procedimientos y no de instrucciones
•La abstracción realizada se centra especialmente en las acciones (procedimientos)
El modelo de programación orientado a objetos
•Define el concepto de objeto
•Un objeto es una abstracción que representa “algo” en la “vida real”
•El objeto representa un estado (a través de atributos) y unos comportamientos (a
través de métodos)
•Así, es posible “razonar” en términos de objetos que encapsulan la complejidad
•La abstracción, en este caso, se centra especialmente en los datos (objetos)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ingeniería del software: UML
•La abstracción recurre frecuente al uso de diagramas de “cajas” y “flechas” para
representar sistemas complejos de múltiples elementos que guardan relación
•El problema es que las “cajas” y las “flechas” pueden significar cosas distintas
para personas distintas, por lo que la comprensión de los diagramas se dificulta
•UML (Unified Modeling Language): El un lenguaje que proporciona un conjunto de
notaciones estándar para representar modelos abstractos de objetos
•UML define un conjunto estandarizado de “cajas” y “flechas” con significados
precisos que permiten representar objetos y algunas de sus relaciones
•UML está limitado, es decir, hay modelos que se pueden representar mediante UML
y hay modelos para los que UML no posee notación estandarizada
•En esta asignatura, es conveniente conocer la notación de los diagramas de clases
definidos en UML
•UML es útil para representar (y documentar) la arquitectura de una aplicación
•Siempre que utilicemos UML en los diagramas lo indicaremos de manera explícita
Tema I: Introducción a las computación distribuida
Luis López Fernández
Diagramas de clases básicos en UML
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ingeniería del Software: algo de terminología
•Existen algunos términos que aparecen de manera recurrente en el ámbito de los
ingenieros de trabajan en computación distribuida
Toolkits y frameworks
•Los toolkits y frameworks suelen consistir en un conjunto de clases, herramientas,
APIs, ejemplos de programación y documentación que algunos fabricantes
distribuyen con el fin de facilitar el desarrollo de software distribuido
•El éxito de una tecnología concreta depende en gran medida de la calidad de las
herramientas que se proporcionan al desarrollador en el correspondiente toolkit
Ejemplos de toolkits y frameworks
•JDK (Java Development Toolkit): Distribuido de manera gratuita por Sun
Microsystems para desarrolladores interesados en el lenguaje Java
•.NET framework: Distribuido por Microsoft para desarrolladores Web en sistema
operativo Windows.
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ingeniería del Software: algo de terminología
Componentes
•El desarrollo de software basado en componentes es una técnica muy habitual para
la construcción de sistemas software distribuidos empresariales
•Los componentes son unidades funcionales independientes accesibles de manera
distribuida
•Un sistema software distribuido se puede construir mediante la unión de
componentes preexistentes y bien probados
•De este modo se minimiza el tiempo y los costes de desarrollo
•Para que esta filosofía tenga sentido, los componentes deben poder cooperar a
través de una red abierta
•Es necesario definir mecanismos estándar que posibiliten las interacciones entre
componentes que, en principio, pueden ser heterogéneos
•El desarrollo basado en componentes también es un intento de minimizar la
complejidad
Ejemplos de estándares para el desarrollo de componentes utilizados en la industria
•EJB (Enterprise Java Beans): Estándar para el desarrollo de componentes
distribuidos basado en tecnologías Java
•COM (Component Object Model): Estándar para el desarrollo de componentes
distribuidos basado en tecnologías Microsoft
Tema I: Introducción a las computación distribuida
Luis López Fernández
Lección 1.4
1.1: Definiciones y conceptos básicos
1.2: Algunas nociones (muy) básicas sobre Java
1.3: Disciplinas base de la computación distribuida
1.4: IPC (Inter Process Communications): Comunicación entre procesos
1.5: Paradigmas de la computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
IPC – Comunicación entre procesos
•Los servicios de comunicación entre procesos son la base de los sistemas
distribuidos al permitir que dos procesos colaboren para lograr una tarea
•Hay dos mecanismos básicos de comunicación entre procesos
1- Comunicación entre procesos a nivel del sistema operativo (sin red)
Permiten la comunicación entre dos procesos en el mismo ordenador
Ejemplos: Colas de mensajes, semáforos, memoria compartida, etc.
No vamos a utilizarlos en este curso
2- Comunicación entre procesos a través de una red
Permiten la comunicación entre dos procesos que residan en la misma red
En este caso, la comunicación se produce a través del intercambio de
mensajes entre un emisor y un receptor
El intercambio puede ser uno-a-uno (unicast – unidifusión) o uno-a-grupo
(multicast – multidifusión)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Elementos básicos de una API de IPC para redes
•Cuando un ordenador tiene soporte de red, ofrece una API que proporciona los
servicios de comunicaciones
•Estas APIs tratan de proporcionar una interfaz abstracta al programador
•Toda API debe proporcionar, al menos, cuatro tipos de operaciones al desarrollador
•ENVIAR: Es una primitiva que invoca el proceso emisor con el propósito de
transmitir datos a un proceso receptor. Esta primitiva debe permitir identificar al
proceso receptor así como especificar los datos a transmitir
•RECIBIR: Es una primitiva que invoca el proceso receptor con el objetivo de aceptar
datos de un proceso emisor. Debe permitir identificar al proceso receptor así como
especificar el área de memoria en la que se almacenará la información recibida
•Inicio de la conexión: Para mecanismos de comunicación orientados a conexión,
deben existir primitas que permitan que la conexión se establezca. Lo habitual es
que existan dos de ellas:
•ESPERAR-CONEXIÓN: Es una primitiva invocada por un proceso que está
dispuesto a recibir la conexión de otro proceso de forma pasiva.
•INICIAR-CONEXIÓN: Esta primitiva es invocada por un proceso que quiere
iniciar una conexión de manera activa con otro proceso. Es necesario identificar
al proceso remoto
•DESCONECTAR: En comunicaciones orientadas a conexión, cualquiera de los dos
extremos de una conexión establecida pueden liberarla invocando esta primitiva
Tema I: Introducción a las computación distribuida
Luis López Fernández
Sincronización de los procesos remotos
Si observamos detenidamente la API básica que hemos definido vemos que
•Para que un mensaje pueda transferirse realmente, necesitamos que
Toda llamada ENVIAR en un extremo, debe tener una llamada RECIBIR en el otro
RECIBIR?
Proceso E
Proceso R
ENVIAR
•Para que una conexión pueda establecerse realmente, necesitamos que
Toda llamada INICIAR-CONEXIÓN debe tener un ESPERAR-CONEXIÓN asociada
ESPERAR?
Proceso E
INICIAR
Proceso R
¿Cómo logran los procesos ponerse de acuerdo para coordinar sus llamadas?
Más aún …
¿Qué tenemos que hacer cuando en el código que desarrollamos para que los
programas se coordinen al ejecutarse como procesos?
Tema I: Introducción a las computación distribuida
Luis López Fernández
Sincronización de los procesos remotos
Definición de Sincronizar:
“Hacer que coincidan en el tiempo dos o más fenómenos”
¿Cómo sincronizamos la ejecución de ENVIAR en un proceso con la ejecución de
RECIBIR en el otro?
El mecanismo de sincronización más sencillo es el de utilizar comandos bloqueantes
•Un comando bloqueante es aquel que bloquea al proceso que lo invoca hasta que se
verifica una cierta condición, momento en el que el proceso para a estar Listo
•Para el envío de un mensaje, el primer proceso que alcanza el comando
ENVIAR/RECIBIR se bloquea hasta que el otro proceso “lo alcanza”
•Para el establecimiento de una conexión, el proceso que invoca ESPERAR se bloquea
hasta que otro proceso invoca INICIAR
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Mensaje
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Mensaje
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Ejemplo de comunicación con comandos bloqueantes
ProgramaI
ProgramaII
...
...
int x = leerDato();
llamarYoda();
int y = leerOtroDato();
sacarEspadaLaser();
int z = x + y;
matarSauron();
String resultado=“Suma=“+z;
int z = recibir(procesoI)
enviar(procesoII, resultado);
pagarImpuestos(z);
...
...
Mensaje
Listo
Ejecutando
Bloqueado
Listo
Ejecutando
Bloqueado
Tema I: Introducción a las computación distribuida
Luis López Fernández
Envío y recepción síncronas
•Las operaciones de IPC que bloquean al proceso llamante se llaman síncronas
•Una operación bloqueante solo se desbloquea cuando sucede el evento esperado
en el extremo remoto. Es decir, garantizamos que hay una sincronización
•Existen multitud de APIs de IPC síncronas y es posible programar con ellas
•Existen también APIs de IPC asíncronas, en las que las llamadas no se bloquean
•En estos casos, es responsabilidad del programador lograr la sincronización
•¿Por qué puede querer alguien llamadas asíncronas?
•Para evitar bloqueos indefinidos
•Para mejorar las prestaciones y no desperdiciar ciclos de reloj
•Ejemplo: programa que recibe de muchas fuentes y almacena paquetes
while(true){
int resultado = recibir(paquete);
if(resultado == -1)
continue;
else
almacena(paquete);
}
•El programador debe saber si trabaja con llamadas síncronas o asíncronas
Tema I: Introducción a las computación distribuida
Luis López Fernández
Llamadas síncronas y asíncronas
•Al desarrollar programas distribuidos, es necesario codificar tanto la parte
receptora como la parte emisora ¿qué modelo hay que usar en cada caso?
•La sincronía/asincronía de las llamadas depende del servicio subyacente
•Para comprenderlo, necesitamos realizar diagramas de eventos
Proceso E
Proceso R
Evento
Tiempo
Periodo suspendido
Mensaje Obligatorio
Tema I: Introducción a las computación distribuida
Luis López Fernández
Enviar síncrono y recibir síncrono
•El Proceso R (receptor) se bloquea al invocar RECIBIR
•El Proceso E (emisor) se bloquea al invocar ENVIAR
•El Proceso R puede continuar ejecutando cuando ha terminado de recibir el mensaje
•El Proceso E requiere un acuse de recibo (ACK) confirmando una recepción correcta
para poder desbloquearse
•El asentimiento forma parte del protocolo que implementa
el servicio ICP (es transparente para el programador)
Proceso E
•El mecanismo enviar-síncrono/recibir-síncrono es
aconsejable cuando la lógica de la aplicación de ambos
procesos necesita que los datos enviados se reciban antes ENVIAR
de continuar con el procesamiento
•Este mecanismo es utilizado cuando el servicio IPC es de
transporte fiable orientado a conexión (p.e. TCP)
•La realidad puede ser un poco más complicada (bufferes
intermedios de recepción, ACKs perdidos, etc)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Proceso R
RECIBIR
Asentimiento
Enviar asíncrono y recibir síncrono
•El Proceso R (receptor) se bloquea al invocar RECIBIR
•El Proceso E (emisor) no se bloquea al invocar ENVIAR
•El Proceso E envía el mensaje y continúa sin esperar
•El Proceso E no requiere un acuse de recibo (ACK) confirmando la recepción
•Este esquema es apropiado cuando la lógica de la
aplicación emisora no depende de la recepción de los datos
en el otro extremo
•Este esquema suele utilizarse cuando el mecanismo IPC
subyacente no garantiza que los datos enviados sean,
realmente, entregados al receptor (p.e. UDP)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Proceso E
Proceso R
RECIBIR
ENVIAR
Enviar síncrono y recibir asíncrono
•El Proceso R (receptor) no se bloquea al invocar RECIBIR
•El Proceso E (emisor) se bloquea al invocar ENVIAR
•El Proceso E envía el mensaje y se bloquea
•El Proceso E requiere un acuse de recibo (ACK) para desbloquearse
•Hay 3 escenarios
•Escenario 1
•Los datos ya han llegado al Proceso R cuando se invoca
RECIBIR
•En este caso, los datos se entregan al Proceso R
inmediatamente
Proceso E
Proceso R
ENVIAR
•Un ACK desbloquea al Proceso E
RECIBIR
Asentimiento
Tema I: Introducción a las computación distribuida
Luis López Fernández
Enviar síncrono y recibir asíncrono Cont
•Escenario 2
•Cuando el Proceso R invoca RECIBIR, los datos no han llegado
•El Proceso R no recoge ningún dato
•Para evitar un bloqueo indefinido del Proceso E, es necesario invocar RECIBIR
nuevamente
•En este tipo de escenario el receptor se programa como un
bucle en el que, cada cierto tiempo, se chequea si hay
nuevos datos recibidos
Proceso E
•A esta técnica se le denomina polling
•Cuando los datos son finalmente recibidos, el Proceso E
puede desbloquearse
ENVIAR
Proceso R
RECIBIR
RECIBIR
RECIBIR
Asentimiento
Tema I: Introducción a las computación distribuida
Luis López Fernández
Enviar síncrono y recibir asíncrono Cont.
•Escenario 3
•Cuando el Proceso R invoca RECIBIR, los datos no han llegado
•El Proceso R no recoge ningún dato
•Para evitar un bloqueo indefinido del Proceso E, se eleva un evento en el Proceso R
cuando los datos realmente se reciben
•Este evento tiene asociado un manejador, que ejecuta la
recepción real de los datos
Proceso E
•El manejador es un método (función) que se invoca en el
momento de la recepción, normalmente en un hilo diferente
Proceso R
RECIBIR
•Para que este esquema funcione, el mecanismo IPC debe
implementar el servio de evento con retrollamada
ENVIAR
•Los tres escenarios se pueden usar cuando se requiere un
transporte fiable de los datos (p.e. TCP) y, al mismo tiempo,
se requiere que el receptor no se bloquee
Tema I: Introducción a las computación distribuida
Luis López Fernández
Evento
Asentimiento
Enviar asíncrono y recibir asíncrono
•Ninguno de los dos procesos se bloquea
•Este mecanismo sólo tiene sentido cuando no se requiere un transporte fiable y,
además, se usa un mecanismo de eventos con retrollamadas
•Este esquema no es muy utilizado
Proceso E
Proceso R
RECIBIR
ENVIAR
Evento
Tema I: Introducción a las computación distribuida
Luis López Fernández
Revisión crítica del mecanismo de bloqueo
•Ventaja clara: facilita la vida del programador a la hora de sincronizar los procesos
•Inconvenientes:
•Puede producir bloqueos indefinidos de un proceso (p.e. RECIBIR sin ENVIAR)
•Puede producir interbloqueos (p.e. los dos extremos llaman a RECIBIR)
•Es inaceptable cuando se requieren altas prestaciones (p.e. servidores)
•Dos estrategias para minimizar los inconvenientes de llamadas síncronas
Estrategia I: Temporizadores
•La mayoría de las APIs de IPC de red permiten el uso de temporizadores (timeouts)
que se pueden utilizar para fijar el tiempo máximo de bloqueo
•Ejemplo: RECIBIR(procesoRemoto, bufferDatos, 3000)
Recepcion
correcta
RECIBIR
Continúa el
programa
timeout
Código error o
excepción
Tema I: Introducción a las computación distribuida
Luis López Fernández
Revisión crítica del mecanismo de bloqueo Cont.
Estrategia II: Uso de múltiples hilos de ejecución
•Esta estrategia se utiliza habitualmente para el desarrollo de servidores
•Consiste en crear hilos específicos para algunas operaciones bloqueantes
•La operación bloqueante, sólo detiene su propio hilo sin afectar al resto
•Este tipo de estrategia suele requerir el uso de control de concurrencia
Proceso
Nuevo hilo
Nuevo hilo
RECIBIR
ENVIAR
Tema I: Introducción a las computación distribuida
Luis López Fernández
Lección 1.5
1.1: Definiciones y conceptos básicos
1.2: Algunas nociones (muy) básicas sobre Java
1.3: Disciplinas base de la computación distribuida
1.4: IPC (Inter Process Communications): Comunicación entre procesos
1.5: Paradigmas de la computación distribuida
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigmas de computación distribuida
Nivel de abstracción creciente
Definición de Paradigma:
“Patrón, ejemplo o modelo”
“Estilo o conjunto de prácticas utilizadas para desarrollar un programa” (software)
•Es decir, identificar los paradigmas de la computación distribuida es identificar los
modelos, patrones y prácticas que se utilizan habitualmente para desarrollar
programas que funcionan en un sistema distribuido
•En computación distribuida existen centenares de paradigmas, vamos a identificar
los más habituales y populares ordenándolos según su nivel de abstracción
Espacios de objetos, aplicaciones colaborativas
No se ve en este
curso
Servicios de red, ORB
RPC y RMI
Estudiado en
este curso
Cliente-servidor, peer-to-peer
Paso de mensajes
Modelo OSI, modelo TCP/IP
Hardware
Tema I: Introducción a las computación distribuida
Luis López Fernández
Estudiado en
cursos anteriores
Paradigma de paso de mensajes
•El paradigma de paso de mensajes es una abstracción para lograr IPC
•¿Qué simplifica esta abstracción?
•Abstrae todas las complejidades del modelo en capas (es decir, de la red)
•Servicio con primitivas ENVIAR, RECIBIR, ESPERAR-CONEXIÓN, INICIAR-CONEXIÓN
•Se logra que la E/S por red sea similar a la E/S típica de ficheros
•¿Qué restringe esta abstracción?
•Hace invisibles (e intocables) los detalles de las capas inferiores (¿Qué pasa si quiero
crear un paquete IP falsificando la dirección de origen?)
•Ejemplo de implementación
•La API Sockets implementa este modelo
Proceso E
Proceso R
Mensaje I
Mensaje II
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma cliente-servidor
•El paradigma cliente servidor es esencialmente un patrón arquitectural
•También es una abstracción sobre el modelo de paso de mensajes
•Se basa en establecer roles asimétricos a los procesos que colaboran
•Un proceso es el Servidor:
•Espera de manera pasiva peticiones de los clientes
•Responde a esas peticiones según un servicio predefinido
•Otro proceso es el Cliente (puede haber varios):
•Invoca peticiones al servidor
•Espera la respuesta de los clientes
•¿Qué simplifica esta abstracción?
•Simplifica la sincronización en los procesos (se sabe quién espera y actúa)
•Simplifica la implementación de servicios compartidos por múltiples clientes
¿Qué restringe esta abstracción?
•Establece a priori el papel de cada proceso (¿Qué sucede si quiero que un cliente se
convierta en servidor?)
•Ejemplos de implementación
•La mayoría de las aplicaciones más populares en Internet (HTTP, FTP, DNS, etc.)
•El mecanismo de servlets de Java está concebido para implementar servidores
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma peer-to-peer (igual-a-igual)
•El paradigma peer-to-peer es un patrón arquitectural
•No ofrece una abstracción notable con respecto al modelo de paso de mensajes
•Elimina la asimetría del modelo cliente-servidor
•Todos los procesos son equivalentes desde el punto de vista de su habilidad para
solicitar o proveer servicios a otros procesos
•Lo que simplifica y restringe este paradigma es muy dependiente de las facilidades
que soporten las APIs que se utilicen para el desarrollo
•La comunicación suele basarse en mecanismos de petición-respuesta síncronos
similar al del modelo cliente-servidor
• Ejemplos de implementación
•Todo tipo de aplicaciones de mensajería instantánea, intercambio de ficheros,
vídeo-conferencia, etc.
•El proyecto JXTA o el proyecto Jabber ofrecen APIs y estándares para el desarrollo
de sistemas basados en el paradigma peer-to-peer
P2
P3
P1
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma MOM
•MOM (Message Oriented Middleware): Middleware Orientado a Mensajes
•Patrón arquitectural + abstracción similar a la del modelo cliente-servidor
•Middleware: un software que está “en medio”
•El modelo MOM propone la introducción de un middlerware que actúa de
intermediario entre un sistema proveedor de servicios (servidor) y un sistema
consumidor de servicios (cliente) desacoplándolos
•El emisor (cliente) deposita una petición en el sistema de gestión de mensajes
•El emisor queda “libre” para seguir con sus tareas
•El sistema de gestión de mensajes actúa como un conmutador dirigiendo la
petición hacia el receptor (servidor) más apropiado para procesarla
•Los receptores almacenan las peticiones en una cola y las van procesando de
manera asíncrona siguiendo una política predefinida (FIFO, LIFO, etc.)
•Cuando una petición se procesa, la respuesta es entregada al proceso emisor
(quizás con la intermediación del sistema de mensajes)
•El proceso emisor puede recuperar la respuesta utilizando polling o a través de un
mecanismo de retrollamadas
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma MOM Cont.
•¿Qué simplifica esta abstracción?
•Proporciona una abstracción adicional para operaciones asíncronas con respecto al
modelo de paso de mensajes que simplifica su desarrollo y comprensión
•Permite desacoplar el emisor del receptor (mejora manteniblidad)
•¿Qué restringe esta abstracción?
•El modelo asíncrono elimina cualquier tipo de control que se pueda tener sobre las
temporizaciones y la sincronización del emisor y el receptor
•Ejemplos de implementación
•Microsoft Message Queue (MSMQ), Java Message Service (JMS), etc.
Emisor
Emisor
Receptor
MOM
Receptor
Emisor
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma de publicación/suscripción
•Es paradigma de publicación/suscripción es un patrón arquitectural
•También es una abstracción sobre el modelo de paso de mensajes
•Como en el modelo cliente-servidor, hay dos roles asimétricos
•El publisher (editor)
•Recibe o produce eventos de diferentes tipos
•Los subscritores (subscribers)
•Se suscriben a eventos de determinado tipo
•Cuando en el servidor se produce un evento, todos los suscriptores que hayan
declarado su interés por ese tipo de evento son informados a través del envío de un
mensaje, que contiene la información relevante sobre el evento
•El modelo de programación del suscriptor está basado en retrollamadas
•Este esquema se utiliza también para el desarrollo de aplicaciones monolíticas (p.e.
en desarrollo de interfaces de usuario)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma de publicación/suscripción
•¿Qué simplifica esta abstracción?
•Facilita la implementación de servicios de multidifusión
•Facilita el desarrollo de aplicaciones que gestionan eventos asíncronos (pe. control)
•¿Qué restringe esta abstracción?
•El propio modelo restringe el ámbito de aplicación
•Ejemplos de implementación
Suscriptor
Evento
Evento
Publisher
Evento
Suscriptor
Suscriptor
Publicación de eventos
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigmas RPC y RMI
•RPC (Remote Procedure Call): Llamadas a procedimientos remotos
•Es una abstracción notable sobre todos los modelos basados en paso de mensajes
•No es un patrón arquitectural
•La idea es la de lograr que, desde el punto de vista del programador, el desarrollo
de aplicaciones distribuidas sea idéntico al desarrollo de aplicaciones monolíticas
•Es decir, la idea es la de ofrecer abstracciones que eliminen todo lo que “tenga que
ver” con comunicaciones, redes, mensajes, protocolos, etc.
•Las RPC se basa en el mimetismo del modelo de programación procedimental
•Existe un modelo análogo que mimetiza la filosofía orientada a objetos: el RMI
¿Qué simplifica este paradigma?
•Permite que desarrollar aplicaciones distribuidas sea “tan fácil” como desarrollar
aplicaciones monolíticas (… lo matizaremos)
•El desarrollador no tiene por qué saber nada de protocolos, mensajes, formatos …
¿Qué restringe este paradigma?
•Hace invisibles (e intocables) todo lo que tiene que ver con protocolos, mensajes,
formatos, etc. (¿Qué pasa si quiero saber si un mensaje se ha recibido duplicado?,
¿si quiero comprimir los datos de un mensaje?¿si quiero ralentizar el envío de
mensajes?, etc.
•Está adaptado para comportamientos síncronos (petición-respuesta bloqueante)
Ejemplos de implementación
•Java RMI, Sun RPC, DCE, etc.
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigmas RPC y RMI Cont.
Ejecución de llamada RPC
Ejecución de llamada
monolítica
Proceso
...
int x = 10
Proceso
int y = 20
int z = sumar(x+y)
...
int x = 10
...
Mensaje
int y = 20
int z = sumar(x+y)
...
return a + b
}
Mensaje
int sumar(int a, int b){
Proceso
int sumar(int a, int b){
return a + b
}
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma de servicios de red
•Es una extensión del modelo RPC-RMI en la que se predefinen ciertos servicios
•Los proveedores de servicios se registran en un directorio en tiempo de ejecución
•Los consumidores pueden localizar los servicios consultando el directorio
•La estandarización es imprescindible para lograr interoperabilidad
¿Qué simplifica este paradigma?
•Permite mejorar la interoperabilidad
•Simplifica el problema de la localización del interlocutor
•Incentiva el uso directo de servicios estandarizados
•¿Qué restringe este paradigma?
•Requiere mecanismos de definición de interfaces
•Restricciones similares a las del modelo RPC-RMI
•Depende del a implementación
•Ejemplos de implementación
•La tecnología Jini de Java se basa en este modelo
•Los Web Services (Servicios Web) se basan en este modelo
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma basado en ORB
•ORB (Object Request Broker): Intermediario de peticiones a objetos
•El paradigma ORB es esencialmente un patrón arquitectural sobre el modelo RMI
•Se añaden también funcionalidades adicionales que abstraen ciertos servicios
•El ORB es un middleware que actúa como mediador en la petición a un objeto
•El ORB puede realizar multitud de labores entre las que se incluyen:
•Mediación entre objetos heterogéneos
•Localización de objetos
•Creación y activación de objetos bajo demanda
•Etc.
•Este paradigma es la base de la arquitectura CORBA
•¿Qué simplifica este paradigma?
•Al leer el estándar CORBA uno diría que este paradigma no simplifica nada …
•… la realidad es que se elimina gran parte del trabajo tedioso, permitiendo que el
desarrollador se centre en la lógica de negocio. Próximo a la filosofía orientada a
componentes (el contenedor ofrece los servicios, el desarrollador la log. de negocio)
•Mejora enormemente la interoperabilidad de las aplicaciones
•¿Qué restringe este paradigma?
•En general, las restricciones son similares a las del modelo RMI
•Implementaciones concretas pueden añadir restricciones adicionales
•Ejemplos de implementaciones
•Cualquier implementación de un ORB CORBA (Orbix, TidORB, OpenORB, etc.)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Paradigma basado en ORB
Tema I: Introducción a las computación distribuida
Luis López Fernández
Tema I: Comentarios y referencias
•Comentarios y reflexiones
•¿Por qué la utilización de un patrón arquitectural en una aplicación
distribuida restringe las capacidades de la aplicación?
•Intenta imaginar qué tipo de mecanismo puede transformar una llamada a un
procedimiento local (a un proceso) en una ejecución de un procedimiento
remoto (en otro proceso). ¿Requiere este mecanismo el intercambio de
mensajes?
•¿Por qué crees que hay tantas abstracciones, patrones arquitecturales,
toolkits, frameworks y APIs en el ámbito del desarrollo de aplicaciones
distribuidas?
•La compilación JIT del bytecode de Java ha mejorado las prestaciones de
los programas escritos en este lenguaje. ¿Puedes encontrar información
relativa al respecto?
•Referencias
•M.L. Liu, Computación Distribuida: Fundamentos y Aplicaciones, Pearson
Addison Wesley, 2004. Capítulos 1,2 y 3
•Bruce Eckel, Piensa en Java, Prentice Hall, 2003
•Nunca desprecies el poder Wikipedia (www.wikipedia.org)
Tema I: Introducción a las computación distribuida
Luis López Fernández
Tema I: Resumen
•Contenidos
•Computación Distribuida: Conceptos básicos
•Definición
•Ventajas/Inconvenientes
•Falacias de la Computación Distribuida
•Rudimentos de programación en Java
•Disciplinas relacionadas con la computación distribuida
•Sistemas operativos:
•Procesos
•Programación Concurrente
•Ingeniería del software
•Abstracción
•Comunicación entre procesos (IPC)
•Invocaciones bloqueantes/no-bloqueantes
•Envío y recepción síncronos y asíncronos
•Paradigmas de la computación distribuida
•Paso de mensajes
•Cliente/Servidor, P2P
•RPC-RMI
•ORB
Tema I: Introducción a las computación distribuida
Luis López Fernández