Está en la página 1de 8

UNIVERSIDAD NACIONAL DE INGENIERÍA

RECINTO UNIVERSITARIO “SIMÓN BOLIVAR”

CARRERA INGENIERÍA EN COMPUTACIÓN


“Algoritmo de la Panadería de Lamport”
Clásicos Problemas de Sincronización de Procesos

AUTORES:

• Zeledón Mercado Eduardo Domingo 2021-0083U


• Hernández Córdoba Jair Eliel 2021-0075U
• Velásquez Ramos Sergio Gabriel 2021-0149U

DOCENTE:

• Ing. Danny Chávez.

MANAGUA, AGOSTO 2023


En cada procesador, se produce, constantemente, un intercalado de
instrucciones de procesos, de modo que se tiene la sensación de paralelismo
(concurrencia). Los procesos, son una abstracción de un programa en ejecución
y que proporcionan la capacidad de operar forma concurrente.

Al poner en marcha o ejecutar procesos concurrentemente (ejecución


simultánea de más de un proceso), se presentan problemas que tienen que ver,
directamente con la exclusión mutua. Esto significa que varios procesos
pretenden, acceder a ciertos recursos compartidos al mismo tiempo.

La sección crítica, es un concepto, estrechamente relacionado con los procesos,


pues, es la parte del programa que accede a un recurso compartido y, sólo un
programa puede acceder a su sección crítica en un momento dado.

En este breve escrito, abordaremos el algoritmo conocido “La panadería de


Lamport”, uno de los clásicos problemas clásicos de comunicación que existen
entre procesos, poniendo como una de las vías de solución a los problemas de
concurrencia, a este algoritmo antes mencionado.

Algoritmo de la Panadería de Lamport

El sistema de sincronización que tiene como nombre, La Panadería de


Lamport, aborda el problema de la sección crítica en sistemas informáticos
paralelos. Cuando más de un proceso necesita utilizar un recurso compartido a
la vez, pero solo un proceso puede hacerlo, y así, se tiene el problema en la
sección crítica. Para evitar conflictos y garantizar la exactitud del sistema, el reto
es asegurar de que cada proceso utilice el recurso de una manera que sea
mutuamente excluyente.

El creador de este algoritmo fue Leslie Lamport (nacido en 1941), fue un


computó logo estadounidense, licenciado en matemáticas en el MIT.

Lamport es reconocido por su trabajo en algorítmica distribuida y en lógica


temporal. Introdujo el algoritmo de la panadería de Lamport para exclusión
mutua de múltiples hilos en un computador que requieren los mismos recursos
de manera simultánea.

El problema:
Una panadería tiene una variedad de panes y pasteles vendidos por n vendedores.
Cada cliente toma un número al entrar y espera hasta oír su número. Cuando el
vendedor se desocupa, llama al siguiente número
▪ El algoritmo, toma su nombre de la costumbre de las panaderías, donde
las personas obtiene un número de turno (único) y lo utilizan para que el
vendedor les vaya atendiendo en orden de llegada.
▪ El cliente obtiene su número de turno. El vendedor sólo puede atender a
una persona al mismo tiempo, lo que concuerda con el uso de forma
exclusiva: el recurso es el vendedor y la sección crítica de un cliente es lo
que realiza mientras es atendido.
▪ El sistema mantiene un número que refleja el número 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 número
pasa a ser atendido.
▪ Cuando termina, el cliente se desprende de su boleto y se dedica a
realizar cualquier otra actividad libremente, ya que no se encuentra más
en su sección crítica. Si más tarde quiere volver a comprar, tendrá que
obtener un nuevo número.

Algoritmo de solución:

El algoritmo para solucionar este problema sería que cada cliente sea un hilo,
identificándose con un número único i. Los hilos se deben coordinar para
decidir en cada momento qué hilo tiene derecho a ejecutar su código de
sección crítica.

En el algoritmo de Lamport se permite que varios hilos obtengan el mismo


número. En este caso, se aplica un algoritmo de desempate, que garantiza que
sólo un hilo entra en sección crítica.

El desempate se realiza así: Si dos o más hilos tienen el mismo número de turno,
tiene más prioridad el hilo que tenga el identificador con un número más bajo.
Como no puede haber dos hilos con el mismo identificador.

Cuando un hilo quiere entrar en su sección crítica, primero obtiene su número


de turno, que calcula como el máximo de los turnos de los otros hilos, más uno.
(Si varios hilos realizan el cálculo al mismo tiempo, puede ocurrir que dos o más
hilos obtengan el mismo turno). Antes de entrar en sección crítica, el hilo debe
asegurarse de que tiene el número de turno más bajo. En caso de empate,
decidirá el identificador de hilo más bajo.
Pseudocódigo para el algoritmo de La panadería de Lamport:

• Inicialice una matriz, llamada elección, de tamaño N, donde N


