PROGRAMACIÓN
MULTITHREADING
Sergio Nesmachnow (
[email protected])
Gerardo Ares (
[email protected])
Escuela de Computación de Alto Rendimiento
(ECAR 2012)
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
1
PROGRAMACIÓN BÁSICA
TEMA 2:
PROGRAMACIÓN BÁSICA
PROGRAMACIÓN MULTITHREADING
Escuela de Computación de Alto Rendimiento
(ECAR 2012)
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
2
PROGRAMACIÓN BÁSICA
CONTENIDO
• Introducción threads.
• Modelos de planificación.
• API de programación.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
3
PROGRAMACIÓN BÁSICA
PROGRAMACIÓN PARALELA
INTRODUCCIÓN THREADS
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
4
PROGRAMACIÓN BÁSICA
INTRODUCCIÓN
• En los sistemas tradicionales UNIX los procesos tienen un espacio de
direccionamiento virtual y un hilo (thread) de ejecución.
• Sobre fines de la década de los 80 surgen los primeros sistemas UNIX con
más de un procesador (multiprocesadores).
• Los diseñadores de los sistemas operativos se abocaron al desarrollo de
sistemas escalables para las nuevas arquitecturas de multiprocesadores.
• Surgen nuevos núcleos que tienen varios hilos de ejecución y, además, se
proveen primitivas para permitir que los procesos también tengan varios
hilos de ejecución en el contexto de un proceso.
• Todos los hilos de ejecución comparten el espacio de direccionamiento del
proceso.
• No existe ningún tipo de protección de memoria entre los hilos de un mismo
proceso.
• La programación con threads debe proveer principalmente mecanismos de
sincronización entre los hilos.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
5
PROGRAMACIÓN BÁSICA
INTRODUCCIÓN
• Cada hilo contiene información privada:
– Contador de programa (ip : instruction pointer).
– Pila (Stack).
– Espacio para alojar los registros de la CPU cuando el hilo no está en
ejecución.
– Estado del hilo.
• Comparten:
– Espacio de direccionamiento.
– Archivos abiertos por el proceso.
– Señales.
– Información de conteo (accounting).
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
6
PROGRAMACIÓN BÁSICA
INTRODUCCIÓN
• Beneficios:
– Mejor aprovechamiento de los recursos de procesadores en ambiente
multiprocesadores/multicores.
– Mejor velocidad de comunicación entre hilos de un mismo proceso que
entre procesos independientes del sistema.
– Dividir las aplicaciones en módulos funcionales bajo un mismo
direccionamiento virtual.
• Desventajas:
– Programación más difícil.
– Mayor dificultad de encontrar los errores (debug de la aplicación).
– Limitación en el recurso de memoria.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
7
PROGRAMACIÓN BÁSICA
INTRODUCCIÓN
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
8
PROGRAMACIÓN BÁSICA
PROGRAMACIÓN PARALELA
MODELOS DE PLANIFICACIÓN
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
9
PROGRAMACIÓN BÁSICA
THREADS A NIVEL DEL NÚCLEO
• Los hilos pueden ser soportados a nivel del sistema operativo o a nivel
de usuario.
• Los dos niveles brindan diferentes formas de ejecución de los procesos
multihilados.
• El sistema operativo provee el soporte para la creación, planificación y
administración de los hilos.
• El sistema reconoce cada hilo como una unidad de ejecución distinta a
ser planificada.
• Beneficios:
– Mayor nivel de paralelismo en un sistema multiprocesador ya que
varios hilos de un proceso pueden estar ejecutando en varios
procesadores a la vez.
– Los hilos son independientes, por lo que al bloquearse un hilo de un
proceso (ej.: espera de una entrada/salida o bloqueo por espera de
algún evento) los demás hilos del proceso pueden seguir
ejecutando.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
10
PROGRAMACIÓN BÁSICA
THREADS A NIVEL DE USUARIO
• Son implementados a través de una biblioteca de usuario.
• Es la biblioteca la que provee soporte para la creación, planificación y
administración de los hilos.
• El sistema operativo desconoce la existencia de estos hilos, por lo que
solamente visualiza una unidad de ejecución.
• Beneficios:
– El cambio de contexto es menor frente a tener soporte a nivel de
núcleo.
– Permite otro sistema de planificación ya que viene dado en la
biblioteca de usuario.
• Los dos niveles brindan diferentes formas de ejecución de los procesos
multihilados.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
11
PROGRAMACIÓN BÁSICA
MODELOS DE PLANIFICACIÓN
• Brindar hilos a nivel de núcleo o de usuario permite definir distintos
modelos de planificación:
– Mx1 : Many to One.
– 1x1 : One to One.
– MxN : Many to Many.
MX1
1x1
MXN
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
12
PROGRAMACIÓN BÁSICA
PROGRAMACIÓN PARALELA
API DE PROGRAMACIÓN
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
13
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• Función de creación: pthread_create.
• Estas funciones reciben como parámetro un puntero a función que es
el código del hilo a ejecutar.
• La función a ejecutar tiene un cabezal predefinido.
• La creación de threads generan, dentro del proceso, una estructura de
árbol.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
14
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• pthread_create
• Entrada:
• pthread_t *
Variable que referenciará al thread creado.
• const pthread_attr_t *
Parámetro de inicialización.
• void * (* función_thread) (void *)
Puntero a función donde comenzará a ejecutar el thread creado.
• void *
Parámetro de entrada para el puntero a función.
• Retorno:
• int
Valor de retorno (0 ok, != 0 sino).
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
15
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• El tipo de dato pthread_t permite definir threads.
• Generalmente cuando se tienen un conjunto de threads que realizan
una misma tarea, se los agrupa en arreglos.
pthread_t thrs[MAX_THREADS];
• Esto permite realizar la creación en forma más simple.
for (i = 0; i < MAX_THREADS; i++) {
…
if (rc = pthread_create(&thrs[i],….))
…
}
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
16
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• Si el parámetro pthread_attr_t es nulo, el thread será creado con
los valores por defecto:
Atributo
Valor defecto
Resultado
Scope
PTHREAD_SCOPE_PROCESS
El thread es
configurado como
unbounded
Detachstate PTHREAD_CREATE_JOINABLE El valor de salida del
thread es preservado
luego que este
termina
Stack size
1 MB
Priority
Tamaño del stack
El thread hereda la
prioridad del padre
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
17
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• Se puede crear una variable de tipo pthread_attr_t para crear un
conjunto de thread con alguna característica particular.
int pthread_attr_init(pthread_attr_t *tattr);
pthread_attr_t tattr;
pthread_attr_init(&tattr);
pthread_attr_setstacksize((size_t)1024*1024*100);
pthread_create(&thr,&tattr,...);
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
18
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• El tamaño del stack es creado al crearse el thread y su comienzo es
alineado a un comienzo de página.
• Es importante tener en cuenta que el tamaño del stack es finito y es
más reducido que para un proceso con un único hilo.
• Generalmente al final es adicionada una página sin permisos que
permite que un proceso no acceda al stack de otro.
• Si el proceso accede genera un señal (SIGSEGV).
• Es importante tener cierto el uso que hará del stack cada thread.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
19
PROGRAMACIÓN BÁSICA
CREACIÓN DE THREADS
• Prototipo de la función debe ser el siguiente:
void * func_thread (void *)
• El parámetro es de tipo void *, lo que permite pasar cualquier tipo de
datos a la función.
struct persona {
struct fecha nacimiento;
int sexo;
...
};
struct persona p;
...
pthread_create (…., func_thread, (void *) p)
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
20
PROGRAMACIÓN BÁSICA
TERMINACIÓN DE THREADS
• Función de destrucción: pthread_exit.
• Típicamente es ejecutada cuando un thread finaliza su ejecución y no
tiene nada más para realizar.
• El programador puede asignar un status a la terminación de forma que
algún otro threads (a través de la primitiva pthread_join) obtenga
un valor de la ejecución.
• La función no elimina ningún recurso asignado al proceso que haya sido
pedido por el thread.
• Si el thread main finaliza con un pthread_exit, todos los threads que
hayan sido creados permanecerán activos.
ECAR 2012 – PROGRAMACIÓN MULTITHREADING
Comentarios de: Programación Multithreading (0)
No hay comentarios