La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Sincronización de procesos

Presentaciones similares


Presentación del tema: "Sincronización de procesos"— Transcripción de la presentación:

1 Sincronización de procesos
Rina Arauz

2 Tipos de procesos Proceso independiente es aquel que se ejecuta sin requerir la ayuda o cooperación de otros procesos, no afecta ni es afectado por la ejecución de otros procesos en el sistema y NO comparten datos. Procesos cooperantes (cooperan y comparten) trabajan conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos, se pueden afectar o ser afectados por la ejecución de otros procesos en el sistema y SI comparten datos. Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos.

3 Productor-consumidor
Un proceso produce datos que son posteriormente procesados por otro proceso i.e.: el manejador de teclado y el programa que recoge los caracteres de un buffer Lo más cómodo es emplear un buffer circular Escribe Lee Productor Consumidor

4 Código del productor Código del consumidor
El productor no puede escribir en el buffer si está lleno Comparte con el consumidor: el buffer y el contador El consumidor no puede leer del buffer si está vacío do { ... produce un nuevo elemento (elemento_p) while (contador == MAX_ELEMENTOS) haz_nada; buffer[indice_p] = elemento_p; indice_p = (indice_p + 1) % MAX_ELEMENTOS; contador = contador + 1; } while (TRUE); while (contador == 0) haz_nada; elemento_c = buffer[indice_c]; indice_c = (indice_c + 1) % MAX_ELEMENTOS; contador = contador - 1; consume el elemento (elemento_c)

5 Condiciones de carrera
El código anterior no funciona por existir condiciones de carrera al modificar el contador. En lenguaje ensamblador: Productor Consumidor load r0, contador load r0, contador add r0, sub r0, 1 store contador, r store contador, r0 Problema: la modificación del contador no es atómica Dependiendo de la ejecución relativa de las instrucciones se puede llegar a diferentes resultados. Condiciones de carrera: se presenta cuando dos ó más procesos compiten por acceder a un mismo recurso. Si no existe sincronización, al interferirse los cambios pueden haber serias inconsistencias. Puede producirse una condición de carrera sobre una variable cuando varios procesos acceden simultáneamente a la variable para modificarla. La condición de carrera (race condition) ocurre cuando dos o más procesos acceden un recurso compartido sin control, de manera que el resultado combinado de este acceso depende del orden de llegada.

6 Atomicidad Una operación se dice que es atómica (en un sistema uniprocesador) cuando se ejecuta con las interrupciones deshabilitadas. Las referencias y las asignaciones son atómicas en la mayoría de los sistemas. Esto no es siempre cierto para matrices, estructuras o números en coma flotante. Típicamente la arquitectura proporciona operaciones específicas para lograr la atomicidad.

7 Ejemplo de condiciones de carrera:
#include <pthread.h> #include <stdio.h> void *print_fnc( void *ptr ); int p = 5; int main() { pthread_t thr1, thr2; char *m1 = "Thr1"; char *m2 = "Thr2"; int r1, r2; r1 = pthread_create( &thr1, NULL, print_fnc, (void*) m1); r2 = pthread_create( &thr2, NULL, print_fnc, (void*) m2); pthread_join( thr2, NULL); pthread_join( thr1, NULL); printf("Thread 1 devolvio: %d y el Thread 2: %d\n", r1, r2); }

