Você está na página 1de 20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

GUIA 8

ALGORITMOS PARALELOS Y ALGORITMOS CON RETROCESO


Que otros se jacten de las paginas que han escrito, a mi me enorgullecen las que he ledo J.L.Borges

John E. Hopcroft nacido el 7 de octubre de 1939, es uno de los mas renombrados tericos de la ciencias de la computacin, se gradu como bachiller en la Universidad de Seatle en 1961, obtuvo su maestra y doctorado en la Universidad de Stanford en 1962 y 1964 respectivamente. Trabajo varios aos en la Universidad de Princeton. Es profesor de Ingeniera y Matemticas aplicadas a las ciencias de la computacin. Es reconocido como coautor junto con Alfred Aho y Jeffrey Ullman el libro de algoritmos y lenguajes formales

Objetivos de aprendizaje 1. 2. 3. 4. Definir el concepto de algoritmo paralelo Definir el concepto de programacin concurrente Definir el concepto de algoritmo con retroceso Construir ejemplos de algoritmos paralelos

Introduccin
Convencionalmente un algoritmo supone que se ejecuta en una maquina que puede ejecutar una instruccin a la vez. Las maquinas modernas realizan simultneamente el calculo con las operaciones de entrada y salida ( esperar que se pulse una tecla o botn, leer un archivo, imprimir un reporte etc.) Si consideramos las posibilidades de que la maquina pudiera calcular varias decenas de o incluso varios centenares de expresiones diferentes a la vez, esto acelerara nuestras algoritmos en igual medida. Aunque es probable que no se cuente con computadores capaces de efectuar estos clculos en paralelo, se esta

Augusto Cortez Vsquez

Pg. 1/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

extendiendo el inters por los algoritmos paralelos que aprovechan esta capacidad.
Basado en una maquina Von Newman. Ejecuta una instruccin a la vez aplicndola a un dato a la vez siguiendo un programa que esta almacenado en la memoria de la maquina

Computacin ordinaria Computacin paralela

Se realizan en paralelo las instrucciones. Se le asigna un procesador a cada elemento del conjunto de instrucciones

La programacin paralela o programacin concurrente es una tcnica de programacin basada en la ejecucin simultnea, bien sea en un mismo ordenador (con uno o varios procesadores) o en un cluster de ordenadores, en cuyo caso se denomina computacin distribuida. Los sistemas multiprocesador o multicomputador consiguen un aumento del rendimiento si se utilizan estas tcnicas. En los sistemas monoprocesador el beneficio en rendimiento no es tan evidente, ya que la CPU es compartida por mltiples procesos en el tiempo, lo que se denomina mltiplex accin. La esencia de la programacin concurrente es la divisin de una tarea en mltiples sub-tareas que puedan ser realizadas relativamente independientemente unas de otras para combinarlas despus. Los padres de la computacin paralela fueron Edsger Dijkstra y C.A.R.Hoare. El mayor problema de la computacin paralela radica en la complejidad de sincronizar unas tareas con otras, ya sea mediante secciones crticas, semforos o paso de mensajes, para garantizar la exclusin mutua en las zonas del cdigo en las que sea necesario.

Temas relacionados
Procesos Hilos Seccin Critica Exclusin mutua Semforos Paso de Mensajes

Augusto Cortez Vsquez

Pg. 2/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Proceso
Concepto aplicado en informtica a la ejecucin de un conjunto de instrucciones entregadas a la CPU para el cumplimiento de una etapa especfica sealada por los comandos de algn programa. Por ejemplo, dada una frmula en una hoja de clculo y establecidos los valores de sus variables, el proceso sera la ejecucin de la frmula para obtener un resultado. En el contexto de los sistemas operativos, proceso es cualquier programa en ejecucin desde el punto de vista del sistema operativo quien se encarga de proporcionar a todos los procesos el reparto del tiempo de CPU y del resto de recursos del computador. El sistema operativo es tambin el encargado de cargar los programas desde el disco a la memoria, de iniciar su ejecucin y de liberar los recursos asignados al proceso tras su terminacin. El mecanismo por el cual un proceso crea otro se denomina bifurcacin (fork). Ciclo de vida de un proceso ejecucin(ready) Completo ejecucion
Listo(ready)

Espera(wait)
Cola de procesos

