Sincronización de Threads

Documentos relacionados
Sistemas Operativos Práctica 4

Implementación de monitores POSIX

Programación de Sistemas de Tiempo Real

Tema 3. Concurrencia entre procesos

Tema 4 El paradigma cliente-servidor

Sistemas Operativos Práctica 3

Práctica 8: Barreras

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

Tostadores y POSIX. 1. Introducción

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

SOLUCIONES A ALGUNOS DE LOS EJERCICIOS DE SINCRONIZACION Y COMUNICACION ENTRE PROCESOS

Esquema de un programa en C: bloques básicos

07 << Acceso en exclusiva al recurso compartido >>

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

Mensajes. (versión preliminar)

Control por Computador

PROGRAMACIÓN CONCURRENTE. Tema 5 Monitores

Apuntadores (Punteros)

Comunicación y sincronización de procesos

Taller de Sistemas Operativos Introducción

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

Fundamentos de programación

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Se guardan en archivos con extencion c y los cabezales con extension h

Concurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

El lenguaje de Programación C. Fernando J. Pereda

Objective C (Desarrollo con Apple)

Programación Estructurada

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Curso LINUX. AREA 1: Entornos de programación

Programación en C. (Segunda Parte) DATSI, FI, UPM José M. Peña. Programación en C

SOLUCION EXAMEN junio 2006

2.2 Nombres, Ligado y Ámbito

Procesos e Hilos en C

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Sistemas Operativos I Manual de prácticas

Instituto Politécnico Nacional

PROGRAMACION CONCURRENTE

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

Ingeniería Informática. Curso 3º. Sistemas Operativos Examen Final. TEORIA. 4 de Septiembre de 2009

Guía rápida para gestionar el puerto paralelo del PC

Sistemas Operativos Temas 4, 5 y 6. Jorge García Duque Despacho: B-202 Tutorías: Lunes 16:00-18:00 y Martes 16:00-20:00

2. Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.

Receta general para resolver problemas de sincronización con semáforos

Reglas básicas de la programación en lenguaje C

Tema 3. Monitores Programación Concurrente

LENGUAJE. Tema 1 - Introducción

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

Concurrencia: Exclusión mutua y Sincronización

Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Mensajes. Interbloqueo

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Concurrencia. Primitivas IPC con bloqueo

Introducción a las sentencias de control

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Contenido. Capítulo 1. Introducción a lenguaje C 1

Arquitectura de Computadores: Exámenes y Controles

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

EDITRAN/TR. Windows/Unix. Manual de referencia

TEMA 5 HILOS Y PLANIFICACIÓN

PROGRAMACIÓN EN JAVA

Examen Principios de Programación Febrero 2012

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Sistemas Operativos I. Tema 3. Procesos. Equipo de Sistemas Operativos DISCA / DSIC UPV

Comunicación y Sincronización con Monitores Resumen del Tema

Uso avanzado de punteros

Threads o Hilos. Marco Besteiro y Miguel Rodríguez

Introducción a C++ y Code::Blocks

Operadores de comparación

CAPÍTULO 8. Comunicación y sincronización basada en variables compartidas

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Tema 2: Clase y objetos en Java. Programación Orientada a Objetos Curso 2009/2010 Begoña Moros Valle

Generador de analizadores sintácticos BISON

-> Todo socket viene definido por dos características fundamentales:

Programación de SM de Memoria Compartida

TEMA 5: Control de la Concurrencia en Java (API Estándar)

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. II.5 Sincronización basada en memoria compartida: Monitores

Tema 3: Concurrencia de procesos

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente:

CONTENIDO. Programación orientada a objetos - POO. Clases. Constructores y destructores. Definiciones. Entrada y salida

Paso de mensajes. Lecturas: Burns & Wellings, Cap.??? Transparencias y apuntes de la asignatura. Filosofía cliente-servidor.

TEMA 4. ESTRUCTURAS DE CONTROL

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Programación Concurrente

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

TEMA 4. ELEMENTOS BÁSICOS DE PROGRAMACIÓN

CURSO de C++ Ignacio López

Programación Concurrente en Java

Transcripción:

Funciones POSIX III Funciones POSIX III Sincronización Sincronización Procesos Procesos Semáforos Semáforos (sem_t) (sem_t) Sincronización Sincronización Threads Threads Mutex Mutex (pthread_mutex_t) (pthread_mutex_t) Nombrados Nombrados No Nombrados No Nombrados pthread_attr_init pthread_attr_init sem_init sem_init sem_open sem_open pthread_attr_destroy pthread_attr_destroy sem_destroy sem_destroy sem_close sem_close pthread_attr_lock pthread_attr_lock sem_wait sem_wait sem_unlink sem_unlink pthread_attr_unlock pthread_attr_unlock sem_trywait sem_trywait pthread_attr_trylock pthread_attr_trylock sem_post sem_post sem_getvalue sem_getvalue 1 Sincronización de Threads Sincronización de threads Semáforos Mutex (esperas a corto plazo) Variables condicionales (esperas a largo plazo) Exclusión mutua Mutex o candado: mecanismo de sincronización más sencillo y eficiente Sirve para obtener acceso exclusivo a las variables o recursos En POSIX.1c son variables de tipo pthread_mutex_t (estructura que almacena todos los datos concernientes al mutex) 2

