Diferencia entre revisiones de «Algoritmo de Peterson»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Línea 13: Línea 13:
//no hace nada; espera. //no hace nada; espera.
//no hace nada; espera. //no hace nada; espera.
// sección crítica // sección crítica
// sección crítica // sección crítica
//vales mil
//vales vrga
// fin de la sección crítica // fin de la sección crítica
// fin de la sección crítica // fin de la sección crítica
bandera[0] = 0 bandera[1] = 0
bandera[0] = 0 bandera[1] = 0

Revisión del 17:20 11 may 2011

El algoritmo de Peterson, también conocido como solución de Peterson, es un algoritmo de programación concurrente para exclusión mutua, que permite a dos o más procesos o hilos de ejecución compartir un recurso sin conflictos, utilizando sólo memoria compartida para la comunicación.

Peterson desarrolló el primer algoritmo (1981) para dos procesos que fue una simplificación del algoritmo de Dekker para dos procesos. Posteriormente este algoritmo fue generalizado para N procesos.

Algoritmo para dos procesos

  bandera[0] = 0
  bandera[1] = 0
  turno      = 0 
  p0: bandera[0] = 1;                          p1: bandera[1] = 1;
      turno = 1 ;                                turno = 0;
      while( bandera[1] && turno == 1 );        while( bandera[0] && turno == 0 );
                //no hace nada; espera.                               //no hace nada; espera. 
      // sección crítica                        // sección crítica
             //vales vrga                             
      // fin de la sección crítica              // fin de la sección crítica
      bandera[0] = 0                            bandera[1] = 0

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

Algoritmo para N procesos (pseudo-codigo)

// Variables compartidas
bandera: array[0..N-1] of -1..n-2; /* inicializada a –1 */
turno: array[0..N-2] of 0..n-1; /* inicializada a 0 */

// Protocolo para Pi ( i=0,...,N-1 )
j:0..N-2; /* variable local indicando la etapa */
for j = 0 to N-2
{
   bandera[i] = j;
   turno[j] = i;
   while [( k  i : bandera[k]  j)  (turno[j] == i)] do; 
}
<sección crítica>
bandera[i] = -1;

Véase también