Hilo
Muchos lenguajes de programacin (como Java), y otros entornos de desarrollo soportan los llamados hilos o hebras (en ingles, threads). Los hilos son similares a los procesos en que ambos representan una secuencia simple de instrucciones ejecutada en paralelo con otras secuencias. Los hilos son una forma de dividir un programa en dos o ms tareas que corren simultneamente. Un ejemplo de hilos es tener un hilo atento a la interfaz grafica (iconos, botones, ventanas), mientras otro hilo hace una larga operacin internamente. De esta manera el programa responde ms gilmente a la interaccin con el usuario. Los hilos se distinguen de los tradicionales procesos multitarea en que los procesos son tpicamente independientes, llevan bastante informacin de estados, e interactan slo a travs de mecanismos de comunicacin dados por el sistema. Por otra parte, muchos hilos generalmente comparten otros recursos directamente. En sistemas operativos que proveen facilidades para los hilos, es ms rpido cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a otro. Sistemas Operativos como Windows NT, OS/2 y Linux (2.5 o superiores) han dicho tener hilos "baratos", y procesos "costosos" mientras que en otros sistemas no hay una gran diferencia.

Augusto Cortez Vsquez

Pg. 3/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Una ventaja de los programas multihilo es que pueden operar ms rpido en sistemas de computadores con mltiples CPUs o a travs de grupo de mquinas ya que los hilos del programa se prestan verdaderamente para ejecucin concurrente. En tal caso el programador necesita ser cuidadoso para evitar condiciones de carrera (problema que sucede cuando diferentes hilos o procesos alteran datos que otros tambin estn usando), y otros comportamientos no intuitivos. Los hilos generalmente requieren reunirse para procesar los datos en el orden correcto. Es posible que los hilos requieran de operaciones atmicas para impedir que los datos comunes sean cambiados o ledos mientras estn siendo modificados. El descuido de esto puede generar estancamiento. El uso de hilos en programacin frecuentemente causa una inconsistencia de estado. Un error comn es crear una variable global e invocar subprogramas que dependen de sta. Los Sistemas Operativos generalmente implementan hilos de dos maneras: Multihilo preventivo: Permite al S.O. determinar cuando debe haber un cambio de contexto. La desventaja de esto es que el sistema puede hacer un cambio de contexto en un momento inadecuado. Multihilo coperativo: Depende del mismo hilo abandonar el control cuando llega a un punto de detencin lo cual puede traer problemas cuando el hilo espera un recurso para estar disponible. El soporte de hardware para software es provisto por multihilos simultneos. Esta caracterstica fue introducida por Intel en el Pentium 4, bajo el nombre de Hyper-threading.

Seccin crtica
Se denomina seccin crtica, en programacin concurrente, a la porcin de cdigo (programa) que se encarga de gestionar o manipular un recurso crtico o no compartible. Slo un proceso puede estar en una seccin crtica a la vez. El mtodo ms comn para evitar que dos procesos accedan al mismo tiempo a un recurso es el de la exclusin mutua.

Exclusin mutua (informtica)


Los algoritmos de exclusin mutua (comnmente abreviada como mutex) se usan en programacin concurrente para evitar que fragmentos de cdigo conocidos como secciones crticas accedan concurrentemente a recursos que no pueden ser compartidos. La mayor parte de estos recursos son las seales, contadores, colas y otros datos que se emplean en la comunicacin entre el cdigo que se ejecuta cuando se da servicio a una interrupcin y el cdigo que se ejecuta el resto del tiempo. Se trata de un problema vital porque, si no se toman las precauciones debidas, una interrupcin puede ocurrir entre dos instrucciones cualesquiera del cdigo normal. Si la seccin crtica no est protegida, esto puede provocar fallos graves. La tcnica que se emplea por lo comn para conseguir la exclusin mutua es inhabilitar las interrupciones durante el conjunto de instrucciones ms pequeo que impedir la corrupcin de la estructura compartida, denominado "seccin critica". Esto impide que el cdigo de la interrupcin se ejecute en mitad de la seccin crtica. En un sistema multiprocesador de memoria compartida, se usa la operacin test-and-set indivisible sobre una bandera para esperar hasta que el otro procesador la despeje. La operacin test-and-set realiza ambas operaciones sin liberar el bus de memoria a otro procesador. As, cuando el cdigo deja la seccin crtica, se despeja la bandera. Esto se conoce como "spin lock" o "espera activa".

Augusto Cortez Vsquez