Funciones para mutex (I) Las funciones básicas para creación y manejo de mutex se muestran en la tabla siguiente Función pthread_mutex_init Descripción Inicializa una variable de tipo pthread_mutex_t pthread_mutex_destroy Destruye una variable mutex pthread_mutex_lock Protege la sección crítica (operación P) pthread_mutex_unlock Libera la protección de la sección crítica (op. V) pthread_mutex_trylock Como pthread_mutex_lock pero sin bloqueo 3 Funciones para mutex (II) pthread_mutex_init: inicializa una variable de tipo pthread_mutex_t int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); Dos parámetros Puntero a una variable pthread_mutex_t (mutex) objeto atributo de mutex (attr) Se inicializa por defecto haciendo el segundo parámetro NULL Devuelve 0 si se ha podido inicializar el mutex. #include<pthread.h> pthread_mutex_t my_lock; if (pthread_mutex_init(&my_lock, NULL)!=0) perror( No puedo inicializar my_lock ); 4

Funciones para mutex (III) pthread_mutex_destroy: destruye la variable mutex int pthread_mutex_destroy (pthread_mutex_t *mutex); El mutex no se destruye hasta que está completamente vacío (no hay threads en espera) Devuelve 0 si se ha podido liberar el mutex. 5 Funciones para mutex (III) pthread_mutex_lock: operación P de semáforos Código de la sección de entrada que protege la sección crítica Si el candado está cerrado, el thread que la invoca se suspende hasta que el candado quede libre Devuelve 0 si se ha podido bloquear el mutex. int pthread_mutex_lock (pthread_mutex_t *mutex); pthread_mutex_trylock: igual que pthread_mutex_lock pero no bloquea al proceso llamante si el candado está ocupado Devuelve 0 si se ha podido bloquear el mutex. int pthread_mutex_trylock (pthread_mutex_t *mutex); 6

Funciones para mutex (IV) pthread_mutex_unlock: operación V de semáforos Libera el candado cuando un thread termina su sección crítica Si hay algún thread suspendido en la cola del candado, despierta al primero. Devuelve 0 si se ha podido desbloquear el mutex. int pthread_mutex_unlock (pthread_mutex_t *mutex); Ejemplo #include<pthread.h> pthread_mutex_t my_lock; pthread_mutex_init(&mylock, NULL); pthread_mutex_lock(&my_lock); /* Sección crítica */ pthread_mutex_unlock(&my_lock); 7 EJEMPLO: Productor Consumidor :compilar con librerías: lposix4 -lpthread :compilar en linux con librerías: lrt -lpthread 8

// Problema productor - consumidor type item=; var buffer:array[0..n-1] of item entrada, salida: 0..n-1; contador: 0..n entrada=0; salida=0; contador=0; function productor; repeat // produce un item en la variable nuevo while contador==n do no-op buffer[entrada]=nuevo; entrada=(entrada+1)mod n; contador=contador+1; until false end productor Entrada Buffer Salida function consumidor; repeat until false end consumidor while contador==0 do no-op nuevo=buffer[salida]; salida=(salida+1)mod n; contador=contador-1; // consume el item almacenado en nuevo 9 Ejemplo Mutex #define BUFSIZE 8 static int buffer[bufsize] static int entrada = 0; static int salida = 0; Static int contador =0; static pthread_mutex_t candado = PTHREAD_MUTEX_INITIALIZER; //Obtener el siguiente elemento del buffer y colocarlo en *itemp void get_item (int *itemp) pthread_mutex_lock(&candado); contador=contador-1; *itemp = buffer[salida]; salida = (salida + 1) % BUFSIZE; pthread_mutex_unlock(&candado); return; 10

Ejemplo Mutex (cont.) // Colocar un elemento en el buffer void put_item(int item) pthread_mutex_lock(&candado); contador=contador+1; buffer[entrada] = item; entrada = (entrada + 1) % BUFSIZE; pthread_mutex_unlock(&candado); return; 11 EJEMPLO: Uso de mutex en threads :compilar con librerías: lposix4 -lpthread :compilar en linux con librerías: lrt -lpthread 12

/* Programa que muestra el empleo de mutex con threads */ /* Compilar con: gcc -o mutexth mutexth.c -lpthread -lposix4 */ #include <stdio.h> #include <stdlib.h> #include <sched.h> /* Para la función sched_yield() */ #define MAXLONG 100 /* Prototipos de funciones que ejecutan los threads */ void *func1 (void*); void *func2 (void*); /* Declaración de los threads */ pthread_t thread1, thread2; /* Declaración del objeto atributo */ pthread_attr_t attr; /* Declaración del mutex */ pthread_mutex_t exmut; 13 /* Definición de la función func1 */ void *func1 (void *arg) char buffer[maxlong]; char *c; sprintf (buffer, "Soy el thread 1 y estoy escribiendo un mensaje en pantalla"); c = buffer; /* Sección de entrada: operación P(S) */ pthread_mutex_lock (&exmut); /* Sección crítica: Escritura en pantalla */ while (*c!= '\0') fputc (*c, stdout); c++; /* Forzamos la expulsión de la CPU con sched_yield */ sched_yield(); fputc('\n', stdout); /* Fin de la sección crítica*/ /* Sección de salida: operación V(S) */ pthread_mutex_unlock (&exmut); pthread_exit (NULL); 14

