Comunicación, Sincronización y Concurrencia de procesos Sistemas Operativos Comunicación, Sincronización y Concurrencia de procesos
Comunicación entre procesos En el modelo productor-consumidor analizado (ver apunte) los procesos se comunican a través de un buffer común. El código lo escribía el programador. Definimos esta comunicación como shared memory (memoria compartida: el buffer es memoria compartida por ambos procesos). También puede ser por IPC, InterProcess Comunication.
IPC y Shared memory IPC es un mecanismo de comunicación y sincronización entre procesos y se implementa a través de un sistema de mensajes (message system). Ambos esquemas, shared memory y IPC, no son excluyentes: pueden usarse simultáneamente dentro de un SO o dentro de un proceso.
IPC IPC provee como mínimas dos operaciones: send (message) y receive(message). El mensaje puede ser de longitud fija o variable. Long. Fija: puede dificultar la tarea de programación, pero la implementación es más sencilla. Long. Variable: se complica la implementación y simplifica la tarea de programación.
IPC: link de comunicación No hablamos de su implementación física del link, sino de su implementación lógica. Forma de establecimiento del link Asociación del link con uno o más procesos Cantidad de link que pueden establecerse entre cada par de procesos Capacidad del link (espacio de almacenamiento) Medida del mensaje Tipo de link: unidireccional o bidireccional.
Otras características del link Directos o indirectos Simétricos o asimétricos Con buffering automático o explícito Con Send por copia o por referencia
Naming: directo o indirecto Cuando dos procesos quieren comunicarse necesitan poder referenciarse. Esa referencia puede ser directa o indirecta Directa: definición de primitivas send/receive: Send (P,message) Envía un mensaje a P Receive (Q, message) Recibe un mensaje de Q
Características del naming directo Los procesos necesitan conocer la identidad de los otros procesos con los que quieren comunicarse. El link se establece entre los procesos a comunicarse. Un link se asocia con dos procesos Entre cada par de procesos existe exactamente un link El link puede ser unidireccional, pero normalmente es bidireccional
Naming simétrico y asimétrico El que vimos es simétrico: cada proceso tiene que nombrar al otro para comunicarse. En el asimétrico, solo el emisor nombra el receptor; el receptor no requiere nombrar el emisor. Las operaciones serian: Send (P,message) Envia un mensaje a P Receive (id, message) Recibe un mensaje desde cualquier proceso. Id identifica el nombre del proceso con el que se ha establecido la comunicación.
Naming indirecto La comunicación entre procesos se realiza a través de mailboxes o ports. El mailbox es un espacio intermedio donde los mensajes son depositados por los procesos emisores, y desde donde los procesos receptores tomaran la información. El mailbox tiene una identificación única. Un proceso se comunica con otros a través de diferentes mailboxs. Para que dos procesos se comuniquen por un mailbox, deben tener un mailbox compartido.
Naming indirecto: primitivas Las primitivas send/receive tienen la siguiente forma: Send (A,message) Envia un mensaje al mailbox A Receive (A, message) Recibe un mensaje desde el mailbox A.
Naming indirecto: Propiedades del link Para que dos procesos se comuniquen debe existir un mailbox compartido Un link puede asociarse con más de dos procesos Un link puede ser unidireccional o bidireccional Entre cada par de procesos que desean comunicarse puede haber diferentes links, donde cada link corresponde a un mailbox.
Características del mailbox El mailbox puede ser propiedad del proceso o del sistema. Cuando es propiedad del proceso está definido como parte de él o asignado directamente a él. En este caso el owner (propietario) del mailbox es el que recibe mensajes a través de el; el user (usuario) es quien envía los mensajes a ese mailbox. Esta propiedad determina quien recibe los mensajes del mailbox.
Buffering Un link tiene una capacidad para almacenar mensajes. Zero capacity: el link no puede tener mensajes esperando en el. El emisor debe esperar que el receptor reciba el mensaje para poder enviar otro. A este tipo de sincronización se le llama rendezvous. Bounded capacity: la cola tiene una capacidad para n mensajes. El emisor debe analizar si hay lugar antes de depositar un mensaje: si la capacidad esta completa debe esperar. Unbounded capacity: la cola tiene capacidad ilimitada. El emisor nunca espera para enviar un mensaje.
Buffering con ACK En los casos de buffering puede ser necesario saber cuando el mensaje llego al receptor. En ese caso se implementa un acknowledge (reconocimiento). Supongamos que dos procesos P y Q se quieren comunicar. P ejecuta: Send (Q, message); Receive(Q,message); Q ejecuta: Receive(P,message); Send(P, “acknowledge”);
Procesos cooperativos e independientes Independiente: si el proceso no afecta ni puede ser afectado por la ejecución de otros procesos. No comparte ningún tipo de dato. Cooperativo: si afecta o es afectado por la ejecución de otros procesos en el sistema.
Para qué sirven los procesos cooperativos? Para compartir información (por ejemplo, un archivo) Para acelerar el cómputo (separar una tarea en subtareas que cooperan ejecutándose paralelamente) Para planificar tareas de manera tal que se puedan ejecutar en paralelo.
Sobre los procesos cooperantes: Pueden compartir espacios de direcciones o datos a través de un file. Problema a considerar: Como evitar la inconsistencia de los datos compartidos Como acceder a espacios critico de código compartido.
Alternativas de sincronización Semáforos Monitores Paso de mensajes
Sección crítica (definición) Sean un conjunto de procesos cooperantes. Cada proceso tiene un segmento de código en el cual puede modificar variables comunes, o un file, o una tabla. Llamamos sección crítica (SC) a ese segmento de código.
Exclusión mutua Cuando un proceso esta ejecutando ese segmento de código critico, ningún otro proceso puede ejecutarlo. La ejecución de la sección critica es mutuamente exclusiva en el tiempo.
Solución al problema de la sección crítica Condiciones para la solución: Exclusión mutua Progresión: que ordenadamente todos los procesos puedan ejecutarse y entrar en la SC. Espera limitada: una vez que requirió entrar a la SC, que pueda hacerlo después de un tiempo determinado. La solución se implementa a través de diferentes algoritmos
Aplicación del protocolo Las instrucciones de maquina (load, test, load) se ejecutan atómicamente. La solución para múltiples procesos la da el Algoritmo del panadero (bakery algorithm).
Semáforos Es una herramienta de sincronización Sirve para solucionar el problema de la sección crítica. Sirve para solucionar problemas de sincronización.
Implementación Es una variable entera sujeta a dos operaciones: wait y signal Estas operaciones se ejecutan de manera indivisible. Cuando un proceso modifica el valor del semáforo, otros procesos no pueden modificarlo simultáneamente.
Implementación (continuacion) Se inicializa con valor no negativo Wait decrementa el valor del semáforo. Si el valor se hace negativo, el proceso se bloquea. Signal incrementa el valor del semáforo. Si el valor no es positivo, se desbloquea un proceso bloqueado por un wait.
Esquema de la SC con semáforos Repeat Entry section critical section Exit section Remainder section Until false; Nota: para mas info, ver apunte adicional...
Ejemplo Sean 2 procesos: A, que quiere ejecutar la sentencia X B, que quiere ejecutar la sentencia Y. Sem, es la variable común semáforo, inicializada en 0. Pero:... Y se debe ejecutar después que X
Solución En proceso A: X; Signal(sem); En proceso B: Wait(sem); Y;
Alternativas en la espera Busy waiting: gasta CPU, ejecuta un loop hasta poder entrar a SC. Autobloqueo: cuando el proceso ve que tiene que esperar, se bloquea. Se pone en una cola asociada con el semáforo. Se rearranca por un wakeup cuando se ejecuta el signal en los procesos en SC.
Monitores Es una construcción de alto nivel para sincronización. Es una construcción de alto nivel para sincronización. Es mas fácil de controlar que los semáforos. Se implementan como biblioteca de programas. Es un modulo de soft con 1 o + procedimientos, una secuencia de inicialización y datos locales. Ejemplos: Una estructura de datos compartida, puedo ponerla dentro de un monitor
Características básicas Variables de datos locales solo se acceden a través de los procs del monitor Un proceso entra al monitor invocando uno de sus procs. Solo un proceso puede estar en el monitor en un momento dado (ofrece exclusión mutua)
Sintaxis de un monitor Tipo nombre-monitor = monitor; Declaración de variables Procedure entry P1(...); Begin...end; .... Procedure entry Pn(...); Begin Código inicialización End.
Importante destacar! Asegura que solo un proceso a la vez puede estar activo dentro del monitor. El programador no necesita codificar explícitamente. Se agrega el constructor condition para sincronización.
Interacción por pase de mensajes Se implementa por las primitivas send y receive (visto en diapositivas anteriores) El proceso emisor (E, sender) envía información (mensaje) al receptor (R, receiver). Ventaja: se puede implementar en sistemas distribuidos, en multiprocesador, y mono con memoria compartida.
Características de sincronización Envío bloqueante, recepción bloqueante El E y el R se bloquean hasta que se entrega el mensaje (Rendezvous). Envío no bloqueante, recepcion bloqueante El E puede continuar, pero R se bloquea hasta que llega el mensaje. Envío no bloqueante, recepción no bloqueante Nadie espera
Características de sincronización (continuación) El send no bloqueante es la forma mas útil en programación concurrente. Cuidado con la generación de mensajes excesiva. El programador debe controlar la recepción. El Envío no bloqueante, recepción bloqueante es útil para procesos servidores que ofrezcan servicio o recursos a otros procesos.
FIN SINCRONIZACION DE PROCESOS