Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Introducción a la computación distribuida (Presentacion de Power Point) (página 3)




Enviado por Pablo Turmero



Partes: 1, 2, 3

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

Monografias.com
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
Ingeniería del software: UML

Monografias.com
Diagramas de clases básicos en UML

Monografias.com
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.

Ingeniería del Software: algo de terminología

Monografias.com
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
Ingeniería del Software: algo de terminología

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPá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