Title: Tema I: Introducci
1Tema IIntroducción a la computación distribuida
2Tema 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
3Lecció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
4El 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
5Modelos 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)
6Modelos 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?
7Modelos 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_at_home)
8Computació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?
9Ventajas 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
10Inconvenientes 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.
11Inconvenientes 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)
12Inconvenientes 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
13Las 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 - 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
14Lecció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
15Nociones 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
16Java 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
17Java 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!)
18Java 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)
19Java 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(lthtmlgtltbodygtHello, world!lt/bodygtlt/html
gt") pw.close()
20Java 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 HolaMu
ndo.class java HolaMundo Hola mundo!
21Java 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 ...
22Java 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)
23Java 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
a22
24Java 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.getNombreComplet
o)//Imprime Pedro González ...
25Java 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
26Java 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ódig
o que se ejecuta haya o no excepción
27Java 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
28Java 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/B
ooks/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)
29Lecció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
30Disciplinas 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
31Programas 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
encolado
fin
Diagrama simplificado de las transiciones
de estado de un proceso
planificado
evento
espera
32Computació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?
33Hilos 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
34Concurrencia 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
35Creació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()
36Javadoc 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
37(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.
ThrowsInterruptedException - 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
38(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.
39Control 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) x1 leerCuenta(A) x1 x1
100 escribirCuenta(A, x1) y1 leerCuenta(B) y1
y1 100 escribirCuenta(B, y1)
Hilo II (transf. 1) x2 leerCuenta(A) x2 x2
1 escribirCuenta(A, x2) y2 leerCuenta(B) y2
y2 1 escribirCuenta(B, y2)
40Control de concurrencia Cont.
Hilo I (transf. 100) x1 leerCuenta(A) x1 x1
100 escribirCuenta(A, x1) y1 leerCuenta(B) y1
y1 100 escribirCuenta(B, y1)
Hilo II (transf. 1) x2
leerCuenta(A) x2 x2 1 escribirCuenta(A,
x2) y2 leerCuenta(B) y2 y2
1 escribirCuenta(B, y2)
A B x1 y1 x2 y2
110 0 110 - - -
110 0 10 - - -
10 0 10 - - -
10 0 10 0 - -
10 0 10 100 - -
10 100 10 100 - -
10 100 - - 10 -
10 100 - - 9 -
9 100 - - 9 -
9 100 - - 9 100
9 100 - - 9 101
9 101 - - 9 101
41Control de concurrencia Cont.
Hilo I (transf. 100) x1 leerCuenta(A) x1 x1
100 escribirCuenta(A, x1) y1
leerCuenta(B) y1 y1 100 escribirCuenta(B, y1)
Hilo II (transf. 1) x2 leerCuenta(A) x2
x2 1 escribirCuenta(A, x2) y2
leerCuenta(B) y2 y2 1 escribirCuenta(B, y2)
A B x1 y1 x2 y2
110 0 110 - - -
110 0 10 - - -
10 0 10 - - -
10 0 10 - 10 -
10 0 10 - 9 -
9 0 10 - 9 -
9 0 10 - 9 0
9 0 10 0 9 0
9 0 10 100 9 0
9 100 10 100 9 0
9 100 10 100 9 1
9 1 10 100 9 1
Se han perdido 100 euros por un problema de
control de concurrencia!!
42Control 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
43Control 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
44Synchronized 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
45wait(), 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
46Problema 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) //?
47Problema de control de concurrencia Solución
public class Intercambiador private int
sharedValue private boolean available
false public synchronized int
get() while(available false) try wa
it() 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(availabl
e true) try wait() catch(Interrup
tedException ie) sharedValue
value available true notifyAll() //si
ponemos notify() se podría desbloquear un
escritor
48Control 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 - BlockingQueueltEgt
- 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
49Redes 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
50Ingenierí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
51Abstracció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
Abstracción
52Abstracció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)
53Abstracció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
54Abstracció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
Servidor HTTP
Abstracción
Navegador
Respuesta
55Abstracció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
56Abstracció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
57Ingenierí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)
58Ingenierí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
59Diagramas de clases básicos en UML
60Ingenierí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.
61Ingenierí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
62Lecció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
63IPC 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)
64Elementos 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
65Sincronizació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 - Para que una conexión pueda establecerse
realmente, necesitamos que - Toda llamada INICIAR-CONEXIÓN debe tener un
ESPERAR-CONEXIÓN asociada - 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?
RECIBIR?
Proceso R
Proceso E
ENVIAR
ESPERAR?
Proceso R
Proceso E
INICIAR
66Sincronización de los procesos remotos