Introducción a la computación distribuida (Presentacion de Power Point) (página 2)
Enviado por Pablo Turmero
… digamos que sólo en teoría
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
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!”); } }
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); } }
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(“Hello, world!"); pw.close(); } }
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!
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; } … }
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”);
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”
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” …
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;
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 }
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 }
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.
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
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
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
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
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
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
Página anterior | Volver al principio del trabajo | Página siguiente |