es el número total de procesos, a todos los ceros.
• Inicialice una matriz, denominada número, de tamaño N, a todos
los ceros.
• Cada proceso i ejecuta el siguiente código cuando quiere
entrar en la sección crítica.
▪ Establecer elección[i] = 1
▪ Establecer número[i] = max(número [0], número [1],
…, número[N-1]) +1
▪ Establecer elección[i] = 0
▪ Para cualquier otro proceso j, repita hasta que
(número[j] == 0) o (número[i], i) < (número[j], j):
i. Esperar
▪ Ingrese a la sección crítica
• Cada proceso i ejecuta el siguiente código cuando sale de la
sección crítica
▪ Establecer número[i] = 0

Código en lenguaje C del algoritmo para La Panadería de Lamport:

#include <stdio.h>

#include <stdbool.h>

#include <pthread.h>

#define NUM_PROCESSES 5 //número de procesos (hilos) que


participarán en la simulación.

int eligiendo [NUM_PROCESSES]; // para el estado de elección de los


procesos.

int number[NUM_PROCESSES]; // números de turno de cada proceso.

/*La función lock es responsable de adquirir el bloqueo y gestionar el


acceso a la sección crítica*/

void lock(int process) {


eligiendo[process] = 1;

int max_number = 0;

int i;

for (i = 0; i < NUM_PROCESSES; ++i) {

if (number[i] > max_number) {

max_number = number[i];

number[process] = max_number + 1;

eligiendo[process] = 0;

int other;

for (other = 0; other < NUM_PROCESSES; ++other) {

while (eligiendo[other]) { /* Espera mientras el otro proceso elige


*/

while (number[other] != 0 && (number[other] < number[process]


|| (number[other] == number[process] && other < process))) {

/* Espera mientras el otro proceso con número menor o igual


tiene prioridad */

} //fin function lock.

/*La función unlock simplemente libera el número de turno del


proceso, permitiendo que otros procesos lo adquieran. */

void unlock(int process) {

number[process] = 0;

}
void *process(void *arg) {

int process_id = *(int *)arg; //está interprentando a un puntero de


tipo entero.

int i, other;

for (i = 0; i < 3; ++i) {

lock(process_id);

printf("Proceso %d está en la seccion critica.\n", process_id);

unlock(process_id);

printf("Proceso %d ha salido de la seccion critica. \n\n",


process_id);

return NULL;

} //fin function process.

int main() {

pthread_t threads[NUM_PROCESSES]; //Se crean los hilos para cada


proceso.

int process_ids[NUM_PROCESSES]; // Se les asignan ID's

int i;

//Se ejecuta la función process en cada hilo y se espera a que


todos los hilos

for (i = 0; i < NUM_PROCESSES; ++i) {

process_ids[i] = i;

pthread_create(&threads[i], NULL, process, &process_ids[i]);

}
//Espera a que todos los hilos finalicen usando pthread_join.

for (i = 0; i < NUM_PROCESSES; ++i) {

pthread_join(threads[i], NULL);

return 0;

} //fin main

Ejecución:

El algoritmo de La Panadería, además, cumple con todos los requisitos del


problema de sección crítica:

Exclusión Mutua: Cuando ningún proceso se está ejecutando en su sección


crítica, se permite que un proceso con el número de turno más bajo ingrese a su
sección crítica. Y, suponiendo que dos procesos tienen el mismo número de
turno, en este caso, el proceso con el identificador (ID) de proceso inferior entre
estos se selecciona ya que el ID de proceso de cada proceso es distinto y único,
por tanto, en un momento determinado, solo habrá un proceso en ejecución en
su sección crítica. Entonces, se cumple el requisito de exclusión mutua.

Progreso: Después se seleccionar un número de turno, un proceso de espera


verifica si algún otro proceso de espera tiene mayor prioridad para ingresar a su
sección crítica. Si no existe tal proceso, P entrará inmediatamente en su sección
crítica. Cumpliendo así con los requisitos de progreso.

Espera limitada (acotada): Mientras espera, el proceso entrará en su sección


crítica cuando ningún otro proceso esté en su sección crítica y si su número de
turno es el más pequeño entre otros procesos de espera y, además, si los
números de turno son los mismos, tiene el ID de proceso más bajo entre otros
procesos de espera.

Ventajas del Algoritmo de La Panadería de Lamport

• Están libres de inanición.


• Sigue la estructura FIFO.
• Es una de las soluciones más simples conocidas al problema de exclusión
mutua para el caso general del proceso N.
• Garantiza el uso eficiente de los recursos compartidos en un entorno
multiproceso.

Desventajas del Algoritmo de La Panadería de Lamport.

• Los números que toman los procesos pueden aumentar a lo largo de la


ejecución, con lo que puede sobre pasarse la capacidad de cualquier tipo
de datos con el que se representen estos números. De modo que, esta
solución no debe ser usada en modelos de alto grado de concurrencia

También podría gustarte