Está en la página 1de 11

Repblica Bolivariana De Venezuela Ministerio Del Poder Popular Para La Defensa Universidad Nacional Experimental Politcnica De La Fuerza Armada

Ncleo Falcn Extensin Punto Fijo Asignatura: S.A. De Base De Datos

Integrantes: Pablo Montilla

9no. Sem. Ing. De Sistemas Punto Fijo, Mayo del 2012

Concurrencia y bloqueo en programacin java Un sistema concurrente se compone de un conjunto de procesos autnomos que se ejecutan, desde un punto de vista lgico, en paralelo. Los lenguajes de programacin concurrente incorporan la nocin de proceso:

Cada proceso tiene un flujo de control independiente. Las instrucciones de los procesos se ejecutan intercalndose unas con otras

Java es un lenguaje que permite formular programas concurrentes. Esto es, existen en Java sentencias que permiten construir un programa con mltiples lneas de flujo de control ( threads) que se ejecutan concurrentemente si la plataforma es multiprocesadora o que ejecutan de forma entra lazada sus sentencias dando apariencia de concurrencia si la plataforma es mono procesadora.

La unidad bsica de concurrencia en Java es el Thread, que representa un proceso ligero que comparte el mismo espacio de variables con los restantes threads del mismo programa. Dado que los Threads de un programa Java son todos ellos internos al programa, no se necesita la proteccin de seguridad de disponer de un nico espacio de variables propio de cada threads, y al tener un espacio de memoria nico se aligera y facilita los cambios de contexto entre threads.

Como se ha visto en los captulos previos del curso la concurrencia proporciona muchas ventajas de programacin, tanto en la gestin de entradas y salidas, de dispositivos externos o de las interacciones con el usuario, como para hacer que la estructura del programa sea mas prxima al dominio del problema al facilitar la programacin orientada a objetos y con objetos activos. En contrapartida la programacin concurrente requiere abordar nuevos situaciones sobre sincronizacin entre threads y acceso de forma segura a los objetos

compartidos, por lo que el lenguaje Java debe proporcionar sentencias y recursos que permitan abordarlas.

Class Thread

Un thread se crea en Java instanciando un objeto de la clase Thread. El cdigo que ejecuta un thread est definido por el mtodo run() que tiene todo objeto que sea instancia de la clases Thread. La ejecucin del thread se inicia cuando sobre el objeto Thread se ejecuta el mtodo start(). De forma natural, un thread termina cuando en run() se alcanza una sentencia return o el final del mtodo. (Existen otras formas de terminacin forzada)

Para declarar un thread en un programa Java se debe instanciar un objeto que sea una extensin (extends) la clase java.lang.Thread. Por cada objeto de con estas caractersticas que se declare en un programa java, se crea un nuevo thread con una lnea de flujo de control propia que se ejecutar concurrentemente con el programa principal y con los restantes threads.

Creacin de un thread por herencia public class PingPong extends Thread{ private String word; // Lo que va a escribir.

private int delay; // Tiempo entre escrituras public PingPong(String queDecir,int cadaCuantosMs){ } word = queDecir; delay = cadaCuantosMs; }; public void run(){ //Se sobrescribe run() de Thread while(true){ System.out.print(word + ); try{

} } sleep(delay); } catch(InterruptedException e){ return; }

