Sei sulla pagina 1di 4

IEPGM

PROGRAMACION CONCURRENTE

ALGORITMO DE PETERSON
El algoritmo de Peterson, tambin conocido como solucin de Peterson, es un algoritmo de programacin concurrente para exclusin mutua, que permite a dos o ms procesos o hilos de ejecucin compartir un recurso sin conflictos, utilizando slo memoria compartida para la comunicacin. Peterson desarroll el primer algoritmo (1981) para dos procesos que fue una simplificacin del algoritmo de Dekker para dos procesos. Posteriormente este algoritmo fue generalizado para N procesos. bandera[0] = false bandera[1] = false turno = 0 p0: bandera[0] = true p1: bandera[1] = true turno = 1 turno = 0 while( bandera[1] && turno == 1 ); while( bandera[0] && turno == 0 ); //no hace nada; espera. //no hace nada; espera. // seccin crtica // seccin crtica // fin de la seccin crtica bandera[0] = false // fin de la seccin crtica bandera[1] = false

Los procesos p0 y p1 no pueden estar en la seccin crtica al mismo tiempo: si p0 est en la seccin crtica, entonces bandera[0] = 1, y ocurre que bandera[1] = 0, con lo que p1 ha terminado la seccin crtica, o que la variable compartida turno = 0, con lo que p1 est esperando para entrar a la seccin crtica. En ambos casos, p1 no puede estar en la seccin crtica.

ALGORITMO DE DEKKER
El algoritmo de Dekker es un algoritmo de programacin concurrente para exclusin mutua, que permite a dos procesos o hilos de ejecucin compartir un recurso sin conflictos. Fue uno de los primeros algoritmos de exclusin mutua inventados, implementado por Edsger Dijkstra. Si ambos procesos intentan acceder a la seccin crtica simultneamente, el algoritmo elige un proceso segn una variable de turno. Si el otro proceso est ejecutando en su seccin crtica, deber esperar su finalizacin. Existen cinco versiones del algoritmo Dekker, teniendo ciertos fallos los primeros cuatro. La versin 5 es la que trabaja ms eficientemente, siendo una combinacin de la 1 y la 4.

IEPGM

PROGRAMACION CONCURRENTE

Versin 1: Alternancia estricta. Garantiza la exclusin mutua, pero su desventaja es que acopla los procesos fuertemente, esto significa que los procesos lentos atrasan a los procesos rpidos. Versin 2: Problema interbloqueo. No existe la alternancia, aunque ambos procesos caen a un mismo estado y nunca salen de ah. Versin 3: Colisin regin crtica no garantiza la exclusin mutua. Este algoritmo no evita que dos procesos puedan acceder al mismo tiempo a la regin crtica. Versin 4: Postergacin indefinida. Aunque los procesos no estn en interbloqueo, un proceso o varios se quedan esperando a que suceda un evento que tal vez nunca suceda.

