UNIDAD #5

Comunicación y Entronización de Procesos

Problemas clásicos de comunicación y entronización

Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como procesos independientes o cooperantes. Un proceso independiente es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes intérpretes de mandatos que se ejecutan de forma simultánea en un sistema. Los procesos son cooperantes cuando están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos.
Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos. 

El problema de la sección crítica es uno de los problemas que con mayor frecuencia aparece cuando se ejecutan procesos concurrentes tanto si son cooperantes como independientes. Considérese un sistema compuesto
por n procesos {P1, P2, ..., PN} en el que cada uno tiene un fragmento de código, que se denomina sección crítica. Dentro de la sección crítica, los procesos pueden estar accediendo y modificando variables comunes, registros de una base de datos, un archivo, en general cualquier recurso compartido.
La característica más importante de este sistema es que cuando un proceso se encuentra ejecutando código de la sección crítica, ningún otro proceso puede ejecutar en su sección. Para resolver el problema de la sección crítica es necesario utilizar algún mecanismo de sincronización que permita a los procesos cooperar entre ellos sin problemas.


Mecanismos de comunicación y sincronización de procesos

Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como procesos independientes o cooperantes. Un proceso independiente es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes intérpretes de mandatos que se ejecutan de forma simultánea en un sistema. Los procesos son cooperantes cuando están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos.

El siguiente segmento de seudocódigo utiliza un mutex para proteger el acceso a una sección crítica.


A continuación se va a describir una situación típica en la que se utilizan los mutex y las variables condicionales de forma conjunta. Supóngase que una serie de procesos compiten por el acceso a una sección crítica. En este caso es necesario un mutex para proteger la ejecución de dicha sección crítica. Una vez dentro de la sección crítica, puede ocurrir que un proceso no pueda continuar su ejecución dentro de la misma debido a que no se cumple una determinada condición; por ejemplo, se quiere insertar elementos en un buffer común y éste se encuentra lleno. En esta situación, el proceso debe bloquearse, puesto que no puede continuar su ejecución. Además, debe liberar el mutex para permitir que otro proceso entre en la sección crítica y pueda modificar la situación que bloqueó al proceso, en este caso eliminar un elemento del buffer común para hacer hueco.
Para conseguir este funcionamiento es necesario utilizar una o más variables compartidas que se utilizarán como predicado lógico y que el proceso consultará para decidir su bloqueo o no. El fragmento de código que se debe emplear en este caso es el siguiente:

lock(m);

/* código de la sección crítica */

while (condición == FALSE)
c_wait(c, m);

/* resto de la sección crítica */


unlock(m);

En el fragmento anterior, m es el mutex que se utiliza para proteger el acceso a la sección crítica y c la variable condicional que se emplea para bloquear el proceso y abandonar la sección crítica. Cuando el proceso que está ejecutando dentro de la sección evalúa la condición y ésta es falsa, se bloquea mediante la operación c_wait y libera el mutex permitiendo que otro proceso entre en ella.


Servicios POSIX relacionados con la comunicación y sincronización de procesos

Los servicios que ofrece POSIX para la comunicación
y sincronización de procesos y que se utilizarán en la realización de las prácticas que se proponen en este capítulo.
Tuberías (pipes)
Una tubería es un mecanismo de comunicación y sincronización. Desde el punto de vista de su utilización, es como un ceudo archivo mantenido por el sistema operativo. Conceptual-mente, cada proceso ve la tubería como un conducto con dos extremos, uno de los cuales se utiliza para
escribir o insertar datos y el otro para extraer o leer datos de la tubería. La escritura se realiza mediante el servicio que se utiliza para escribir datos en un archivo. De igual forma, la lectura se lleva a cabo mediante el servicio que se emplea para leer de un archivo.

El flujo de datos en la comunicación empleando tuberías es unidireccional y FIFO, esto quiere decir que los datos se extraen de la tubería (mediante la operación de lectura) en el mismo orden en el que se insertaron (mediante la operación de escritura). 



No hay comentarios:

Publicar un comentario