Pg. 4/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Algunos sistemas tienen instrucciones multioperacin indivisibles similares a las anteriormente descritas para manipular las listas enlazadas que se utilizan para las colas de eventos y otra estructura de datos que los sistemas operativos usan comnmente. La mayora de los mtodos de exclusin mutua clsicos intentan reducir la latencia y espera activa mediante las colas y cambios de contexto. Algunos investigadores afirman que los "benchmarks" indican que estos algoritmos especiales pierden ms tiempo del que ahorran. A pesar de todo lo dicho, muchas tcnicas de exclusin mutua tienen efectos colaterales. Por ejemplo, los semforos permiten interbloqueos en los que un proceso obtiene un semforo, otro proceso obtiene el semforo y ambos se quedan a la espera de que el otro proceso libere el semforo. Otros efectos comunes incluyen la inanicin, en el cual un proceso esencial no se ejecuta durante el tiempo deseado, y la inversin de prioridades, en el que una tarea de prioridad elevada espera por otra tarea de menor prioridad, as como la latencia alta en la que la respuesta a las interrupciones no es inmediata. La mayor parte de la investigacin actual, en este campo, pretende eliminar los efectos anteriormente descritos. Si bien no hay un esquema perfecto conocido, hay un interesante esquema no clsico de envo de mensajes entre fragmentos de cdigo que, aunque permite inversiones de prioridad y produce una mayor latencia, impide los interbloqueos. Algunos ejemplos de algoritmos clsicos de exclusin mutua son:

El algoritmo de Dekker El algoritmo de Peterson.

