Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3. SINCRONIZACIÓN Y COMUNICACIÓN DE
PROCESOS
Hay dos métodos básicos de comunicación entre procesos: compartición de datos e
intercambio de información.
Para evitar este tipo de errores se pueden identificar aquellas regiones de los procesos que
acceden a variables compartidas y dotarlas de la posibilidad de ejecución como si fueran una
única instrucción.
Sección crítica: Aquellas partes de los procesos concurrentes que no pueden ejecutarse de
forma concurrente o, que desde otro proceso se deben ver como si fueran una única
instrucción.
Las secciones críticas se pueden agrupar en clases, siendo mutuamente exclusivas las
secciones críticas de cada una. Para conseguir dicha exclusión se deben implementar
protocolos software que impidan o bloqueen el acceso a una sección crítica mientras está
siendo utilizada por un proceso.
La sección crítica es la parte que debe protegerse de interferencias de otros procesos. Los
protocolos son la parte de código dedicada a asegurar que la sección crítica se ejecuta de
forma exclusiva.
Se utiliza una variable compartida de tipo booleano que se suele denominar indicador (flag).
Antes de acceder al recurso, un proceso debe examinar el indicador asociado que podrá tomar
dos valores (true o false) que indicarán, de forma respectiva, que el recurso está siendo
utilizado o que está disponible.
El que un proceso no pueda progresar porque se lo impida otro proceso o grupo de procesos
se denomina cierre (lockout o starvation).
Se introduce una variable adicional, denominada turno, que solamente resultará útil cuando se
produzca un problema de petición simultánea de acceso a la sección crítica. Si los procesos
intentan entrar a la vez el valor de turno se pondrá a 1 y 2 pero sólo un valor de ellos
permanecerá al escribirse sobre el otro.
Se utiliza también la variable turno. Sirve para establecer la prioridad relativa de los dos
procesos y su actualización se realiza en la sección crítica, lo que evita que pueda haber
interferencias entre los procesos.
Los algoritmos de Peterson y Dekker se pueden extender al caso más general en el que haya n
procesos en ejecución concurrente; pero no son soluciones adecuadas ya que la espera de
acceso a un recurso siempre se realiza de forma “ocupada” (espera activa).
3.2 Semáforos
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. 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.
Semáforo binario: Indicador de condición (S) que registra si un recurso está disponible o no.
S=1, recurso disponible. S=0, recurso ocupado.
Se implementan con una cola de tareas o de condición a la cual se añaden los procesos que
están en espera del recurso. Sólo se permiten tres operaciones sobre él:
1) Inicializa: Se debe llevar a cabo antes de que comience la ejecución concurrente de
los procesos ya que su función exclusiva es dar un valor inicial al semáforo.
2) Espera (wait): Un proceso que ejecuta la operación espera y encuentra el semáforo a
1, lo pone a 0 y prosigue su ejecución. Si el semáforo está a 0 el proceso queda en
estado de espera hasta que se libere el semáforo.
3) Señal (signal): Cuando se ejecuta esta operación puede haber varios procesos en la
lista o cola, el proceso que la dejará para pasar al estado preparado dependerá del
esquema de gestión de la cola de tareas suspendidas. Si no hay ningún proceso en
espera del semáforo este se deja libre (S:=1) para el primero que lo requiera.
Las operaciones son procedimientos que se implementan como acciones indivisibles y por ello
la comprobación y cambio de valor del indicador se efectúa de manera real como una sola
operación.
Sincronización y comunicación de procesos |3
3.2.2 Sincronización
El uso de semáforos hace que se pueda programar fácilmente la sincronización entre dos
tareas. Las operaciones de espera y señal no se utilizan dentro del mismo proceso sino en
procesos separados; el que ejecuta la operación de espera queda bloqueado hasta que el otro
proceso ejecuta la operación de señal.
El semáforo binario resulta adecuado cuando hay que proteger un recurso que pueden
compartir varios procesos, pero cuando hay que proteger 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.
El semáforo se inicializa con el número total de recursos disponibles (n) y las operaciones de
espera y señal se diseñan de modo que se impida el acceso al recurso protegido por el
semáforo cuando el valor de éste es menor o igual que cero.
3.3 Monitores
Un monitor es un conjunto de procedimientos que proporciona el acceso con exclusión mutua a
un recurso o un conjunto de recursos (datos o dispositivos) compartidos por un grupo de
procesos.
La ventaja para la exclusión mutua que presenta un monitor frente a los semáforos u otro
mecanismo es que ésta está ahora implícita, no como con los semáforos, donde el
programador debe proporcionar la correcta secuencia de operaciones espera y señal para no
bloquear al sistema.
No proporcionan por sí mismos un mecanismo para la sincronización de tareas y su
construcción debe completarse permitiendo que se puedan usar señales para sincronizar los
procesos.
Una variable que se utilice como mecanismo de sincronización en un monitor se conoce como
variable de condición. Sobre ellas sólo se puede actuar con dos procedimientos: espera y
señal.
La diferencia con el semáforo estriba en que ahora la ejecución de esta operación siempre
suspende el proceso que la emite, lo que permite que entre otro proceso.
Sincronización y comunicación de procesos |5
El monitor debe usar un sistema de prioridades en la asignación del recurso que impida que un
proceso en espera de lograr entrar se vea postergado indefinidamente por otros procesos
nuevos que deseen utilizarlo.
Monitor: nombre_monitor;
begin
inicialización del monitor;
end.
El monitor no tiene por qué exportar todos sus procedimientos sino sólo aquellos que sean
públicos, manteniendo como privados aquellos a los que sólo pueden acceder otros
procedimientos definidos dentro del monitor. Para indicar los procedimientos que se exportan y
actúan como puertas de entrada al monitor usaremos la sentencia
export Prc1, Prc2, … , Prcn;
Se emplea la palabra condición para definir las variables de condición del monitor.
3.4 Mensajes
Los mensajes proporcionan una solución al problema de la concurrencia de procesos que
integra la sincronización y la comunicación entre ellos y resulta adecuado tanto para sistemas
centralizados como para distribuidos.
Sincronización y comunicación de procesos |6
Comunicación directa
Ambos procesos nombran de forma explícita al proceso con el que se comunican:
enviar (Q, mensaje)
recibir (P, mensaje)
Este método proporciona seguridad en el intercambio de mensajes, ya que cada proceso debe
conocer la identidad de su pareja, pero, no resulta muy adecuado para diseñar rutinas de
servicio de un SO.
Comunicación indirecta
Los mensaje se envían y reciben a través de una entidad intermedia, el buzón o puerto. Los
procesos dejan mensajes y otros procesos los toman. Ofrece mayor versatilidad ya que la
comunicación puede ser de uno a uno, de uno a muchos, de muchos a uno y de muchos a
muchos.
Cada buzón tiene un identificador que los distingue. Operaciones:
enviar(buzónA, mensaje)
recibir(buzónA, mensaje)
En varios procesos que recogen información del mismo buzón surge el problema de quén debe
recoger un mensaje. Hay varias soluciones:
a) permitir que un buzón sólo pueda ser compartido por dos procesos
b) permitir que cada vez sólo un proceso pueda ejecutar una operación de recibir
c) que el sistema identifique al receptor del mensaje
Las diferencias en los modelos de sincronización se debe a las distintas formas que puede
adoptar la operación de envío del mensaje:
a) Asíncrona. El proceso que envía sigue su ejecución sin preocuparse de si el mensaje
se recibe o no.
b) Síncrona. El proceso que envía sólo sigue su tarea cuando el mensaje ha sido
recibido.
c) Invocación remota. El proceso que envía sólo prosigue su ejecución cuando ha
recibido respuesta del receptor.
El modelo asíncrono tiene limitada la cantidad de memoria para evitar que un uso
descontrolado pudiera agotar la cantidad de almacenamiento temporal del sistema.
El método síncrono necesita que el emisor y el receptor se “junten” para realizar una
comunicación (encuentro). El proceso emisor se suspende hasta que la ejecución de una
operación de recibir le saque de ese estado.
En la transferencia por valor se realiza una copia del mensaje desde el espacio de
direcciones del emisor al espacio de direcciones del receptor. Tiene la ventaja de que mantiene
desacoplada la información que manejan el emisor y el receptor, proporcionando mayor
seguridad en la integridad de la información. Los inconvenientes son el gasto de memoria y el
tiempo que implica la copia.
En la transferencia por referencia se pasa sólo un puntero al mensaje. Sus ventajas son el
menor gasto de memoria y que no hay necesidad de hacer copia. El aspecto negativo es
necesitar mecanismos adicionales de seguridad para compartir la información entre los
procesos.
La invocación remota utiliza necesariamente la transferencia por valor, mientras que los
métodos síncrono y asíncrono pueden utilizar varios modos.
Los SO tienen asociado a cada enlace una cola en la cual mantienen los mensajes pendientes
de ser recibidos. Cuando el proceso emisor envía un mensaje, si la cola no está llena se copia
el mensaje y el proceso continúa su ejecución. Si la cola está llena el proceso se suspende
hasta que queda espacio libre en la cola. Si el mensaje se pasa por referencia la cola guarda
los punteros a los mensajes y los valores de estos si el paso es por valor.
3.5 Interbloqueo
El error más serio que puede ocurrir en entornos concurrentes es el conocido como
interbloqueo: dos o más procesos entran en un estado que imposibilita a cualquiera de ellos
salir del estado en que se encuentra.
2) Retención y espera. Los procesos retienen los recursos que han adquirido mientras
esperan para adquirir otros recursos que están siendo retenidos por otros procesos.
3) No existencia de expropiación. Los recursos no se pueden quitar a los procesos que
los tienen; su liberación se produce voluntariamente una vez que los procesos han
finalizado su tarea con ellos.
4) Espera circular. Existe una cadena circular de procesos en la que cada uno retiene al
menos un recurso que se solicita por el siguiente proceso de la cadena.
Es el método más utilizado, pero puede llevar a una pobre utilización de los recursos. Como las
cuatro condiciones son necesarias para que se produzca el interbloqueo basta con evitar una
de ellas para que no se produzca.
La condición de exclusión mutua se debe mantener, ya que hay recursos que no se pueden
compartir.
Retención y espera
Se debe garantizar que un proceso que posee un recurso no pueda pedir otro. Si el conjunto
completo de recursos necesitados por el proceso están disponibles se le concede y en caso
contrario, se suspende en espera de que todos lo estén. Este modo de proceder no resulta
adecuado si va a haber recursos que sólo se van a utilizar al final de la ejecución del proceso y
que sin embargo, se mantienen retenidos mientras se hace uso de otros. Para evitarlo se
puede proceder pidiendo conjuntos de recursos con la condición de o todos o ninguno.
El método plantea dos problemas:
1) Pobre uso de los recursos
2) Puede resultar difícil que un conjunto de recursos se encuentren disponibles a la vez
No existencia de expropiación
Se evita permitiendo la expropiación. Si un proceso que tiene uno o más recursos solicita otro
éste le es concedido si está disponible. En el caso de que el nuevo recurso solicitado esté en
uso, el proceso que lo reclama debe esperar y permite que los recursos de que dispone se
puedan expropiar.
Si un proceso solicita algunos recursos primero comprueba que están libres. Si es así se le
asignan. Si no están libres se mira si están asignados a otros procesos que están esperando,
en cuyo caso se expropian y pasan al proceso que puede entrar inejecución. Si hay algún
recurso que no está libre o que no puede ser expropiado, el proceso se suspende y no puede
volver a ejecución hasta que no disponga de todos los recursos.
Puede llevar a que haya procesos que se vean relegados durante un tiempo excesivamente
grande.
Espera circular
Se ordenan los recursos asignándoles a cada tipo de ellos un número entero y se impone que
se pidan en orden ascendente. Las peticiones de todos los recursos pertenecientes a un mismo
tipo deben realizarse con una única petición y no incrementalmente.
Desventaja: los recursos no se piden en el orden que se necesitan, sino en el que se ha
establecido. Procesos que necesiten los recursos en un orden distinto al especificado pueden
verse obligados a pedir los recursos antes de necesitarlos acaparándolos innecesariamente.
La técnica más utilizada para realizar este método es el algoritmo del banquero (Dijkstra,
1965). El algoritmo asegura que el número de recursos asignados a todos los procesos nunca
puede exceder del número de recursos del sistema. Nunca se puede hacer una asignación
peligrosa (asignar recursos de modo que no queden suficientes para satisfacer las necesidades
de todos los procesos).
Características:
a) Se permiten las condiciones de exclusión mutua, retención y espera y de no existencia
de expropiación.
b) Los procesos solicitan el uso exclusivo de los recursos que necesitan.
c) Los procesos piden de uno en uno los recursos al SO.
d) El sistema puede conceder o rechazar cada petición.
e) Una petición que no conduce a un estado seguro se rechaza y cada petición que
conduce a un estado seguro se concede.
Si el grafo no contiene ningún ciclo no hay ningún proceso que esté bloqueado, pero si lo
contiene puede existir un interbloqueo. Si sólo hay un elemento por cada tipo de recurso la
existencia de un ciclo es una condición necesaria y suficiente para que haya interbloqueo. Si
cada tipo de recurso tiene varios elementos, entonces la condición de existencia de un ciclo es
necesaria pero no suficiente para asegurar que existe un interbloqueo. Una condición suficiente
es la existencia de un ciclo en el que no hay ningún camino que salga de alguno de los nodos
que lo forman que a su vez no sea ciclo.
Una vez que se ha detectado el interbloqueo se debe romper para que los procesos puedan
finalizar su ejecución y liberar así los recursos. Para la ruptura se pueden realizar varias
opciones. La idónea sería suspendiendo algunos procesos bloqueados para tomar sus
recursos y reanudar su ejecución una vez que se hubiera deshecho el interbloqueo.
Las dos opciones que se suelen utilizar son: reiniciar uno o más de los procesos bloqueados y
expropiar los recursos de algunos de los procesos bloqueados.
Para que la reiniciación resulte menos traumática para el sistema, hay que tener en cuenta
ciertos factores:
1) La prioridad del proceso
2) El tiempo de procesamiento utilizado y el que le resta
3) El tipo y número de recursos que posee
4) El número de recursos que necesita para finalizar
5) El número de otros procesos que se verían involucrados con su reiniciación
La expropiación de recursos se basa en criterios similares. Pero hay otro aspecto a tener en
cuenta ahora: el estado al que se pasan los procesos expropiados, ya que al perder algunos de
sus recursos no pueden continuar con su ejecución normal. La solución sería volverlos a un
estado anterior a que se produjese el interbloqueo. Para que esto sea posible se necesita que
S i n c r o n i z a c i ó n y c o m u n i c a c i ó n d e p r o c e s o s | 10
el sistema disponga de una utilidad que registre los estados de los distintos procesos en tiempo
de ejecución.
Se puede obtener una mayor eficiencia combinando los distintos métodos para aprovechar sus
ventajas:
a) Agrupar los recursos del sistema en clases disjuntas
b) Para evitar el interbloqueo entre las clases se ordenan en la forma que se ha señalado
para evitar la espera circular
c) Usar en cada clase el método más apropiado de evitar en ella el interbloqueo