shared int cierto = 1; ''/* Definicin de variables compartidas */ '' shared int bandera[2] = {0,0}; shared int turno = 0; while (cierto) { bandera[proc_id] = cierto; // Est listo para acceder a la Seccin Crtica while (bandera[1-proc_id] == cierto) { // Mientras el otro est procesando if (turno == 1-proc_id) { // si es su turno bandera[proc_id] = 0; // indicar que no est listo y while (turno == (1-proc_id)) {} // esperar activamente. bandera[proc_id] = 1; // Cuando termin de esperar, est listo } } /* ''Seccin crtica'' */ turno = 1-proc_id; // Indicar el turno del otro proceso bandera[proc_id] = 0; // Indicar que ya no est listo (para acceder a la Seccin Crtica) /* ''Seccin no crtica'' */ }

ALGORITMO DE LA PANADERA DE LAMPORT


El algoritmo de la panadera de Lamport es un algoritmo de computacin creado por el cientfico en computacin Dr Leslie Lamport, para implementar la exclusin mutua de N procesos o hilos de ejecucin. El algoritmo de la panadera toma su nombre de la costumbre de las panaderas y tiendas en general, donde las personas al entrar al local obtienen un nmero de turno (nico) y lo utilizan para que el dependiente les vaya atendiendo en orden de llegada. El cliente obtiene su nmero de turno usando una cinta de papel que ofrece boletos con nmeros consecutivos.

IEPGM

PROGRAMACION CONCURRENTE

El dependiente slo puede atender a una persona al mismo tiempo, lo que concuerda con el uso de un recurso de forma exclusiva: el recurso es el dependiente y la seccin crtica de un cliente es lo que realiza mientras es atendido. El sistema mantiene un nmero (variable global) que refleja el nmero de turno del cliente que se est atendiendo en el instante actual. Los clientes deben esperar en una cola hasta que llega su turno. Una vez que se acaba con un cliente, la variable global se incrementa en uno y el cliente que tenga un boleto con ese nmero pasa a ser atendido. Cuando termina una compra, el cliente se desprende de su boleto y se dedica a realizar cualquier otra actividad libremente (guardar el dinero en la billetera, retirarse, etc.), ya que no se encuentra ms en su seccin crtica. Si ms tarde quiere volver a comprar, tendr que obtener un nuevo nmero. En el modelo algortmico que se propone, cada cliente es un hilo, identificado con un nmero nico i. Los hilos se deben coordinar para decidir en cada momento qu hilo tiene derecho a ejecutar su cdigo de seccin crtica. En la vida real, el sistema de los boletos funciona perfectamente, pero en un sistema informtico la obtencin del boleto es problemtica: varios hilos pueden obtener el mismo nmero de turno. En el algoritmo de Lamport se permite que varios hilos obtengan el mismo nmero. En este caso, se aplica un algoritmo de desempate, que garantiza que slo un hilo entra en seccin crtica. El desempate se realiza as: si dos o ms hilos tienen el mismo nmero de turno, tiene ms prioridad el hilo que tenga el identificador con un nmero ms bajo. Como no puede haber dos hilos con el mismo identificador, nunca se da el caso de que dos hilos evalen al mismo tiempo que tienen derecho a ejecutar su seccin crtica.

Entrada en seccin crtica


Cuando un hilo quiere entrar en su seccin crtica, primero obtiene su nmero de turno, que calcula como el mximo de los turnos de los otros hilos, ms uno. (Si varios hilos realizan el clculo al mismo tiempo, puede ocurrir que dos o ms hilos obtengan el mismo turno). Antes de entrar en seccin crtica, el hilo debe asegurarse de que tiene el nmero de turno ms bajo. En caso de empate, decidir el identificador de hilo ms bajo. Cuando el hilo abandona la seccin crtica, pone su nmero de turno a un valor especial que indique su no intencin de entrar en seccin crtica (en este algoritmo, se usa el valor cero).

Pseudocdigo
N es el nmero de hilos que hay en el sistema. Para conocer los nmeros de turno se utiliza un vector de enteros. nmero[i] es el turno correspondiente al hilo i. Si nmero[i] = 0 significa que el hilo i no est interesado en entrar en seccin crtica.

IEPGM

PROGRAMACION CONCURRENTE

/* Variables globales */ Nmero: vector [1..N] de enteros = {todos a 0}; Eligiendo: vector [1..N] de booleanos = {todos a falso}; /* Cdigo del hilo i */ Hilo(i) { loop { /* Calcula el nmero de turno */ Eligiendo[i] = cierto; Nmero[i] = 1 + max(Nmero[1],..., Nmero[N]); Eligiendo[i] = falso; /* Compara con todos los hilos */ for j in 1..N { /* Si el hilo j est calculando su nmero, espera a que termine */ while ( Eligiendo[j] ) { /* nada */ } /* Si el hilo j tiene ms prioridad, espera a que ponga su nmero a cero */ /* j tiene ms prioridad si su nmero de turno es ms bajo que el de i, */ /* o bien si es el mismo nmero y adems j es menor que i */ while ( (Nmero[j] != 0) && ((Nmero[j], j) < (Nmero[i], i)) ) { /* nada */ } } /* Seccin crtica */ ... /* Fin de seccin crtica */ Nmero[i] = 0; /* Cdigo restante */ } }

Potrebbero piacerti anche