Semforo
Un semforo es una variable protegida (o tipo abstracto de datos) que constituye el mtodo clsico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento) en un entorno de multiprocesamiento. Fueron inventados por Edsger Dijkstra y se usaron por primera vez en el sistema operativo T.H.E. P(Semforo s) {// Autor Augusto Cortez while (s == 0) ; /* espera hasta que s>0 */ s = s-1; } V(Semforo s) { s = s+1; } Inicia(Semforo s, Entero v) { s = v; }

Los semforos slo pueden ser manipulados usando las operaciones siguientes:
P y V tienen su origen en el holands "Proberen", probar, y "Verhogen", incrementar. El valor del semforo es el nmero de unidades del recurso que estn disponibles. (Si slo hay un recurso, se utiliza un "semforo binario" con los valores 0 y 1). La operacin P detiene la ejecucin hasta que hay un recurso disponible, en cuyo caso lo reclama inmediatamente. V es la operacin inversa; hace disponible un recurso despus de que el proceso ha terminado de usarlo. Inicia se utiliza para inicializar el semforo antes de que se hagan peticiones sobre l. Las operaciones P y V han de ser indivisibles, lo que quiere decir que cada una de las operaciones no puede ejecutarse mltiples veces de manera concurrente. Si un proceso desea ejecutar una operacin que est siendo ejecutado por otro proceso debe esperar hasta que ste la finalice en primer lugar.

Augusto Cortez Vsquez

Pg. 5/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

La operacin V es denominada a veces "subir" el semforo ("up") y la operacin P se conoce tambin como "bajar" el semforo ("down"). Para evitar la espera activa, un semforo puede tener asociada una cola de procesos (normalmente una cola FIFO). Si un proceso efecta una operacin P en un semforo que tiene valor cero, el proceso se aade a la cola del semforo. Cuando otro proceso incrementa el semforo mediante la operacin V y hay procesos en la cola asociada, se extrae uno de ellos de la cola y reanuda su ejecucin.

Paso de mensajes
El paso de mensajes es una tcnica empleada en programacin concurrente para aportar sincronizacin entre procesos y permitir la exclusin mutua, de manera similar a como se hace con los semforos, monitores, etc. Su principal caracterstica es que no precisa de memoria compartida, por lo que es muy importante en la programacin para sistema distribuido. Los elementos principales que intervienen en el paso de mensajes son el proceso que enva, el que recibe y el mensaje. Dependiendo de si el proceso que enva el mensaje espera a que el mensaje sea recibido, se puede hablar de paso de mensajes sncrono o asncrono. En el paso de mensajes asncrono, el proceso que enva, no espera a que el mensaje sea recibido, y contina su ejecucin, siendo posible que vuelva a generar un nuevo mensaje y a enviarlo antes de que se haya recibido el anterior. Por este motivo se suelen emplear buzones, en los que se almacenan los mensajes a espera de que un proceso los reciba. Generalmente empleando este sistema, el proceso que enva mensajes solo se bloquea o para, cuando finaliza su ejecucin, o si el buzn esta lleno. En el paso de mensajes sncrono, el proceso que enva el mensaje espera a que un proceso lo reciba para continuar su ejecucin. Por esto se suele llamar a esta tcnica encuentro, o rendezvous. Dentro del paso de mensajes sncrono se engloba a la llamada a procesamiento remoto, muy popular en las arquitecturas cliente/servidor. "

Formato general de un algoritmo paralelo


Un programa em paralelo puede desarrollarse de la siguiente forma

Para todo X

S hacer em paralelo INSTRU(X)

Asigna un procesador a cada elemento X del conjunto S, de tal forma que se ejecuten las instrucciones de INSTRU(X) para cada uno de estos elementos en paralelo, utilizando X como datos y calculando en el procesador asignado.

Ejemplo 1
Computo para un rbol binario completo

Augusto Cortez Vsquez

Pg. 6/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Deseamos calcular la suma de n enteros: 5, 13, 3, 2, 9, 8, 2, 5.


47

23

24

18

17

2
5 13 3 2 9 8 2 5

Se suman los elementos de las hojas en pares colocando la suma en el nodo padre. As la suma 18= 5 + 13 se coloca en el nodo padre de 5 y 13 3 la suma 5= 3 + 2 se coloca en el nodo padre de 3 y 2 Para esta iteracin se requieren 4 procesadores En la siguiente iteracin se necesitaran 2 procesadores En la ltima iteracin se requerir solo un procesador Supongamos que n es potencia de 2, si no lo es basta con aadir los elementos nulos que sean necesarios. Estos n elementos se sitan en las hojas del rbol binario completo. Paso 1 Paso 2 Se calculan en paralelo la suma de los elementos del ltimo nivel (nivel 3) Se calcula en paralelo la suma de los elementos del nivel siguiente (nivel 2)

Seguir sucesivamente hasta que en el paso Log n-esimo el valor que se obtiene en la raz es la solucin completa Sea n = 2 k sea A vector con ndices en el rango 1 a 2n 1 Este vector puede almacenar un rbol binario con 2n-1 nodos A(1) en la raz A(i) tiene a su hijos izquierdo y derecho en los nodos A(2*i) y A(2*i+1) respectivamente A(i) tiene a su padre en el nodo A(i/2) Los n nodos estn situados en las hojas en las posiciones que van desde A(n) hasta A(2n-1) Accin Suma_Par(A, N) Inicio // Autor Augusto Cortez // calcula la suma de A(n) + A(n+1)+...A(2n-1) Para i desde log n-1 hasta 0 (incremento 1) Para 2i j 2 i+1 - 1 hacer en paralelo A(j) = A(2j) + A(2j + 1) FinPara FinPara Fin Se requiere la nica sincronizacin que todos los clculos paralelos para un valor particular de i deben haber finalizado antes que comiencen los clculos correspondientes al prximo valor de i El algoritmo efecta las n pasadas por el bucle as que el tiempo total requerido esta en O(Log N) . El mximo nmero de procesadores que tienen que funcionar es n/2

Augusto Cortez Vsquez

Pg. 7/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Durante una pasada por el bucle i, cada procesador implicado efecta dos accesos a memoria para leer sus operandos, una adicin y un acceso final a memoria para almacenar el resultado. Como se supone que un acceso a memoria requiere tiempo constante, el trabajo total necesario por parte de cada procesador tambin requiere un tiempo constante. Como los procesadores funcionan en paralelo, todo el trabajo necesario para una pasada por el bucle se puede ejecutar en un tiempo constante. El algoritmo efecta (log n ) pasadas por el bucle, as que el tiempo esta en O(log n). El mximo nmero de procesadores que tiene que funcionar simultanemante es n/2.

Ejemplo 2 Duplicacin de punteros


Queremos calcular para cada elemento i, la distancia d (i) desde ese elemento hasta el final de la lista Una solucin convencional consistira en recorrer la lista contando los nodos en la variable Cont. Esto requiere un tiempo de O(Long(L)). Luego recorrer nuevamente la lista y asignar al primer nodo dist (i) = Cont, decrementar Cont, y asignar su valor al siguiente nodo, y as sucesivamente. Esto requiere nuevamente un tiempo de orden O(Long(L)) Presentamos una solucin mediante un algoritmo en paralelo: Se inicializa en cada nodo i Dist(i) = 1, luego se actualiza en cada iteracin Dist(i) = Dist(i) +Dist(Suc(i)) Supongamos que estn disponible tantos procesadores como elementos hay en L. As que podemos asociar un procesador distinto a cada elemento de la lista.

Cada nodo tiene la siguiente estructura

Inicio

Reg Nodo Tipo entero Nodo FinReg Nodo Cab

Valor Dist Suc

2 1 2

1 2 1

0 1 3 1

Augusto Cortez Vsquez

Pg. 8/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso Accion Dist_Par(L) // Autor Augusto Cortez Inicio Para cada i L hacer en paralelo Si ( Suc(i) = * ) Ddist(i) = 0 Sino Dist(i) = 1

Algoritmica III 2010-II

FinSi FinPara Repetir log n veces Para cada i L hacer en paralelo Si ( Suc(i) *) Dist(i) = Dist(i) + Dist(Suc(i)) Suc(i) = Suc(Suc(i)) FinSi FinPara Fin Repetir Tal como se muestra en la figura, los campos de punteros de la lista original se modifican y se destruyen la estructura de la lista. Si no se desea esto, se copian los punteros en la fase inicial del algoritmo y despus se trabaja con la copia. Cada procesador esta asignado a cada elemento de la lista. No existe problema con los intentos simultneos de escribir en una misma posicin, puesto que cada procesador asigna solamente valores a d y a Sig en su propio elemento. No hay problema por los intentos simultneos en leer en la misma pocin. Sin embargo es preciso preocuparse por los valores que cambian antes de hallarnos tenido tiempo de leerlos. Cuando varios procesadores estn ejecutando la instruccin dist(i) = dist(i) + dist(suc(i)) En paralelo, la sincronizacin debe ser tan fuerte que nos permita asegurar que el procesador asignado al elemento i va a leer el valor necesario de Dist(Suc(i)) antes de que el procesador asignado al elemento Suc(i) cambie su valor a d. Forma ms sencilla Para toda i, todas las lecturas necesarias para evaluar expresiones del lado derecho se ejecutan antes de haber escrito ningn valor nuevo en las variables del lado izquierdo. Igualmente, en la instruccin Suc (i)= Suc (Suc (i)), los lecturas necesarias para evaluar las expresiones del lado derecho deben de producirse todas ellas antes de que se haya escrito ningn valor nuevo en las variables del lado izquierdo. El algoritmo se detiene cuando todo SIG(i) = * para todo i en L En cada ejecucin de SIG (i) = SIG (SIG (i)) los punteros se duplican 1 2 3 SIG(i) apunta originalmente al elemento que sigue a i en L SIG(i) apunta a dos lugares de distancia de i SIG(i) apunta a 4 lugares de distancia de i

Cuando un puntero se sale de la lista, se le asigna nulo, dado que hay n nodos, basta con duplicar la longitud de los punteros Log n veces para asegurarnos que todos se salen por un extremo.

RBOLES DE EXPRESIONES
Un rbol ordenado puede usarse para representar una expresin aritmtica. El recorrido inorden del rbol produce la expresin en notacin infija. De igual forma los recorridos preorden y post orden producen la notacin prefija y postfija respectivamente. Un rbol de expresin es un rbol binario que cumple:

Augusto Cortez Vsquez

Pg. 9/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso Los nodos hojas estn etiquetados con operandos Los nodos no hojas estn etiquetadas con operadores

Algoritmica III 2010-II

La sintaxis abstracta describe una expresin construida mediante la aplicacin de un operador binario OP a dos subexpresiones E1 y E2.

OP

E1

E2

Sea E una expresin aritmtica Si OP = + , entonces el valor de E es la suma de los valores de E1 y E2 , Si OP = * entonces el valor de E es el producto de los valores de E1 y E2.

Ejemplo 3 +

4
pre-orden In-orden Post-orden

h
+4h 4+h 4h+ notacin prefija notacin infija notacin postfija

Ejemplo 4
*

pre-orden In-orden Post-orden

*5+8a 5*8+a 58a+*

notacin prefija notacin infija notacin postfija

Ejemplo 5

Augusto Cortez Vsquez

Pg. 10/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Aunque generalmente en una expresin los operadores son binarios. Un rbol de expresin puede representar tambin expresiones de operadores no binarios

Ejemplo 6
A

Ejemplo 7

Seno

Log

orden previo orden simtrico

* Seno ( ) + a Log( ) Seno * a + Log Pg. 11/20

Augusto Cortez Vsquez

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

orden posterior

Seno a a

Log + *

Ejemplo 8
Construir un algoritmo en paralelo para evaluar una expresin aritmtica en un rbol de expresin Un rbol de expresin tiene la siguiente forma OP

E1

E2

Puede asignarse un procesador a E1 y un procesador a E2, cuando cada uno haya terminado su proceso entregara su resultado a un procesador quien se encargara de procesar ambos resultados

Retroceso o backtracking
Ejemplo prctico: problema de acomodar el mobiliario en una nueva casa Hay muchas posibilidades que intentar, pero de hecho solo se suelen considerar unas cuantas. Iniciando sin acomodo alguno, cada pieza del mobiliario se coloca en alguna parte de la habitacin. Si se colocan todos los muebles y el propietario queda contento, el algoritmo termina. Si se alcanza un punto en donde toda colocacin subsecuente de muebles es indeseable, debemos deshacer el ltimo paso e intentar otra alternativa. Esto puede forzar nuevamente otra descolocacin, y as sucesivamente. Si encontramos que deshacemos todos los primeros pasos posibles, entonces no hay ninguna colocacin de muebles que sea satisfactoria. A pesar que el algoritmo es de fuerza bruta, no ensaya directamente todas las posibilidades, por ejemplo nunca intenta colocar la cocina en el bao, esto queda descartado. Muchas posibilidades que se detectan en un conjunto indeseable de acomodos quedan descartadas. La eliminacin de un grupo grande de posibilidades se denomina poda. Anlisis sintctico de expresiones Cuando se quiere hacer el anlisis sintctico de una expresin, se analizan cada una de las reglas de derivacin, ni no se llega a un terminal, entonces se retrocede y se elige otra regla de derivacin Regla1 Regla 2 S aS /bA A bA/b

Reconocer aaabbbbb utilizando las reglas

Augusto Cortez Vsquez

Pg. 12/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

S->

EJERCICIOS A RESOLVER PARA ENTREGAR INFORME EN LA PROXIMA SESION I Responda en forma breve y concisa a) Quien es considerado el padre de la computacin paralela b) En la programacin paralela, cuales son los elementos principales que intervienen en el paso de mensajes? c) A que se denomina seccin critica? d) En que consisten los algoritmos de exclusin mutua? e) Cuales son los estados del ciclo de vida de un proceso explique cada uno f) Cuando se envan mensajes, se puede hablar de tipos de paso de mensajes, cuales son, explique. II Proporcione una solucin mediante algoritmo paralelo para los siguientes casos a) Evaluar una expresin aritmtica haciendo uso de un rbol de expresin b) Construir un algoritmo paralelo para sumar N enteros haciendo uso de un rbol en completo c) Hallar el producto interno de dos vectores

