17
Fundamentos de los Sistemas Operativos Rubén García Rodríguez Alexis Quesada Arencibia Eduardo Rodríguez Barrera Francisco J. Santana Pérez José Miguel Santos Espino Curso 2010/2011 Práctica 3 : hilos Grado en Ingeniería Informática

Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

Fundamentos de los Sistemas Operativos

Rubén García Rodríguez Alexis Quesada Arencibia

Eduardo Rodríguez Barrera Francisco J. Santana Pérez José Miguel Santos Espino

Curso 2010/2011

Práctica 3 : hilos!

Grado en Ingeniería Informática

Page 2: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

PROCESOS PESADOS E HILOS

 Las llamadas al sistema fork() y exec() nos permiten crear procesos pesados.

 Cada proceso pesado tiene su propio espacio de memoria y puede estar ejecutando una aplicación diferente al resto de los procesos del sistema.

 Dentro de un proceso pesado pueden existir múltiples procesos ligeros o hilos, que comparten el mismo espacio de memoria del proceso pesado.

2

Page 3: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

LA BIBLIOTECA PTHREADS

 Es una API estándar (POSIX) para manejo de procesos ligeros.

 Escrita para lenguaje C.  Ofrece servicios para:

  Manejo de hilos (creación, sincronización básica…)   Sincronización con cerrojos y variables condición

3

Page 4: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

LA BIBLIOTECA PTHREADS

 Cómo se usa:   En el fuente: #include <pthreads.h>   Al compilar: cc –lpthread …

 Se usan tipos de datos para:   Hilos: pthread_t   Cerrojos: pthread_mutex_t   Variables condición: pthread_cond_t

 Todas las llamadas son de la forma pthread_acción(), o pthread_objeto_acción (…);   Ejemplo: pthread_create (…), pthread_mutex_lock(…)

4

Page 5: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

OPERACIONES BÁSICAS CON HILOS

 pthread_create ( &hilo, atribs, rutina, arg );  pthread_exit ( &resultado );  pthread_cancel (hilo);  pthread_join ( hilo, &resultado );  pthread_yield();

5

Page 6: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

EJEMPLO BÁSICO //rutinaqueejecutaelhilo//siempredebeservoid*f(void*)void*escribe(void*arg){intmax=(int)arg,j;for(j=1;j<=max;j++){puts(“soyunhilo\n”);}returnNULL;}

pthread_thilo;pthread_create(&hilo,NULL,escribe,(void*)20);//elhiloejecutaráescribe(20),deformaconcurrente//usamosconversionesdetipos,porquepthreadsnos//obligaatrabajarconeltipovoid*

6

Page 7: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

ATRIBUTOS

 Algunas operaciones de pthreads llevan un argumento que permite pasar atributos al objeto que se está creando.

 Normalmente pondremos NULL en ese argumento (no vamos a hacer un uso avanzado de la biblioteca).

7

Page 8: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

TERMINACIÓN DE HILOS

 Un hilo termina cuando:   La función que ejecuta retorna   Llama a pthread_exit().   Otro hilo lo cancela con pthread_cancel().   El proceso pesado que lo contiene finaliza - ej. con

exit() o con exec()

 Al finalizar, un hilo devuelve un valor de retorno, siempre de tipo void*

8

Page 9: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

PTHREAD_JOIN

 Muchas veces hace falta esperar a que cierto hilo finalice.

 Ojo, si la rutina main() termina, todos los hilos activos se cancelan automáticamente (no se espera a que los hilos acaben).   Hay que esperar explícitamente por los otros hilos

 pthread_join(&h,&r) espera hasta que el hilo h haya finalizado. En “r” deposita el valor de salida del hilo h.

9

Page 10: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

CERROJOS Y VARIABLES CONDICIÓN

 Proporcionan sincronización con el modelo de monitores.

 pthread_mutex_t: cerrojos para regular el acceso a recursos en exclusión mutua

 pthread_cond_t: variables condición

10

Page 11: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

CERROJOS (MUTEX)

 Tipo pthread_mutex_t  pthread_mutex_init ( &mutex, &atributos );

  También mutex=PTHREAD_MUTEX_INITIALIZER;

  thread_mutex_destroy ( &mutex );  pthread_mutex_lock (&mutex);

  Adquiere el cerrojo

 pthread_mutex_unlock (&mutex);   Libera el cerrojo

  result = pthread_mutex_trylock (&mutex);   Intenta adquirir el cerrojo; si lo adquiere, devuelve

cero; si no, devuelve un valor distinto de cero 11

Page 12: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

CERROJOS: EJEMPLOS

pthread_mutex_tcerrojo;

pthread_mutex_init(&cerrojo,NULL);

//formaalternativa

Pthread_mutex_totro=PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_lock(&cerrojo);

//accesoaunrecursoenexclusiónmutua

pthread_mutex_unlock(&cerrojo);

if(pthread_mutex_trylock(&cerrojo)==0){

//accedealrecurso

pthread_mutex_unlock(&cerrojo);

}

12

Page 13: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

VARIABLES CONDICIÓN

 Siempre asociadas a un cerrojo  Semántica Mesa  pthread_cond_wait (&cond, &mutex)  pthread_cond_signal (&cond)  pthread_cond_broadcast (&cond)

13

Page 14: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

VARIABLES CONDICIÓN: CREACIÓN

 Tipo pthread_cond_t  Creación:

  pthread_cond_init ( &cond, &atributos );   También: cond=PTHREAD_COND_INITIALIZER;

 Destrucción:   pthread_cond_destroy (&cond);

14

Page 15: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

VARIABLES CONDICIÓN: BLOQUEOS

 pthread_cond_wait ( &cond, &mutex)   Libera el cerrojo mutex   Bloquea al hilo   Cuando el hilo se desbloquea, trata de recuperar el

mutex

  result = pthread_cond_timedwait (&cond,&mutex,&abstime)   Como “wait”, pero con un plazo máximo de espera

 pthread_cond_signal (&cond)   Escoge un hilo bloqueado en cond y lo desbloquea

 pthread_cond_broadcast (&cond)   Desbloquea a todos los hilos bloqueados en cond

15

Page 16: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

VARIABLES CONDICIÓN: CASO DE USO TÍPICO

16

pthread_mutex_lock(&mutex); // espera condicional while (! condición) { pthread_cond_wait(&cond, &mutex); } // … más acciones pthread_mutex_unlock(&mutex);

pthread_mutex_lock(&mutex);

// ... // Se produce la condición

pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mutex);

Page 17: Fundamentos de los Sistemas Operativossopa.dis.ulpgc.es/fso/actividades/actividad3/Practica3... · 2011-07-19 · ACTIVIDAD 3: PLAN DE TRABAJO Tarea 1: sincronización básica con

ACTIVIDAD 3: PLAN DE TRABAJO

 Tarea 1: sincronización básica con hilos   Crear varias series de hilos que escriban letras por

pantalla, y esperar a que una serie finalice por completo antes de empezar con la siguiente.

 Tarea 2: lectores y escritores   Arreglar el acceso a una base de datos ficticia, de

manera que no se corrompan los datos. Se pide implementarla como una sección crítica; y a continuación tratarla como un problema de lectores y escritores.

 Tarea 3: problema de sincronización (opcional)   Se trata de implementar un problema clásico de

sincronización entre procesos. 17