Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Docente:
YESITH TERNERA MUÑOZ
Trabajo:
Comunicación y Sincronización de Procesos
Universidad de la costa
Asignatura – Sistemas Operativos
2021-1
Introducción
1. La exclusión mutua es la actividad que realiza el sistema operativo para evitar que dos
o más procesos ingresen al mismo tiempo a un área de datos compartidos o accedan
a un mismo recurso.
En otras palabras, es la condición por la cual, de un conjunto de procesos, sólo uno puede
acceder a un recurso dado o realizar una función dada en un instante de tiempo.
En sistemas de multiprogramación con un único procesador, los procesos se intercalan en
el tiempo para dar la apariencia de ejecución simultánea.
Uno de los grandes problemas que nos podemos encontrar es que el hecho de compartir
recursos está lleno de riesgos.
Por ejemplo, si dos procesos hacen uso al mismo tiempo de una variable global y ambos
llevan a cabo tanto operaciones de lectura como de escritura sobre dicha variable, el
orden en que se ejecuten estas lecturas y escrituras es crítico, puesto que se verá
afectado el valor de la variable.
2. Semáforos
2.1 Concepto
Dijkstra dio en 1968 una solución elegante y sencilla al problema de la exclusión
mutua con la introducción del concepto de semáforo binario. Esta técnica permite
resolver la mayoría de los problemas de sincronización entre procesos y forma parte
del diseño de muchos sistemas operativos y de lenguajes de programación
concurrentes.
Un semáforo binario es un indicador de condición (S) que registra si un recurso está
disponible o no. Un semáforo binario sólo puede tomar dos valores: O y 1. Si, para un
semáforo binario. S=1 entonces el recurso está disponible y la tarea lo puede utilizar;
si S=0 el recurso no está disponible y el proceso debe esperar.
Los semáforos sólo permiten tres operaciones sobre ellos:
Espera.
Señal.
Inicializar.
1 wait (variable)
2 begin
3 while (variable)>=0 do {esperar}
4 variable=variable-1
5 end
1 signal (variable)
2 begin
3 variable=variable+1
4 end
El semáforo binario resulta adecuado cuando hay que proteger un recurso que
pueden compartir varios procesos, pero cuando lo que hay que proteger es un
conjunto de recursos similares, se puede usar una versión más general del
concepto de semáforo que lleve la cuenta del número de recursos disponibles.
3. Monitores
Un monitor es una estructura formada por una cabecera que los identifica, un conjunto
de variables globales a todos los procedimientos del monitor, un conjunto de
procedimientos y un bloque de inicialización, el cual se ejecuta una única vez, cuando
se crea el monitor.
1{ nombre
2{ variables globales accesibles desde todos los procedimientos
3{ procedimiento A
4{ procedimiento B
5{
6
7{ inicialización (solo se ejecuta una vez)
4. Algoritmo de Decker
Solución que garantiza la exclusión mutua al gestionar elegantemente este proceso.
Utiliza, además de las banderas de intención de entrar, una variable turno (proceso
favorecido) que resuelve en caso de conflicto.
Da la posibilidad de que el otro proceso entre en su sección crítica una segunda vez si
lo hace antes que el proceso que acaba de dejar el bucle de espera, asigne el valor
cierto a su intención de entrar. Pero cuando de nuevo tiene el procesador, realiza la
asignación y es su turno, así que se ejecuta.
2- Segundo intento:
Cada proceso debe tener su propia llave de la sección crítica para que, si uno de ellos
falla, pueda seguir accediendo a su sección crítica; para esto se define un vector
booleano señal. Cada proceso puede evaluar el valor de señal del otro, pero no
modificarlo. Cuando un proceso desea entrar en su sección crítica, comprueba la
variable señal del otro hasta que tiene el valor falso (indica que el otro proceso no está
en su sección crítica). Asigna a su propia señal el valor cierto y entra en su sección
crítica. Cuando deja su sección crítica asigna falso a su señal.
Si uno de los procesos falla fuera de la sección crítica, incluso el código para dar valor
a las variables señal, el otro proceso no se queda bloqueado. El otro proceso puede
entrar en su sección crítica tantas veces como quiera, porque la variable señal del otro
proceso está siempre en falso. Pero si un proceso falla en su sección crítica o
después de haber asignado cierto a su señal, el otro proceso estará bloqueado
permanentemente.
3- Tercer intento
El segundo intento falla porque un proceso puede cambiar su estado después de que
el otro proceso lo ha comprobado, pero antes de que pueda entrar en su sección
crítica.
Si un proceso falla dentro de su sección crítica, incluso el código que da valor a la
variable señal que controla el acceso a la sección crítica, el otro proceso se bloquea y
si un proceso falla fuera de su sección crítica, el otro proceso no se bloquea.
Si ambos procesos ponen sus variables señal a cierto antes de que ambos hayan
ejecutado una sentencia, cada uno pensará que el otro ha entrado en su sección
crítica, generando así un interbloqueo.
4- Cuarto intento
En el tercer intento, un proceso fijaba su estado sin conocer el estado del otro. Se
puede arreglar esto haciendo que los procesos activen su señal para indicar que
desean entrar en la sección crítica, pero deben estar listos para desactivar la variable
señal y ceder la preferencia al otro proceso.
Existe una situación llamada bloqueo vital, esto no es un interbloqueo, porque
cualquier cambio en la velocidad relativa de los procesos rompería este ciclo y
permitiría a uno entrar en la sección crítica. Recordando que el interbloqueo se
produce cuando un conjunto de procesos desea entrar en sus secciones críticas, pero
ninguno lo consigue. Con el bloqueo vital hay posibles secuencias de ejecución con
éxito.
5. Algoritmo de Peterson
Considérese el proceso P0. Una vez que ha puesto señal[0] a cierto, P1 no puede
entrar en su sección crítica. Si P1 esta aun en su sección crítica, entonces señal[1]
= cierto y P0 está bloqueado en su bucle while. Esto significa que señal[1] es cierto
y turno = 1. P0 puede entrar en su sección crítica cuando señal[1] se ponga a falso
o cuando turno se ponga a 0. Considérense ahora los siguientes casos
exhaustivos:
Recurso 1
Proceso 1 Proceso 2
Recurso 2
Como se ve, aquí el sistema está bloqueado: Proceso 1 tiene a Recurso 1 y necesita a
Recurso 2 para continuar. Y Proceso 2 tiene asignado a Recurso 2, y necesita a Recurso
1 para continuar. Cada proceso espera que el otro libere un recurso que no liberará hasta
que el otro libere su recurso, lo cual no sucederá si el primero no libera su recurso. Aquí
se presenta una espera circular.
Proceso A
CPU
Proceso C
Proceso B
Otro ejemplo, dos procesos adueñados de CPU. Proceso A se ejecuta y llama a Proceso
B, Proceso B se ejecuta y llama a Proceso A,..., si llega otro proceso, no lo van a dejar
entrar a CPU a ejecutarse.
Conclusión
El acceso concurrente a los datos compartidos provoca inconsistencias, salvo que dispongamos de
un mecanismo para asegurar la ejecución ordenada de los procesos cooperantes. esto es, que sólo
permita los intercalados correctos.