d) Hallar el mayor valor de un vector

III Sean n elementos de tamao t1,t2,tn. Todos los tamaos satisfacen 0< ti 1. El problema consiste en empaquetar esos elementos en el menor nmero de recipientes, dado que cada recipiente tiene capacidad unitaria. Para ello hay varias polticas de solucin S1: Algoritmo en lnea - prximo ajuste: al revisar cada elemento, revisamos si cabe en el mismo recipiente que el ltimo elemento. Si es as, se coloca all; sino, se crea un recipiente S2: Algoritmo en lnea - primer ajuste: recorre los recipientes en orden y coloca el elemento nuevo en el primero en que haya suficiente espacio para contenerlo. S3: Algoritmo en lnea - mejor ajuste: en vez de colocar un elemento nuevo en el primer espacio que se encuentre, se

Augusto Cortez Vsquez

Pg. 13/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

pone en el espacio mas ajustado de entre todos los recipientes (el que menos desperdicio produzca S4: Algoritmo fuera de lnea: Se puede ver la lista de elementos completa antes de producir respuesta, por lo que se puede planificar un resultado mejor a) Muestre el comportamiento de las polticas mencionadas para el siguiente caso especfico: Suponga los siguientes elementos de tamaos: 0.2 , 0.5 , 0.4 , 0.7 , 0.1 , 0.3 y 0.8 que tenemos b) Construya un algoritmo para la poltica S1, evale el algoritmo c) Construya un algoritmo para la poltica S2, evale el algoritmo d) Construya un algoritmo para la poltica S3, evale el algoritmo e) Construya un algoritmo para la poltica S4, evale el algoritmo IV Construya reglas para reconocer frases de la forma wcwR donde w es una tira compuestas por por lo menos una a o b, y wR es el reciproco de w. Realice el anlisis para dos frases no triviales

