You are on page 1of 24

Algoritmo de la

Panadera de
Lamport
Sistemas
Operativos

Introduccin
En el procesador se producir un intercalado de las instrucciones de
procesos, de tal forma que tendremos la sensacin de que hay un
paralelismo (concurrencia, ejecucin simultnea de ms de un
proceso).
Al ejecutar procesos concurrentemente, aparece el problema de la
exclusin mutua. Esto significa que varios de los procesos pueden
pretender acceder a cierto recurso compartido a la misma vez.
Se tratar en qu consiste el algoritmo de la panadera Lamport y
planteamiento de una solucin a este algoritmo.

Objetivos

Conocer el algoritmo de la Panadera de Lamport.


Entender y aplicar la programacin concurrente.
Realizar una implementacin del algoritmo de lamport.

Algoritmo de la
Panadera de Lamport
(1)
Toma su nombre de la costumbre
de las panaderas, donde las
personas obtienen un nmero de
turno (nico) y lo utilizan para que
el dependiente les vaya atendiendo
en orden de llegada.

Algoritmo de la
Panadera de Lamport
(2)
El cliente obtiene su nmero de
turno. El dependiente slo puede
atender a una persona al mismo
tiempo, lo que concuerda con el uso
de forma exclusiva: el recurso es el
dependiente y la seccin crtica de
un cliente es lo que realiza mientras
es atendido.

Algoritmo de la
Panadera de Lamport
(3)
El sistema mantiene un nmero que
refleja el nmero del cliente que se
est atendiendo. Los clientes deben
esperar. Una vez que se acaba con
un cliente, la variable global se
incrementa y el cliente que tenga
ese nmero pasa a ser atendido.

Algoritmo de la
Panadera de Lamport
(4)
Cuando termina, el cliente se
desprende de su boleto y se dedica
a realizar cualquier otra actividad
libremente, ya que no se encuentra
ms en su seccin crtica. Si ms
tarde quiere volver a comprar,
tendr que obtener un nuevo
nmero.

Algoritmo (1)
El algoritmo para solucionar este
problema sera que cada cliente sea
un hilo, identificndose 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.

Algoritmo (2)
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.

Algoritmo (3)
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.

Seccin Crtica(1)
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).

Seccin Crtica(2)
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.

Implementaci
n:
Algoritmo de la Panadera de
Lamport
(Java)

import java.util.ArrayList;
public class Hilo extends Thread {
static volatile int NUMEROTURNO = 0;
public static int turnoMax = 0 ;
public int turno = 0;
public boolean atendiendo = false;
public boolean eligiendoTurno = false;
public int posicion = 0;
public static volatile ArrayList<Hilo> arr = new ArrayList<>();

public Hilo(String str) {


super(str);
}

public void run(){


try {
sleep((int) (Math.random() * 20));
eligiendoTurno = true;
turno = NUMEROTURNO + 1;
NUMEROTURNO++;
System.out.println(getName()+" con ticket " + turno + ".");
eligiendoTurno = false;
} catch (InterruptedException e1) {...}

for (int i = 0; i < arr.size(); i++) {


while(arr.get(i).eligiendoTurno) {}
if(arr.get(i).turno == this.turno) {
while((arr.get(i).getId() > Thread.currentThread().getId()))
try {
sleep(2);
} catch (InterruptedException e) {..}
}else
while(arr.get(i).turno != 0) {}
}

try {
this. atendiendo = true;
sleep(1);
System.out.println(getName() + " YA FUE ATENDIDO ...!");
sleep((int) (Math.random() * 20));
this.atendiendo = false;
this.turno = 0;
} catch (InterruptedException e) {...}
}

public static void main(String[] args) throws InterruptedException {


ArrayList<Hilo> P_lamport = new ArrayList<Hilo>();
for (int i = 0; i < 10; i++) {
Hilo h1 = new Hilo("Usuario "+(i+1));
P_lamport.add(h1);
P_lamport.get(i).start();
}
}

Testing
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario

2 YA FUE ATENDIDO ...!


10 con ticket 2.
10 YA FUE ATENDIDO ...!
7 con ticket 3.
5 con ticket 3.
5 YA FUE ATENDIDO ...!
4 con ticket 4.
7 YA FUE ATENDIDO ...!
4 YA FUE ATENDIDO ...!
8 con ticket 5.
8 YA FUE ATENDIDO ...!
9 con ticket 6.

Usuario
Usuario
Usuario
Usuario
Usuario
Usuario
Usuario

9
6
3
1
3
6
1

YA FUE ATENDIDO
con ticket 8.
con ticket 7.
con ticket 9.
YA FUE ATENDIDO
YA FUE ATENDIDO
YA FUE ATENDIDO

...!

...!
...!
...!

Conclusiones
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.

Conclusiones
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.

Bibliografa
1. Anielka Campos, Juan Castelln, Martha Navas; Concurrencia: Algoritmo
de la Panadera de Lamport.
2. Natalia Partera Jaime; Programacin Concurrente y de Tiempo Real
Guin de prcticas 6: Programacin en Java de algoritmos de control de
la Exclusin Mutua con variables comunes
3. Dr. Arno Formella; Concurrencia y Distribucin; Universidad de Vigo,
2006.

Thanks!
Carlos Chullo, Juan Deyby
Deza Veliz, David
Soncco Chuctaya, Fredy
Tellez Mendoza, Elvis
Vicente Gallegos, Julio Cesar

You might also like