public static void main(String[] args){ // Declaracin de 2 threads PingPong t1 =new PingPong(PING,33); PingPong t2= new PingPong(PONG,10); // Activacin t1.start(); t2.start(); // Espera 2 segundos try{ sleep(5000); }catch (InterruptedException e){}; // Finaliza la ejecucin de los threads t1.stop(); t2.stop(); } La clase java PingPong es una extensin de la clase Threads, por lo que cada una de sus instancias (por ejemplo t1 y t2 representan un nuevo thread java. El metodo run() es sobreescrito en la clase PingPong, y establece el cdigo que se ejecutar en cada instancia de la clase. En el ejemplo consiste en un bucle indefinido de escribir el valor del atributo word, y de suspenderse durante los milisegundos expresador en el atributo delay.

La sentencia try .. catch tiene que ser utilizada porque el mtodo sleep puede elevar una excepcin del tipo InterruptException. Con las sentencias que declaran e instancian los dos objetos t1 y t2 de la clase PingPong se han creado dos threads. La creacin supone que a los thread se les ha dotado de los recursos que

requieren, pero aun estn inactivos (esto es no se est ejecutando las sentencias de su mtodo run()). Con las sentencias que invocan los mtodos t1.start() y t2.start() de los objetos de la clase PingPong, se inicia en la ejecucin del cdigo de los respectivos procedimiento run(). En este caso (para hacer el ejemplo sencillo) los threads no finalizan nunca (observese el bucle while(true) de los mtodos run()). Se acabarn desde el entorno abortando el programa principal y todo lo que depende de l.

En Java, cada objeto tiene asociado un bloqueo, que no es accesible directamente desde el programa, pero se utiliza de forma indirecta mediante: El modificador de mtodo synchronized Slo se puede acceder al mtodo si se ha obtenido el bloqueo asociado con el objeto Los mtodos tiene acceso mutuamente exclusivo a los datos encapsulados por el objeto La sincronizacin de bloque Sincronizacin condicional public void wait (); Bloquea al hilo invocador y libera el bloqueo sobre el objeto public void notify ();

Concurrencia y bloqueo en programacin C C concurrente es el resultado de un esfuerzo de mejoramiento de C, para que pueda ser utilizado para el desarrollo de programas concurrentes que puedan correr eficientemente en una sola computadora, en redes de computadoras distribuidas o en computadoras multiprocesadores. C concurrente es una extensin compatible hacia arribe de C. Estas extensiones incluyen mecanismos para la declaracin y creacin de procesos, para la sincronizacin e iteracin de procesos y la terminacin de procesos. La programacin concurrente es esencial para la utilizacin eficiente de las arquitecturas multiprocesador. Hay veces en donde no es conveniente y

conceptualmente elegante el desarrollo de sistemas en donde varios eventos ocurren concurrentemente.

Un programa C concurrente consiste de uno o ms procesos. Los procesos son los bloques de desarrollo de la programacin concurrente. Cada proceso es un componente secuencial del programa que tiene su propio control de flujo, y su propio stack y registros. En teoria todos los proceso se ejecutan en paralelo (esto no es cierto si solamente hay un solo procesador). En algunas implementaciones multiprocesador, cada procesador tiene su propio calendarizador. Esto depende de la implementacin; una implementacin diferente podra dedicar un procesador a cada proceso. Cuando un programa C concurrente empieza su ejecucion, nomas existe un solo proceso activo.

Este proceso es conocido como el proceso main y llama a la funcion main. Archivo: hola.cc #include<stdio.h> main( ) { Printf(Hola Mundo\n) }

El siguiente programa el proceso main crea otrro proceso que tambin imprime mensajes.

Archivo: printer1.cc #include<stdio.h> process spec printer( ); process body printer( ) { Printf(Hola del proceso printer\n); main( )

{ printf (Hola del main\n); create printer ( ); printf( Adios del main\n); }

Control de concurrencia en bases de datos relacionales La mayora de las bases de datos se utilizan en entornos multi-usuario, en los que muchos clientes utilizando la misma aplicacin, o muchas aplicaciones cada una con uno o muchos clientes acceden a la misma base de datos. Cada una de esas aplicaciones enviar consultas al gestor, y normalmente cada hilo de ejecucin ser una transaccin diferente. En la mayora de los sistemas operativos actuales, las diferentes tareas o hilos se ejecutan de forma intercalada (incluso en el caso de mquinas con varios procesadores). Es decir, el sistema operativo decide por su cuenta cuando suspender una de las tareas y darle un poco de tiempo de ejecucin a otra. Si hay tareas simultneas o concurrentes sobre la misma base de datos, esta intercalacin puede resultar en que las lecturas y escrituras de las diferentes tareas o aplicaciones en el medio fsico se realicen en cualquier orden y secuencia.El acceso simultneo descrito puede dar como resultados informacin inconsistente o simplemente incorrecta, dependiendo de la mala o buena suerte que tengamos en la intercalacin de las lecturas y escrituras simultneas. Esta problemtica ha llevado a disear e implementar diferentes estrategias de control de concurrencia, que se encargan de evitar todos esos problemas, de modo que los desarrolladores de las aplicaciones pueden olvidarse de ellos al escribir su cdigo. Por ejemplo, si tenemos una estructura de tablas relacional que incluye las siguientes: PEDIDO(id, num-cliente, id-prod, cantidad, precio)

PRODUCTO(id-prod, nombre, ..., stock)

...

Pueden ocurrir diferentes problemas relacionados con la escritura simultnea con otras escrituras o lecturas, incluyendo los siguientes:Dos sentencias UPDATE que actualicen un mismo producto decrementando el stock del mismo en una unidad podran terminar en que una de ellas no se realizase. Si pensamos en un UPDATE como una secuencia de una lectura y una escritura, puede que ambos UPDATE hagan la lectura, por ejemplo, de un stock de 10, y despus las escrituras, decrementan ese dato, quedando el resultado en 9, mientras que lo correcto era un resultado de 8. Supongamos una sentencia que primero comprueba que hay stock del producto P, y despus inserta un nuevo PEDIDO de diez unidades del producto P, que tiene un stock de 10, seguido de un UPDATE al stock por esa cantidad. Puede que otra insercin de un pedido se ejecute antes del UPDATE pero despus de la comprobacin, haciendo quedar el stock del producto en negativo.

Existen varias tcnicas para controlar la concurrencia. Los bloqueos son los ms conocidos, aunque tambin se utiliza el control multi-versin y otras tcnicas como las marcas de tiempo.

Los bloqueos como solucin al problema de la concurrencia Una forma de controlar la concurrencia es hacer que cada transaccin deba adquirir un derecho de acceso exclusivo a cada fragmento de datos que necesite modificar. A estos derechos se les denomina bloqueos.

Bloqueos binarios La forma ms simple de bloquear es utilizar bloqueos binarios. En un bloqueo binario, cada transaccin debe solicitar el bloqueo de cada fragmento de datos A que vaya a utilizar antes de acceder a l (sea para leerlo o escribirlo), mediante una operacin bloquear(A). Deber liberar todos los bloqueos, mediante una operacin desbloquear(A) de modo que otras tareas puedan tomarlos.

Este sistema de bloqueos tiene una implementacin muy simple, ya que solo requiere mantener una tabla que indica qu partes de los datos est bloqueada y por qu transaccin.

Bloqueos de lectura/escritura El sistema de bloqueos binarios es simple pero demasiado restrictivo, ya que no permite que dos transacciones que van a leer el mismo fragmento de datos A lo hagan simultneamente, cuando en realidad, no puede haber problemas en varios lectores simultneos. Los bloqueos de lectura/escritura hacen ms dbil la restriccin permitiendo la siguiente compatibilidad de bloqueos.

En este caso, las operaciones que las transacciones deben realizar son tres: desbloquear(A) y bloquear_para_lectura(A) o bloquear_para_escritura(A).

Ntese que esas llamadas se implementan de diferentes formas en diferentes gestores de bases de datos. Por ejemplo, en MySQL, tanto las solicitudes de bloqueos como las liberaciones se realizan mediante una sola llamada del API de los gestores de almacenamiento:

store_lock(THD *thd, THR_LOCK_DATA **to, enum thr_lock_type lock_type) Cada llamada a store_lock utiliza el manejador de una tabla thd concreta, y se indica la informacin de los datos a bloquear mediante la variable to, y el tipo de bloqueo mediante lock_type (el nmero de tipos definidos en MySQL es muy grande, ya que cubre todos los tipos de bloqueo que implementan los mltiples gestores de almacenamiento disponibles).

Serializacin de los bloqueos de lectura/escritura La serializacin de las operaciones de lectura y escritura consiste en ordenar esas operaciones para un conjunto de transacciones concurrentes de modo que los resultados de las operaciones sean correctos. Por ejemplo, si tenemos las siguientes transacciones X e Y, puede darse la siguiente situacin.

En esa situacin, la ejecucin de TX y TY hace que el dato original slo se haya incrementado una vez, cuando tena que haberse incrementado dos veces. Sin embargo, si hubisemos tenido suerte y todas las operaciones de TX se hubiesen realizado antes que las de TY, el resultado habra sido correcto.La conclusin es que el mero mecanismo de los bloqueos garantiza el acceso exclusivo a un dato o fragmento de informacin (evitando ciertos problemas), pero los problemas asociados a la intercalacin de las operaciones compuestas an pueden darse.Por

lo tanto, hace falta alguna poltica o mecanismo de adquisicin y liberacin de bloqueos que permita hacer las operaciones serializables.

Inconvenientes de los bloqueos y la serializacin Un problema del protocolo de bloqueo en dos fases es que puede llevar a situaciones de interbloqueo. La siguiente es una secuencia de operaciones que lleva al interbloqueo pero cumple perfectamente l protocolo de bloqueo en dos fases.

También podría gustarte