Ejercicios suplementarios ( opcionales) Muestra dos botones uno para incrementar y otro para decrementar
package hilos; import java.awt.*; import java.awt.event.*; import java.lang.*; import java.io.*; public class P2 extends java.applet.Applet implements ActionListener , Runnable { private Button bdec, binc; private TextField tMuestra; private Panel p1,p2; private boolean x=false; private boolean y=false; private int i=0,j=6,a,m=1; public void init() { p1=new Panel(); p1.add(bdec = new Button(" DEC ")); bdec.addActionListener(this); p1.add(tMuestra = new TextField(10)); tMuestra.addActionListener(this); tMuestra.setEditable(false); p1.add(binc = new Button(" INC ")); binc.addActionListener(this); add(p1); } public void run() { while(x)

Augusto Cortez Vsquez

Pg. 14/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

{ if(a % 2 != 0) { muestraAscendente(); } while(y) { if(a % 2 == 0) { muestraDescendente(); } }

public void actionPerformed(ActionEvent e) { if(e.getSource() == binc) { y=false; x=true; a=m; new Thread(this).start(); m++; } if(e.getSource() == bdec) { x=false; y=true; a=m; new Thread(this).start(); m--; } } public synchronized void muestraAscendente() { if(i<20) { try { i+=1; tMuestra.setText(" "+i+" "); Thread.sleep(599); } catch(InterruptedException e) {} }; } public synchronized void muestraDescendente() { if(i>1) { try { i-=1; tMuestra.setText(" "+i+" "); Thread.sleep(599); } catch(InterruptedException e) {} }; } }

Augusto Cortez Vsquez

Pg. 15/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

Ejemplo 2
//Archivo Multihola JMC package Hilos; public class MultiHola { public static void main(String[] args) { // TODO code application logic here TestTh t1,t2,t3,t4,t5,t6; // Creamos los threads t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) ); t2 = new TestTh( "Thread 2",(int)(Math.random()*2000) ); t3 = new TestTh( "Thread 3",(int)(Math.random()*2000) );//1000 es un segundo t4 = new TestTh( "Thread 1",(int)(Math.random()*2000) ); t5 = new TestTh( "Thread 2",(int)(Math.random()*2000) ); t6 = new TestTh( "Thread 3",(int)(Math.random()*2000) );//1000 es un segundo // Arrancamos los threads t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); } }

Ejemplo 3 // Archivo Multihola JMC


package Hilos; public class TestTh extends Thread { private String nombre; private int retardo; /** Creates a new instance of TestTh */ public TestTh(String s, int d) { nombre = s; retardo = d; } // El metodo run() es similar al main(), pero para // threads. Cuando run() termina el thread muere public void run() { // Retasamos la ejecucin el tiempo especificado try { sleep( retardo ); } catch( InterruptedException e ) { Augusto Cortez Vsquez Pg. 16/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

; } // Ahora imprimimos el nombre System.out.println( "Hola Mundo! "+nombre+" "+retardo ); } }

Ejecucion
Hola Mundo! Thread 2 218 Hola Mundo! Thread 2 338 Hola Mundo! Thread 3 885 Hola Mundo! Thread 1 1057 Hola Mundo! Thread 3 1440 Hola Mundo! Thread 1 1449

Ejemplo 4 PROGRAMA DesplazaIDH1 : CREADO EN MODO APPLE Muestra dos flechas que se desplazan a la izquierda y dos botones para poder cambiar su direccin de desplazamiento
package hilos; import java.awt.*; // Autor Augusto Cortez import java.awt.event.*; public class DesplazaIDH1 extends java.applet.Applet implements Runnable//<-OjO { private TextField t1, t2, t3; private final int MAXCOLUMNAS = 10; //para todos los campos de texto public static final String DERECHA = "==>"; public static final String IZQUIERDA = "<=="; private String sentido; private int posicin; //0 == t1, 1 == t2, 2 == t3 public void init() { add(t1 = new TextField("", MAXCOLUMNAS)); t1.setEditable(false); add(t2 = new TextField(IZQUIERDA, MAXCOLUMNAS)); posicin = 1; t2.setEditable(false); add(t3 = new TextField("", MAXCOLUMNAS)); t3.setEditable(false); add(new BotnI(this, IZQUIERDA)); add(new BotnD(this, DERECHA)); setSentido(IZQUIERDA); //empieza desplazando hacia la izquierda new Thread(this).start();//<-OjO } public void setSentido(String sentido) {

Augusto Cortez Vsquez

Pg. 17/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

if(sentido.equals(this.sentido)) { return; } this.sentido = sentido; switch(posicin) { case 0: t1.setText(sentido); break; case 1: t2.setText(sentido); break; default: t3.setText(sentido); } } private void desplazaUno() { String temp; try { Thread.sleep(250); } catch(InterruptedException e) {} t1.setText(""); t2.setText(""); t3.setText(""); if(sentido.equals(DERECHA)) { posicin = ++posicin % 3; } else { //sentido.equals(IZQUIERDA) posicin = (posicin == 0) ? 2 : (posicin - 1); } switch(posicin) { case 0: t1.setText(sentido); break; case 1: t2.setText(sentido); break; default: t3.setText(sentido); } } public void run() { while(true) { desplazaUno(); } } //establece nuevo sentido

Augusto Cortez Vsquez

Pg. 18/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

abstract class Botn extends Button { protected DesplazaIDH1 dIDH1; protected Botn(String etiqueta, DesplazaIDH1 dIDH1) { super(etiqueta); enableEvents(AWTEvent.ACTION_EVENT_MASK); this.dIDH1 = dIDH1; } }

class BotnD extends Botn { public BotnD(DesplazaIDH1 dIDH1, String etiqueta) { super(etiqueta, dIDH1); } public void processActionEvent(ActionEvent e) { super.processActionEvent(e); dIDH1.setSentido(DesplazaIDH1.DERECHA); } } class BotnI extends Botn { public BotnI(DesplazaIDH1 dIDH1, String etiqueta) { super(etiqueta, dIDH1); } public void processActionEvent(ActionEvent e) { super.processActionEvent(e); dIDH1.setSentido(DesplazaIDH1.IZQUIERDA); } }

REFERENCIAS BIBLIOGRAFICAS
1. [HERNANDEZ 2001] Hernandez, R.; Lazaro, J.C.; Dormido, R.; Ros, S. Estructura de Datos y Algoritmos; Prentice Hall 2001, Madrid Espaa. 2. [BRASSARD 1998] Brassard,G. Bratley,P. Fundamentos de Algoritmia, Prentice Hall 1998 Madrid 3. [CORTEZ 1999] Cortez Vasquez,Augusto. Matematica Discreta, UNMSM FISI Lima 1999. Augusto Cortez Vsquez Pg. 19/20

Programacin Paralela y Programacin concurrente Hilos Algoritmos con retroceso

Algoritmica III 2010-II

[CORTEZ 2002] Cortez Vsquez,Augusto. Algoritmica y Programacin, UCSS Lima 2002. 5 [CORTEZ 2002] Cortez Vasquez,Augusto. Estructura de datos y algoritmos, estructuras no lineales, URP Lima 2002. 6 [GRASSMANN 1996] Grasssmann W. ,Tremblay J. Matematica Discreta y Logica; Prentice Hall 1996. 7 [GRIMALDI 1994] Grimaldi Ralph Matematicas Discreta y Combinatoria; Addison-Wesley 1994 8 [GUTIERREZ 1993] Gutierrez Xavier Franch Estructuras de datos, Especificacion, diseo e implementacion; Edicin UPC Barcelona Espaa 19934

9 [JAIME 2002] Jaime, Alberto. Estructuras de datos y Algoritmos; Prentice Hall 2002 Bogota D.C. 10 [JOHNSONBAUGH 1999] Johnsonbaugh Richard Mateamticas Discretas; Prentice Hall 1999, Pags. 11 [LIPSCHUTZ 1987] Lipschutz Seymour Hill,1987 Estructura de datos, Mc Graw-

12

[CARMONA 1999] Carmona, Poyato Angel y Otros Estructuta de Datos, Caja Sur Universidad de Cordova Espaa 1999

13 [SEDGEWICK 1993] Stroustrup Bjarne El C++ Lenguaje de programacion; Addison-Wesley 1993 , Wilmington-Delaware EUA. 14 [TENEMBNAUM 1993] Tenembaum,A.Langsam Y.Augenstein M. Estructuras de datos en C, Prentice Hall 1993. 15 [WEISS 2000] Weiss, Mark Allen. Estructuras de datos en JAVA; AddisonWesley, 2000.

Augusto Cortez Vsquez

Pg. 20/20

Você também pode gostar