Monografias.com > Computación > General
Descargar Imprimir Comentar Ver trabajos relacionados

Introducción a la computación distribuida




Enviado por Pablo Turmero



Partes: 1, 2

    Monografias.com

    Contenidos
    1: Definiciones y conceptos básicos

    2: Algunas nociones (muy) básicas sobre Java

    3: Disciplinas base de la computación distribuida

    4: IPC (Inter Process Communications): Comunicación entre procesos

    5: Paradigmas de la computación distribuida

    Monografias.com

    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

    Monografias.com

    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
    El vocabulario de la computación distribuida

    Monografias.com

    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)
    Modelos de computación y programación

    Monografias.com

    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?
    Modelos de Computación

    Monografias.com

    Computación Distribuida
    Procesadores: El programa ejecuta en un conjunto de procesadores que están ligeramente ligados
    Ligazón:
    Los procesadores pueden intercambiar mensajes
    Los procesadores no comparten (directamente) memoria principal
    Los procesadores no comparten (directamente) sus recursos hardware
    Requiere: (Un sistema distribuido)
    El hardware de varios ordenadores
    Una red de ordenadores
    Hardware de interconexión
    Ejemplo: Ejecución de un programa en una red de área local

    Computación Cooperativa y Computación P2P (un tipo de Comput. Distribuida)
    Procesadores: El programa ejecuta en un conjunto dinámico y muy grande de procesadores que están débilmente ligados. Se asume que los recursos de procesador de los que el programa puede disponer están restringidos.
    Ligazón: Similar a la de la computación distribuida
    Requiere: Un sistema distribuido + una red de área extendida (Internet p.e.)
    Ejemplo: Ejecución de un programa en Internet (SETI@home)
    Modelos de Computación Cont.

    Monografias.com

    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?
    Computación Distribuida

    Monografias.com

    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

    Ventajas de la Computación Distribuida

    Monografias.com

    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.

    Inconvenientes de la Computación Distribuida

    Monografias.com

    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)

    Inconvenientes de la Computación Distribuida Cont.

    Monografias.com

    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

    Inconvenientes de la Computación Distribuida Cont.

    Monografias.com

    … 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

    Las Falacias de la Computación Distribuida

    Monografias.com

    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
    Lección 1.2

    Monografias.com

    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)
    Nociones sobre el lenguaje de programación Java
    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

    Monografias.com

    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

    Java: Algo de jerga

    Monografias.com

    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
    Java: tipos de programas
    public class HolaMundo{
    public static void main(String[] args){
    System.out.println(“Hola mundo!”);
    }
    }

    Monografias.com

    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
    Java: tipos de programas Cont.
    import java.applet.Applet;
    import java.awt.Graphics;

    public class HelloWorld extends Applet {
    public void paint(Graphics gc) {
    gc.drawString("Hello, world!", 65, 95);
    }
    }

    Monografias.com

    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
    Java: tipos de programas Cont.
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class HelloWorld extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    response.setContentType("text/html");
    PrintWriter pw = response.getWriter();
    pw.println(“< html>< body>Hello, world!< /body>< /html>");
    pw.close();
    }
    }

    Monografias.com

    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
    Java: Hola mundo
    # vi HolaMundo.java
    public class HolaMundo{
    public static void main(String[] args){
    System.out.println(“Hola mundo!”);
    }
    }
    # javac HolaMundo.java
    # ls
    HolaMundo.java HolaMundo.class
    # java HolaMundo
    Hola mundo!

    Monografias.com

    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
    Java: Clases y objetos
    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;
    }

    }

    Monografias.com

    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
    Java: Miembros estáticos
    public class Alumno{
    private static numAlumnos = 0;
    }

    Alumno.numAlumnos ++;
    Alumno alumno = new Alumno();
    System.out.println(“Hay “ + alumno.numAlumnos + “ alumnos”);

    Monografias.com

    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
    Java: Tipos
    Persona p1 = new Persona(“Luis”, “López”);
    Persona p2 = p1;
    p2.setNombre(“Patata”);
    System.out.println(p1.getNombreCompleto); //Imprime “Patata López”

    int a = 22;
    int b = a;
    b = 3;
    System.out.println(“a=” + a); //Imprime “a=22”

    Monografias.com

    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
    Java: Herencia
    class Empleado extends Persona {
    public Empleado(String nombre, String apellidos){
    super(nombre, apellidos);
    }
    public int sueldo;
    }

    Empleado e = new Empleado(“Pedro”, “González”);
    System.out.println(e.getNombreCompleto);//Imprime “Pedro González”

    Monografias.com

    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
    Java: Interfaces
    public interface Coin {
    public double unitsPerEuro();
    }

    public class Peseta implements Coin{
    public double unitsPerEuro(){
    return 166.3;
    }

    Peseta peseta = new Peseta();
    Coin coin = peseta;

    Monografias.com

    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
    Java: Excepciones
    try{
    //código que puede elevar una excepción
    }catch(TipoDeExcepción e){
    //código a ejecutar en caso de excepción
    }finally(){
    //código que se ejecuta haya o no excepción
    }

    Monografias.com

    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;

    Java: Paquetes
    package mi.paquete;

    import java.io.*;
    import java.lang.*; //importado por defecto en todos los ficheros

    public class MiClase{
    //definición de la clase
    }

    Monografias.com

    Estas nociones básicas no son suficientes para “saber programar” en Java
    Existen infinidad de libros y de documentación en Internet que pueden ser de ayuda para aprender o profundizar en las tecnologías Java

    Libros:
    Gay Horstmann, “Big Java”, John Wiley & Sons, 2002 (bueno para empezar)
    Bruce Eckel, “Piensa en Java”, Prentice Hall, 2003

    Tutoriales y libros en la web:
    Java Programming en Wikibooks: http://en.wikibooks.org/wiki/Java_Programming
    Thinking in Java 3rd Ed: http://www.mindview.net/Books/TIJ/
    Página oficial de Java en Sun Microsystems: http://java.sun.com

    Conocer los fundamentos del lenguaje es condición necesaria para poder desarrollar aplicaciones en Java, pero no suficiente … tarde o temprano hay que acudir a la especificación de la API estándar
    http://java.sun.com/j2se/1.4.2/docs/api/ (Para Java 1.4.2)
    http://java.sun.com/j2se/1.5.0/docs/api/index.html (Para Java 1.5)
    … (Para Java 1.6)
    Java: Hay que saber más.

    Monografias.com

    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
    Lección 1.3

    Monografias.com

    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
    Disciplinas utilizadas en Computación Distribuida

    Monografias.com

    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
    Programas y procesos
    planificado
    encolado
    (Gp:) Inicio

    (Gp:) Listo

    (Gp:) Bloqueado

    (Gp:) Ejecutando

    (Gp:) Terminado

    evento
    espera
    fin
    Diagrama simplificado
    de las transiciones de
    estado de un proceso

    Monografias.com

    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?
    Computación Concurrente

    Monografias.com

    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
    Hilos de ejecución (threads) y procesos

    Monografias.com

    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
    Concurrencia y computación distribuida

    Monografias.com

    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();
    Creación de hilos en Java

    Monografias.com

    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:

    Javadoc de la clase Thread

    Monografias.com

    public static Thread currentThread()
    Returns a reference to the currently executing thread object.

    public static void yield()
    Causes the currently executing thread object to temporarily pause and allow other threads to execute.

    public static void sleep(long millis) throws InterruptedException
    Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds. The thread does not lose ownership of any monitors.
    Parameters: millis – the length of time to sleep in milliseconds.
    Throws:InterruptedException – if another thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

    public void interrupt()
    Interrupts this thread. […] If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.
    If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.
    If this thread is blocked in a Selector then the thread's interrupt status will be set and it will return immediately from the selection operation, possibly with a non-zero value, just as if the selector's wakeup method were invoked.
    If none of the previous conditions hold then this thread's interrupt status will be set.
    Throws: SecurityException – if the current thread cannot modify this thread
    (algunos) Métodos de la clase Thread

    Monografias.com

    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.

    (algunos) Métodos de la clase Thread

    Monografias.com

    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
    Control de concurrencia
    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)

    Monografias.com

    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)

    Monografias.com

    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)
    Se han perdido 100 euros por un problema de control de concurrencia!!

    Monografias.com

    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
    Control de concurrencia en Java

    Monografias.com

    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
    Control de concurrencia en Java Cont.

    Monografias.com

    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

    Monografias.com

    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
    wait(), notify() y notifyAll()

    Monografias.com

    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
    Problema de control de concurrencia
    public class Intercambiador {
    //?
    public synchronized int get(){
    //?
    }
    public synchronized void put(int value){
    //?
    }
    }

    Monografias.com

    Problema de control de concurrencia: Solución
    public class Intercambiador {
    private int sharedValue;
    private boolean available = false;
    public synchronized int get(){
    while(available == false){
    try{
    wait();
    }catch(InterruptedException ie){}
    }
    available = false;
    notifyAll(); //si ponemos solo nofity(), se podría desbloquear un lector
    return sharedValue;
    }

    public synchronized void put(int value){
    while(available == true){
    try{
    wait();
    }catch(InterruptedException ie){}
    }
    sharedValue = value;
    available = true;
    notifyAll(); //si ponemos notify() se podría desbloquear un escritor
    }
    }

    Monografias.com

    El paquete java.util.concurrent de la API estándar (a partir de la versión 5.0) contiene un conjunto de clases e interfaces de gran utilidad para el desarrollo de aplicaciones concurrentes. A continuación mostramos un ejemplo:

    BlockingQueue< E>
    Interfaz generificada que permite acceder una funcionalidad de cola con inserción, extracción y borrados atómicos y comportamiento síncrono.
    Métodos (sólo algunos):
    void put(E o) Añade el elemento especificado a la cola. Si no hay espacio suficiente en la cola (es tamaño de la cola se puede seleccionar en construcción), el hilo llamante se bloquea hasta que haya espacio disponible
    E take() Recupera la “cabeza” de la cola, si no hay ningún elemento en la cola espera hasta que se presente alguno
    Implementaciones:
    ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue
    Control de concurrencia con mecanismos prefabricados

    Monografias.com

    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

    Redes de ordenadores

    Monografias.com

    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
    Ingeniería del software: Abstracción

    Monografias.com

    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?
    (Gp:) Acelerar
    (Gp:) Frenar

    Abstracción
    Sistema complejo
    Representación para un conductor

    Monografias.com

    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)

    Monografias.com

    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

    Monografias.com

    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 en Computación Distribuida
    Servidor
    HTTP
    Red
    Navegador
    Abstracción
    Servidor
    HTTP
    Navegador
    Petición
    Respuesta
    Sistemas muy complejos
    Abstracción
    Permite entender interacciones

    Monografias.com

    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
    Abstracción en Computación Distribuida Cont.
    (Gp:) Presentación

    (Gp:) Lógica de la aplicación (negocio)

    (Gp:) Servicios

    Monografias.com

    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
    Abstracción en Computación Distribuida Cont.

    Monografias.com

    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 instru

    Partes: 1, 2

    Página siguiente 

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter