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
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
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
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
OPERACIONES BÁSICAS CON HILOS
pthread_create ( &hilo, atribs, rutina, arg ); pthread_exit ( &resultado ); pthread_cancel (hilo); pthread_join ( hilo, &resultado ); pthread_yield();
5
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
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
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
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
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
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
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
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
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
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
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);
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