Exclusión Mutua.
Consiste
en garantizar que durante la ejecución de una región crítica los
recursos compartidos solo se asignen a uno y solo a uno de los procesos.
Si
un recurso compartido es una variable, la exclusión mutua asegura que a
lo más un proceso a la vez ha accedido a ella durante la actualización
crítica que conduce a valores temporalmente inestables. Consecuentemente
los otros procesos ven solamente valores estables de las variables
compartidas. Con los dispositivos compartidos la necesidad para la
exclusión mutua puede ser incluso más obvia cuando uno considera el
problema que puede provocar sus usos.
Por ejemplo, supongamos que en el sistema existe un archivo formado por registros compuestos por 5 campos.
Registro de 5 campos.
Para que un
registro sea valido debe estar totalmente actualizado, es decir, si se
modifica el valor del campo A, el resto de los campos deben ser
coherentes con el nuevo valor de dicho campo, ya que de otro modo el
registro sería inconsistente.
Si
en el momento en que un proceso escribe o modifica un registro y existe
otro proceso que realiza la lectura de ese mismo registro, y el primero
de ellos sólo hubiese tenido tiempo de modificar el campo A, la
información obtenida por el segundo proceso seria inconsistente. Para
evitar esto se deben sincronizar los procesos de manera que mientras uno
escribe, otro pueda leer.
Esto no ocurre en aquellos casos en que dos procesos tratan de leer en el mismo archivo, aún coincidiendo en el mismo registro.
Generalizando.
Supongamos que los dos procesos que coinciden en el mismo registró, uno
esta escribiendo y el otro leyendo, llamados ESCRIBIR y LEER, se encuentran en un sistema monoprocesador multiprogramado y son los únicos presentes en ese momento.
Concurrencia
En el momento de un cambio de proceso del uno al otro se pueden producir las siguientes situaciones:
. Sin sincronización entre procesos.
Puede darse el caso de que ESCRIBIR esté actualizando un registro y se
quede a medías, sorprendiéndole el cambio de proceso, por tanto,
terminará de escribirlo cuando vuelva a hacer uso del procesador. Con el
cambio le tocará el turno al proceso LEER, que accederá a dicho
registro pudiendo leerlo completamente. Es evidente que los datos leídos
serán inconsistentes.
. Con sincronización entre procesos. Supongamos
algún mecanismo que prohíba la lectura (bloqueo de registros) a
cualquier proceso, mientras el proceso ESCRIBIR esté realizando alguna
operación. En este caso, LEER, al hacer uso del procesador que se
encuentra bloqueado, quedaría en espera de que el registro quede
totalmente escrito y se proceda a su desbloqueo, LEER pasaría a estado
bloqueado, ESCRIBIR terminaría su trabajo sobre el registro y en el
siguiente cambio LEER procedería a hacer el suyo.
Esta
sincronización por la cual una actividad impide que otras puedan tener
acceso a un dato mientras se encuentra realizando una operación sobre el
mismo es lo que se conoce como exclusión mutua.
La
zona de código de un proceso que no puede ser interrumpida por otro,
por los motivos expuestos anteriormente se le llama Región Crítica.
Regiones críticas.
Es el conjunto de actividades
elementales cuya ejecución exige el monopolio de recursos. Por ejemplo,
para indicar que alguna acción se realizará con acceso exclusivo a
ciertos datos compartidos.
Región datos - compartidos do acción
¿Como evitar la región critica?.
La clave para prevenir el problema aquí y en muchas otras situaciones
en que interviene la memoria compartida, archivos compartidos y todo lo
que se comparte, consiste en determinar alguna manera de prohibir que un
proceso lea y escriba los datos compartidos al mismo tiempo.
De otra manera lo
que se necesita es la sincronización. Una manera de asegurar de que si
un proceso ésta utilizando una variable o archivo compartido, es que los
otros procesos no pueden hacer lo mismo.
Para tener una solución adecuada a la región crítica se necesita que se cumplan cuatro condiciones:
1. Nunca dos procesos pueden encontrarse simultáneamente dentro de sus regiones críticas.
2. No se hacen suposiciones acerca de las velocidades relativas de los procesos o del
Número de CPU.
3. Ningún proceso suspendido fuera de la región crítica debe bloquear a otros procesos.
4. Nunca un proceso debe querer entrar en forma arbitraria en su región crítica.
Representación de regiones criticas
Cuando se diseña un proceso que debe contener una o varias regiones críticas se deben de tomar en cuenta las siguientes consideraciones:
. La región crítica debe ser ejecutada lo más rápido posible.
. Un programa no debe ínter bloquearse en una región crítica.
. Las regiones críticas deben ser programadas con mucho cuidado (no se permiten
Ciclos indefinidos).
. Mientras un proceso está en su región crítica otros procesos pueden continuar
Ejecutándose fuera de las regiones críticas.
. Cuando se tienen procesos que comparten datos, si un proceso deja la región
Crítica otro de los procesos que espera a entrar en su región crítica puede proceder.
Cuando
el proceso termina, voluntaria o involuntariamente, el sistema
operativo debe de realizar la limpieza propia de fin de proceso y
liberar la exclusión mutua de otros procesos.
Los procesos pueden tener en su código secciones en que realizan cálculos internos y operaciones que no dan lugar a condiciones de competencia. Sin embargo existen secciones de programa en que el proceso está accediendo a recursos compartidos que pueden dar pié a condiciones de competencia.
La parte del programa en que se accede a un recurso compartido se denomina sección o región crítica (requisito necesario, pero no suficiente). Los requisitos para que procesos paralelos cooperen de manera correcta usando datos compartidos son los siguientes:
- Dos procesos nunca pueden estar simultáneamente dentro de sus regiones críticas.
- No se puede suponer nada acerca de las velocidades de ejecución de los procesos o el número de las CPU.
- Ningún proceso que se ejecute fuera de su región crítica puede bloquear a otros procesos.
- Ningún proceso deberá tener una espera indefinida para entrar en su región crítica.
Mientras un proceso se encuentra en su sección crítica, otros procesos pueden, claro está, seguir ejecutándose fuera de sus secciones críticas. Cuando un proceso abandona su región crítica, otro proceso que espera entrar en su propia sección crítica (si existe algún proceso en espera). Lograr que se cumpla la exclusión mutua es uno de los problemas fundamentales de la programación concurrente. Se han propuesto muchas soluciones, algunas de software y otras de hardware, algunas sencillas y otras complejas, y algunas que requieren la cooperación voluntaria de los procesos y otras que exigen un escrito ajuste a rígidos protocolos.
Encontrarse dentro de una región crítica es un estado especial concedido a un proceso. El proceso tiene acceso exclusivo a los datos compartidos y los demás procesos que requieran acceso a los datos en ese momento deben esperar. Así pues, las secciones críticas deben ejecutarse tan rápido como sea posible; un proceso no se debe bloquear dentro de su propia sección crítica y las secciones críticas deben codificarse con mucho cuidado (para evitar, por ejemplo, la posibilidad de ciclos infinitos).
Si un proceso de una sección crítica termina, ya sea voluntaria o involuntariamente, el sistema operativo, al realizar su mantenimiento de terminaciones, debe liberar la exclusión mutua de manera que otros procesos puedan entrar en sus regiones críticas.
El problema de la Sección Crítica
- n procesos compitiendo para utilizar algún dato compartido.
- Cada proceso tiene un segmento de código, llamado sección crítica, en el que se accede al dato compartido.
- Problema – asegurarse de que cuando un proceso esta ejecutándose en su sección crítica, a ningún otro proceso se le permite ejecutar la suya.
- Estructura del proceso Pi
entry section
sección crítica
exit section
sección restante
until false;
Solución al problema de la Sección Crítica
- Una solución al problema de la sección crítica debe satisfacer los siguientes tres requerimientos:
- Exclusión Mútua. Si un proceso Pi esta ejecutandose en su sección crítica, entonces ninguno de los otros procesos puede estar en su sección crítica
- Progreso. Si ningún proceso esta ejecutándose en su sección crítica y existen procesos que quieren entrar en su sección crítica, entonces la selección del próximo proceso que entrará a la sección crítica no puede ser pospuesta indefinidamente.
- Espera limitada. Debe existir un límite del número de veces que se les permite a otros procesos entrar en sus secciones críticas en el intervalo entre que un proceso ha hecho un requerimiento para entrar en su sección crítica y que se le concede el permiso.
- Se supone que cada proceso se ejecuta a velocidad distinta de cero.
- Ninguna suposición respecto a la velocidad relativa de los n procesos.
- Inhibir las interrupciones.
- Solo dos procesos, P0 and P1
- Estructura general del proceso Pi
entry section
sección crítica
exit section
sección restante
until false;
- Los procesos pueden compartir algunas variables comunes para sincronizar sus acciones.
Algoritmo 1
Variables compartidas:– var turn: (0..1);
inicialmente turn = 0
– turn = i ? Pi puede entrar en su sección crítica
Proceso Pi
repeat
while turn ? i do no-op;
sección crítica
turn := j;
sección restante
until false;
Satisface la condición de exclusión mútua, pero no la de progreso (si turn=0 y P1 esta listo para entrar en su sección crítica, P1 no puede hacerlo, incluso aunque P0 este en la sección restante)
Algoritmo 2
Variables compartidas
– var flag: array [0..1] of boolean;
inicialmente flag [0] = flag [1] = false.
– flag [i] = true ? Pi listo para entrar en su sección crítica
Proceso Pi
repeat
flag[i] := true;
while flag[j] do no-op;
sección crítica
flag [i] := false;
sección restante
until false;
Satisface la
exclusión mútua, pero no el requerimiento de progreso. (P0 pone flag[0 ]
=true y P1 pone flag[1 ] =true; cada uno esperando al otro
indefinidamente)
Algoritmo 3- Combinación de las variables compartidas de los algoritmos 1 y 2.
- Proceso Pi
repeat
flag [i] := true;
turn := j;
while (flag [j] and turn = j) do no-op;
sección crítica
flag [i] := false;
sección restante
until false;
flag [i] := true;
turn := j;
while (flag [j] and turn = j) do no-op;
sección crítica
flag [i] := false;
sección restante
until false;
- Cumple los tres requerimientos; resuelve el problema de la sección crítica para dos procesos.
Algoritmo del panadero
- Antes de entrar a su sección crítica, los procesos reciben unnúmero. El que posea el número menor entra en la sección crítica.
- Si los procesos Pi y Pj reciben el mismo número, si i < j, entonces Pi es servido primero; si no lo es Pj .
- El esquema de numeración siempre genera números en orden creciente; por ejemplo 1,2,3,3,3,3,4,5...
No hay comentarios:
Publicar un comentario