UNIVERSIDAD NACIONAL DE INGENIERÍA FACULTAD DE INGENIRÍA INDUSTRIAL Y DE SISTEMAS
ALGORITMO DE PETERSON SISTEMAS OPERATIVOS
Alumno: Anicama Matos, Linda Elizabeth Código: 20112573G
2014
ALGORITMO DE PETERSON ¿QUÉ ES EL ALGORITMO DE PETERSON? 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.
¿PARA QUÉ SIRVE? Se utiliza para realizar el control de concurrencia y aplicar el principio de exclusión mutua. Consiste en principalmente programar los sistemas operativos, para que dos procedimientos que compiten por el uso de recursos compartidos, puedan controlar la ejecución de su sección crítica asegurando que el recurso compartido se va a mantener en un estado consistente, esto se refiere a que una variable no pueda ser modificada por dos procesos a la vez y generar un valor inconsistente. Sino que cuando se esté ejecutando un proceso que escribe sobre los datos, ese valor se aísle y pueda mantenerse exclusivo para un determinado proceso que en ese momento está modificando.
¿CÓMO LOGRA SU OBJETIVO? En este Algoritmo, los variables que se utilizan son señal [0], señal [1] y turno. Inicialmente, señal [0]= señal [1]= False. Esto significa que ninguno de los dos procesos desea entrar en la sección crítica. El valor de Turno se asigna a cada proceso cuando desea entrar (0 si el Proceso0 desea entrar, 1 si el Proceso1 quiere entrar). Para entrar en nuestra sección crítica, tenemos en primer lugar que fijar nuestro señal [i] (i=0,1) en True, y anunciar que es el turno del otro proceso, si desea entrar (Turno=j, donde j=0,1). Si ambos procesos tratan de entra al mismo tiempo, Turno será fijado tanto para i como para j aproximadamente al mismo tiempo. Solamente una de estas asignaciones permanecerá; la otra tendrá lugar, pero será sobrescrita inmediatamente. El valor final de Turno decide a cuál de los dos procesos se permite entrar en su sección crítica primero.
ANÁLISIS PASO A PASO DEL ALGORITMO Se tiene: Dos procesos, el Proceso 0 y el Proceso 1. Variables globales:
Cada uno está ejecutando un conjunto de instrucciones, pro en algún momento necesitará entrar a su sección crítica donde utiliza un recurso que ambos utilizan. El Proceso 0 cuando va a entrar a ejecutar su sección crítica tiene que asegurarse de que la variable compartida no está siendo utilizada por el Proceso 1.
1. En primer lugar el Proceso 0 indica que necesita utilizar el recurso compartido y pone su señal en “true”. Senal0=true 2. Pero cede el turno al Proceso 1 por si lo necesita. Turno=1 3. Si la señal del Proceso 1 está encendida, es decir está en “true” y además está en su turno, el Proceso 0 no hace nada, porque entiende
que el Proceso 1 está en su sección crítica y está utilizando el recurso compartido. while(senal1 && turno == 1){ // nada } 4. Si no se cumplen ambas condiciones y dado que el Proceso 0 pidió turno y el Proceso 1 no tiene su señal encendida. Eso significa que el Proceso 0 sí puede entrar a ejecutarse en su sección crítica. // sección crítica 5. Una vez que terminé pone su señal en “false” dando a entender que no necesita los recursos compartidos. Y que el Proceso 1 lo puede utilizar si lo desea Senal0=false De igual manera el Proceso 1 entra también en ese ciclo y cuando necesite entrar a su sección crítica. Pone su seña l en “true” y sede el turno al Proceso 0. Y Sigue los mismos pasos anteriores.
Cada uno de los Procesos pone al principio su señal en “false”, se le da el turno a uno de ellos.
Y cuando cada uno se está ejecutando y llega a la estructura de repetición en la cual requiere acceder a su sección crítica se ejecutará el algoritmo y de esta forma se respetará el turno de cada quien.
SEGUIMIENTO DE RESULTADOS CON DATOS DE PRUEBA Ejemplo: Existen dos procesos llamados P1 y P2. -
Ambos procesos deben intercalar su ejecución, ejecutándose una vez en cada turno,
excepto cuando se encuentren en su sección crítica en cuyo caso la
acción del proceso en sección crítica deberá ejecutarse con exclusividad. -
Cada ejecución de P1 tiene como objetivo incrementar en una unidad y mostrar en pantalla el valor de la variable actualizada.
-
Cada ejecución de P2 tiene como objetivo incrementar en dos unidades y mostrar en pantalla el valor de la variable actualizada.
-
La sección crítica de P1 dura mientras el valor de la variable está entre 4 y 7. El P1 finaliza cuando la variable alcanza el valor de 16.
-
La sección crítica de P2 dura mientras el valor de la variable está en entre 6 y 12. El P2 finaliza cuando la variable alcanza el valor de 16
-
En caso de que un proceso termine antes que otro, el que aún no ha terminado debe seguirse ejecutando hasta su finalización.
Secuencia de ejecución 1 2
Procedimiento ejecutándose P1 P2
Valor P1 1 1
Valor P2 0 2
3
P1
2
2
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
P2 P1 P2 P2 P2 P2 P1 P1 P1 P1 P2 P1 P2 P1 P1
2 3 3 3 3 3 4 5 6 7 7 8 8 9 10
4 4 6 8 10 12 12 12 12 12 14 14 16 16 16
Observaciones
P1 no se ejecuta porque es turno de P2 P2 no se ejecuta, es turno de P1
Inicia sección crítica de P2
Finaliza sección crítica de P2 Inicia sección crítica de P1
Finaliza sección crítica de P1
Finaliza P2 Finaliza P1