EL TEMA Sincronizacion Procesos En SO SE ENCUENTRA ESPERANDO TUS CONOCIMIENTOS.
SOLO USAR BOTON EDIT ABAJO Y EMPIEZA A COLABORAR, SALUDOS Y MUCHAS GRACIAS ING. DANIEL RAMRIEZ
La sincronización es la transmisión y recepción de señales que tiene por objeto llevar a cabo el trabajo de un grupo de procesos cooperativos. Es la coordinación y cooperación de un conjunto de procesos para asegurar la comparación de recursos de cómputo. La sincronización entre procesos es necesaria para prevenir y/o corregir errores de sincronización debidos al acceso concurrente a recursos compartidos. La sincronización permite intercambiar señales de tiempo (ARRANQUE/PARADA) entre procesos cooperantes para garantizar las relaciones específicas de precedencia impuestas por el problema que se resuelve. Sin una sincronización adecuada entre procesos, la actualización de variables compartidas puede inducir a errores de tiempo relacionados con la concurrencia que son con frecuencia difíciles de depurar.
Para que los procesos puedan sincronizarse es necesario disponer de servicios que permitan bloquear o suspender bajo determinadas circunstancias la ejecución de un proceso. Los principales mecanismos de sincronización que ofrecen los sistemas operativos son: • Señales • Tuberías • Semáforos • Mutex y variables condicionales • Paso de mensajes Tuberías Una tubería es un mecanismo de comunicación y sincronización. Conceptualmente, 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. El flujo de datos en la comunicación empleando tuberías es unidireccional (Si se desea utilizar de un flujo de datos bidireccional, se deben disponer dos tuberias), 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). Utiliza el FIFO (Fist In, First Out). El tamaño de una tubería varía en cada sistema operativo, aunque el tamaño típico es de 4KB. Sobre una tubería puede haber múltiples procesos lectores y escritores. Las tuberías se implementan normalmente como regiones de memoria compartida entre los procesos que utilizan la tubería. Escritura en una tubería Una operación de escritura sobre una tubería introduce datos en orden FIFO • Si la tubería se encuentra llena o se llena durante la escritura, la operación bloquea al proceso escritor hasta que se pueda completar.
• Si no hay ningún proceso con la tubería abierta para lectura, la operación devuelve el correspondiente error.
• Una operación de escritura sobre una tubería se realiza de forma atómica, es decir, si dos procesos intentan escribir de forma simultánea en una tubería, sólo uno de ellos lo hará. El otro se bloque á hasta que finalice la primera escritura. Lectura de una tubería Una operación de lectura de una tubería obtiene los datos almacenados en la misma. Estos datos, además, se eliminan de la tubería. • Si la tubería está vacía, la llamada bloquea al proceso en la operación de lectura hasta que algún proceso escriba datos en la misma
• Si la tubería almacena M bytes y se quieren leer n bytes, entonces: — Si M = n, la llamada devuelve n bytes y elimina de la tubería los datos solicitados. — Si M < n, la llamada devuelve M bytes y elimina los datos disponibles en la tubería. • Si no hay escritores y la tubería está vacía, la operación devuelve fin de archivo (en este caso la operación no bloquea al proceso).
• Al igual que las escrituras, las operaciones de lectura sobre una tubería son atómicas.
Figura 5. Comunicación bidireccional usando una tuberia Existen dos tipos de tuberías: • Sin nombre. Solamente se puede utilizar entre los procesos que desciendan del proceso que creó la tubería.
• Con nombre. Se puede utilizar para comunicar y sincronizar procesos independientes. Señales Las señales tienen frente al proceso el mismo comportamiento que las interrupciones tienen frente al procesador, por lo que se puede decir que una señal es una interrupción al proceso. El proceso que recibe una señal se comporta de la siguiente manera: • El proceso detiene su ejecución en la instrucción de máquina que está ejecutando.
• Bifurca a ejecutar una rutina de tratamiento de la señal, cuyo código ha de formar parte del propio proceso.
• Una vez ejecutada la rutina de tratamiento, sigue la ejecución del proceso en la instrucción en el que fue interrumpido. El origen de una señal puede ser un proceso a otro proceso o grupo de procesos con el mismo identificador de usuario o bien, el sistema operativo puede enviar señales a los procesos. El empleo de señales, no es un mecanismo muy apropiado para sincronizar procesos debido a las siguiente razones: • Las señales tienen un comportamiento asíncrono. Un proceso puede recibir una señal en cualquier punto de su ejecución, aunque no esté esperando su recepción.
• Las señales no se encolan. Si hay una señal pendiente de entrega a un proceso y se recibe una señal del mismo tipo, la primera se perderá. Esto hace que se puedan perder eventos de sincronización importantes. Semáforos Un semáforo [Dijkstra, 1965] es un mecanismo de sincronización que se utiliza generalmente en sistemas con memoria compartida. Un semáforo es un objeto con un valor entero, al que se le puede asignar un valor inicial no negativo y al que sólo se puede acceder utilizando dos operaciones atómicas: wait y signal. El algoritmo de uso es el siguiente: wait (s) { s = s –1; if (s < 0) Bloquear al proceso; } signal (s) { s = s + 1; if ( s <= 0 ) Desbloquear a un proceso bloqueado en la operación wait; } Cuando el valor del semáforo es menor o igual que cero, cualquier operación wait que se realice sobre el semáforo bloqueará al proceso. Cuando el valor del semáforo es positivo, cualquier proceso que ejecute una operación wait no se bloqueará. El número de procesos, que en un instante determinado se encuentran bloqueados en una operación wait, viene dado por el valor absoluto del semáforo si es negativo. Cuando un proceso ejecuta la operación signal, el valor del semáforo se incrementa. En el caso de que haya algún proceso bloqueado en una operación wait anterior, se desbloqueará a un solo proceso. Sección crítica con semáforos Para resolver el problema de la sección crítica utilizando semáforos debemos proteger el código que constituye la sección crítica de la siguiente forma: wait (s); Sección crítica;; signal(s);; El valor que tiene que tomar el semáforo inicialmente es 1, de esta forma solo se permite a un único proceso acceder a la sección crítica. Si el valor inicial del semáforo fuera, por ejemplo, 2, entonces dos procesos podrían ejecutar la llamada wait sin bloquearse y por tanto se permitiría que ambos ejecutaran de forma simultánea dentro de la sección crítica. Mutex y variables condicionales Los mutex y las variables condicionales son mecanismos especialmente concebidos para la sincronización de Thread (Hilos). Se emplean para obtener acceso exclusivo a recursos compartidos y para asegurar la exclusión mutua sobre secciones críticas. Sobre un mutex se pueden realizar dos operaciones atómicas básicas: • lock: Intenta bloquear el mutex. Si el mutex ya está bloqueado por otro proceso, el proceso que realiza la operación se bloquea. En caso contrario se bloquea el mutex sin bloquear al proceso.
• unlock: Desbloquea el mutex. Si existen procesos bloqueados en él, se desbloqueará a uno para de ellos que será el nuevo proceso que adquiera el mutex. La operación unlock sobre un mutex debe ejecutarla el Thread que adquirió con anterioridad el mutex mediante la operacion operación lock. Sección crítica con mutex Considerese el siguiente pseudocódigo:
lock (m) ; / *solicita la entrada en la sección crítica */ < sección crítica > unlock(m) ; /* salida de la sección critica */ Dado que las operaciones lock y unlock son atómicas, solo un proceso conseguirá bloquear el mutex y podrá continuar su ejecución dentro de la sección crítica. El segundo proceso se bloqueara hasta que el primero libere el mutex mediante la operación unlock.