void *func2 (void *arg) char buffer[maxlong]; char *d; sprintf (buffer, "Soy el thread 2 y estoy escribiendo un mensaje en pantalla"); d = buffer; /* Sección de entrada: operación P(S) */ pthread_mutex_lock (&exmut); /* Sección crítica: Escritura en pantalla */ while (*d!= '\0') fputc (*d, stdout); d++; /* Forzamos la expulsión de la CPU con sched_yield */ sched_yield(); fputc('\n', stdout); /* Fin de la sección crítica*/ /* Sección de salida: operación V(S) */ pthread_mutex_unlock (&exmut); pthread_exit (NULL); 15 int main (int argc, char *argv[]) /* Inicialización del objeto atributo */ pthread_attr_init (&attr); /* Inicialización del mutex */ pthread_mutex_init (&exmut, NULL); printf ("Soy la función main y voy a lanzar los dos threads \n"); pthread_create (&thread1, &attr, func1, NULL); pthread_create (&thread2, &attr, func2, NULL); printf ("Soy main: he lanzado los threads y termino \n"); pthread_exit (NULL); 16

Ejemplo: Secuenciación de Tareas Con mutex Sin mutex 17 Sincronización de Threads Variables Condicionales 18

Variables Condicionales Permiten manejar el acceso a secciones críticas múltiples (anidadas) evitando el interbloqueo. Ejemplo: La tarea 1 accede a una sección crítica pero para ejecutarla precisa un dato adicional producido por otra tarea 2 La tarea 2 para generar el dato precisa acceder a la misma sección crítica por lo que se queda bloqueado. Funcionamiento: Tienen asociado un mutex que controla el acceso a la sección crítica Adicionalmente y de forma atómica permiten comprobar el estado de una variable (variable condicional) Si el valor no es válido (dato no disponible) se desbloquea de forma atómica el mutex y el Thread se añade a la cola de espera. La variable condicional tiene dos estados: Señalizada (unlock), No Señalizada (lock). 19 Variables Condicionales Funciones manejo variables condicionales int pthread_cond_init (pthread_cond_t *cond, pthread_condattr_t *attr); int pthread_cond_destroy (pthread_cond_t *cond); int pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_signal (pthread_cond_t *cond); pthread_cond_wait : El mutex debe estar previamente bloqueado (sección crítica) Si la variable condicional está Señalizada el thread continua con la sección crítica (el estado de la var. condicional se inicializa (lock)) Si la variable condicional no está Señalizada desbloquea el mutex y coloca al thread en la cola de espera pthread_cond_signal: Desbloquea la variable condicional: despierta threads suspendidos e intentan bloquear el mutex 21

EJEMPLO Variables Condicionales: Productor Consumidor :compilar con librerías: lposix4 -lpthread :compilar en linux con librerías: lrt -lpthread 22 // Problema productor - consumidor type item=; var buffer:array[0..n-1] of item entrada, salida: 0..n-1; contador: 0..n entrada=0; salida=0; contador=0; function productor; repeat // produce un item en la variable nuevo while contador==n do no-op buffer[entrada]=nuevo; entrada=(entrada+1)mod n; contador=contador+1; until false end productor Entrada Buffer Salida function consumidor; repeat until false end consumidor while contador==0 do no-op nuevo=buffer[salida]; salida=(salida+1)mod n; contador=contador-1; // consume el item almacenado en nuevo 23

Ejemplo Mutex+Var. Condicionales #define BUFSIZE 8 static int buffer[bufsize] static int entrada = 0; static int salida = 0; Static int contador =0; static pthread_mutex_t candado; static pthread_cond_t producido; static pthread_cond_t consumido; pthread_mutex_init(&candado, NULL); pthread_cond_init(&producido, NULL); pthread_cond_init(&consumido, NULL); // 24 Ejemplo Mutex +V.C. (cont.) //Obtener el siguiente elemento del buffer y colocarlo en *itemp void get_item (int *itemp) pthread_mutex_lock(&candado); while (contador == 0 ) /* si buffer VACIO */ pthread_cond_wait(&producido, & candado); // espera contador=contador-1; *itemp = buffer[salida]; salida = (salida + 1) % BUFSIZE; pthread_cond_signal(&consumido); //señaliza la extracción de datos pthread_mutex_unlock(&candado); return; 25

Ejemplo Mutex +V.C. (cont.) // Colocar un elemento en el buffer void put_item(int item) pthread_mutex_lock(&candado); while (contador == BUFSIZE ) /* si buffer LLENO */ pthread_cond_wait(&consumido, & candado); // espera contador=contador+1; buffer[entrada] = item; entrada = (entrada + 1) % BUFSIZE; pthread_cond_signal(&producido); //señaliza la presencia de datos pthread_mutex_unlock(&candado); return; 26