8 cc hilo_no_sinc.c -lpthread -o hilo_no_sinc Ejecutar: ./hilo_no_sinc
void *print_fnc( void *ptr ) { int i = 0; char *message; message = (char *) ptr; for (i; i<1000; i++) { p = p + 1; printf("%s : %d\n", (char*)message, p); sleep(1); } Salida: Thr2 : 6 Thr1 : 7 Thr1 : 8 Thr2 : 9 Thr2 : 11 Thr1 : 10 Thr1 : 12 Thr2 : 13 Thr1 : 14 Thr2 : 15 Thr1 : 16 Thr2 : 16 Thr2 : 17 Thr1 : 17 Thr1 : 18 Thr2 : 19 Thr2 : 20 Thr1 : 21 Thr1 : 22 Compilar: cc hilo_no_sinc.c -lpthread -o hilo_no_sinc Ejecutar: ./hilo_no_sinc

9 Ejemplo (2):

10 Sincronización Persona A Persona B
3:00 Mira en la nevera. No hay leche 3:05 Va a la tienda 3:10 Llega a la tienda Mira en la nevera. No hay leche 3:15 Deja la tienda Va a la tienda 3:20 Llega a casa y guarda la leche Llega a la tienda 3:25 Deja la tienda 3:30 Llega a casa y ...

11 Sincronización Sincronizar hace referencia a la coordinación de procesos que se ejecutan simultáneamente para completar una tarea (procesos cooperantes), con el fin de obtener un orden de ejecución correcto y evitar así estados inesperados.

12 Definiciones: Exclusión mutua: es el mecanismo que asegura que sólo una persona o proceso está haciendo algo en un instante determinado (los otros están excluidos). Sección crítica: es la sección de código, o colección de operaciones, en el que se actualizan variables comunes. La ejecución de las secciones críticas debe ser mutuamente exclusiva para evitar inconsistencia de datos. El problema de la sección crítica consiste en diseñar un protocolo que los procesos pueden usar para conseguir la exclusión mutua de las secciones críticas.

13 Problema de la sección crítica
Toda solución debe cumplir tres condiciones Exclusión mutua: no pueden acceder dos procesos a la vez a la sección crítica. Progreso: cuando un proceso quiera ejecutar su sección crítica pueda hacerlo si ésta está libre. Espera limitada: que ningún proceso espere indefinidamente para entrar en su sección crítica. Solución general: do { protocolo de entrada sección crítica protocolo de salida resto de la sección } while (TRUE);

14 Tipos de soluciones Suposiciones:
Todos los procesos se ejecutan a una velocidad distinta de cero Su velocidad relativa no influye Soluciones basadas en variables de control Soluciones basadas en instrucciones máquina específicas (test_and_set o swap) Soluciones basadas en primitivas del sistema operativo Soluciones proporcionadas por el lenguaje, regiones críticas y monitores

15 Semáforos Introducidos por Dijkstra en los años 60
Es un tipo especial de variable que sólo puede ser accedida por dos primitivas P y V P (semáforo) Operación atómica que espera hasta que el semáforo sea positivo, en este momento lo decrementa en 1. V (semáforo) Operación atómica que incrementa el semáforo en 1. ¿Cómo quedaría el problema de la sección crítica con semáforos? P (exmut) Sección crítica V (exmut)

16 Características de los semáforos
Son independientes de la máquina Son simples Pueden trabajar con varios procesos Pueden permitir que varios procesos entren en la sección crítica al mismo tiempo en caso de necesitarse esta posibilidad Doble uso de los semáforos: Exclusión mutua Sincronización

17 Existen básicamente dos tipos de semáforos:
Semáforos contadores: Toman valores positivos mayores o iguales a 0. Se utilizan para sincronización de procesos. Semáforos binarios: Toman los valores 0 ó 1 y se utilizan para exclusión mutua.

18 Productor-consumidor
Restricciones: El consumidor espera a que haya datos en el buffer El productor espera a que haya buffers vacíos Sólo un único proceso puede manipular el buffer a la vez Semáforos: smf_llenos, smf_vacíos y exmut Valores iniciales: smf_llenos = 0 smf_vacíos = número_de_buffers exmut = 1

19 Productor Consumidor P (smf_vacíos); P (exmut); Produce un dato; V (exmut); V (smf_llenos); P (smf_llenos); P (exmut); Consume el dato; V (exmut); V (smf_vacíos); ¿Por qué el productor hace P(smf_vacíos) y V(smf_llenos)? ¿Es importante el orden en que se ejecutan las primitivas P y V?

20 Problema del puente estrecho
Por un puente sólo pueden pasar o coches que suben o coches que bajan. Solución: Variables compartidas: int contadorsubida = 0; int contadorbajada = 0; Semáforos: semaforo exmut_s, exmut_b, puente; Valores iniciales: Los semáforos inicialmente deben valer 1 No se tratan los problemas de inanición

21 Código subida Código bajada
P(exmut_s); contadorsubida++; if (contadorsubida == 1) P(puente); V(exmut_s); ... Se sube el puente ... contadorsubida--; if (contadorsubida == 0) V(puente); P(exmut_b); contadorbajada++; if (contadorbajada == 1) P(puente); V(exmut_b); ... Se baja el puente ... contadorbajada--; if (contadorbajada == 0) V(puente);

22 Problema del barbero dormilón
Problema: 1 barbero y N sillas de espera Si un cliente entra y no hay sillas, se va Semáforos: clientes: número de clientes en espera sin contar el que está en la silla del peluquero barbero: barberos activo o inactivo exmut: exclusión mutua Variable compartida: esperando: número de clientes esperando Inicialmente: clientes=0 barbero=0 exmut=1 esperando=0

23 Barbero Cliente do { P(clientes); P(exmut); esperando=esperando-1;
V(barbero); V(exmut); /* Corta el pelo */ } while (TRUE); do { P(exmut); if (esperando < SILLAS) { esperando++; V(clientes); V(exmut); P(barbero); /* Se corta el pelo */ } else { } } while (PELOLARGO);

24 Comunicación con mensajes
Válido para comunicación intermáquina Definición: Mensaje: parte de información que es pasada de un proceso a otro Buzón: lugar donde se depositan los mensajes desde el envío a la recepción Operaciones sobre mensajes: Enviar Recibir Métodos de comunicación Comunicación en un único sentido: los mensajes fluyen en un único sentido (pipe) Ejemplos: Tuberías de UNIX. Comunicación bidireccional: los mensajes fluyen en ambos sentidos (sockets) Ejemplos: Llamadas a procedimientos remotos (RPC).


Descargar ppt "Sincronización de procesos"

Presentaciones similares


Anuncios Google