Tema I: Introducci - PowerPoint PPT Presentation

About This Presentation
Title:

Tema I: Introducci

Description:

... (Java Development Toolkit): ... (MIDlets, etc.) pero no los estudiaremos en este curso Aplicaciones Java (Java stand-alone applications) ... – PowerPoint PPT presentation

Number of Views:100
Avg rating:3.0/5.0
Slides: 107
Provided by: cart117
Category:

less

Transcript and Presenter's Notes

Title: Tema I: Introducci


1
Tema IIntroducción a la computación distribuida
  • Luis López Fernández

2
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
3
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
4
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

5
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)

6
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?

7
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_at_home)

8
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?

9
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

10
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.

11
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)

12
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

13
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
  • 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

14
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
15
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

16
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

17
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!)
18
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)
19
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(lthtmlgtltbodygtHello, world!lt/bodygtlt/html
gt") pw.close()
20
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 HolaMu
ndo.class java HolaMundo Hola mundo!
21
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 ...
22
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)
23
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
a22
24
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.getNombreComplet
o)//Imprime Pedro González ...
25
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
26
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ódig
o que se ejecuta haya o no excepción
27
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
28
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/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)

29
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
30
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

31
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

encolado
fin
Diagrama simplificado de las transiciones
de estado de un proceso
planificado
evento
espera
32
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?

33
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

34
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

35
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()

36
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

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.
39
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) 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)
40
Control 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
41
Control 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!!
42
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

43
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

44
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

45
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

46
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) //?
47
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 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
48
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
  • 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

49
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

50
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

51
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
Abstracción
52
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)

53
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
54
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
Servidor HTTP
Abstracción
Navegador
Respuesta
55
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

56
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

57
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)

58
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

59
Diagramas de clases básicos en UML
60
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.

61
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

62
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
63
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)

64
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

65
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
  • 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
66
Sincronización de los procesos remotos
  • D
Write a Comment
User Comments (0)
About PowerShow.com