Programacion Concurrente Y Paralela
itanium100112 de Marzo de 2014
6.770 Palabras (28 Páginas)332 Visitas
Programación con POSIX Threads
CAPÍTULO II: Programación con
POSIX Threads
II.1. INTRODUCCION A LA PROGRAMACION CON THREADS
Una librería o paquete de threads permite escribir programas con varios puntos
simultáneos de ejecución, sincronizados a través de memoria compartida. Sin embargo
la programación con hilos introduce nuevas dificultades. La programación concurrente
tiene técnicas y problemas que no ocurren en la programación secuencial. Algunos
problemas son sencillos (por ejemplo el ínter bloqueo) pero algunos otros aparecen
como penalizaciones al rendimiento de la aplicación.
Un thread es un concepto sencillo: un simple flujo de control secuencial. Con un
único thread existe en cualquier instante un único punto de ejecución. El programador
no necesita aprender nada nuevo para programar un único thread.
Sin embargo, cuando se tienen múltiples hilos en un programa significa que en
cualquier instante el programa tiene múltiples puntos de ejecución, uno en cada uno de
sus threads. El programador decide cuando y donde crear múltiples threads, ayudándose
de una librería o paquete en tiempo de ejecución.
En un lenguaje de alto nivel, las variables globales son compartidas por todos los
threads del programa, esto es, los hilos leen y escriben en las mismas posiciones de
memoria. El programador es el responsable de emplear los mecanismos de
sincronización de la librería de hilos proporcionada por el lenguaje para garantizar que
la memoria compartida se acceda de forma correcta por los hilos. Las facilidades
proporcionadas por la librería de hilos que se utilice son conocidas como primitivas
ligeras, lo que significa que las primitivas de:
•
•
•
•
Creación
Mantenimiento
Sincronización y
Destrucción
Son suficientemente económicas en esfuerzo para las necesidades del programador.
II.2. EL ESTANDAR POSIX THREADS
Uno de los problemas que se tenían al utilizar múltiples threads de ejecución es
que hasta hace poco no existía un estándar para ello. La extensión POSIX.1c se aprobó
en Junio de 1995. Con la adopción de un estándar POSIX para los hilos, se están
haciendo más comunes las aplicaciones con Threads.
El estándar POSIX Threads significa técnicamente el API Thread especificado
por el estándar formal internacional POSIX 1003.1c-1995. POSIX significa: Portable
Operating System Interface. Todas las fuentes que empleen POSIX 1003.1c, POSIX.1c
o simplemente Pthreads, deben incluir el archivo de encabezado pthread.h con la
directiva:
23
Programación con POSIX Threads
Dr. Mario Rossainz López
#include <pthread.h>
Ya que pthread es una librería POSIX, se podrán portar los programas hechos
con ella a cualquier sistema operativo POSIX que soporte threads. Por tanto, para crear
programas que hagan uso de la librería pthread.h necesitamos en primer lugar la librería
en sí. Esta viene en la mayoría de las distribuciones de LINUX y si no es así, se puede
bajar de la red.
Una vez que tenemos la librería instalada, deberemos compilar el programa y
ligarlo con dicha librería en base al compilador que se utilice. La librería de hilos
POSIX.1c debe ser la última librería especificada en la línea de comandos del
compilador:
CC . . . –lpthread
Por ejemplo, la forma más usual de hacer lo anterior, si estamos usando un
compilador GNU como gcc, es con el comando:
gcc prog_con_hilos.c –o prog_con_hilos_ejecutable -lpthread
En POSIX.1c todos los hilos de un proceso comparten las siguientes características:
•
•
•
•
•
•
•
•
•
•
El espacio de direcciones
El ID del proceso
EL ID del proceso padre
El ID del proceso líder del grupo
Los identificadores de usuario
Los identificadores de grupo
El directorio de trabajo raíz y actual
La máscara de creación de archivos
La tabla de descriptores de archivos
El timer del proceso
Por otro lado, cada hilo tiene la siguiente información específica:
•
•
•
•
•
•
Un identificador de hilo único
La política de planificación y la prioridad
Una variable errno por hilo
Datos específicos por hilo
Gestores de cancelación por hilo
Máscara de señales por hilo
Las operaciones llevadas a cabo sobre un hilo son:
•
•
•
Creación y destrucción
Sincronización entre hilos
Posibilidad de disponer para cada thread memoria local propia
24
Programación con POSIX Threads
•
•
Dr. Mario Rossainz López
Gestión de prioridades entre hilos
Gestión de señales
Como ya se ha mencionado, un proceso puede tener sus propios hilos, es decir,
los threads viven dentro de un proceso pesado, por tanto, si un thread cambia alguna de
las entidades de un proceso, el cambio será visto por todos los threads. La función
main() esta asociada con el hilo principal e inicial del proceso, en otras palabras, la
función main() de cualquier programa que compilemos es un hilo de ejecución.
Cualquier otro hilo de ejecución que queramos se ha de crear explícitamente.
II.2.1. Gestión Básica de Threads
Un thread tiene un identificador (ID), una pila, una prioridad de ejecución y una
dirección de inicio de la ejecución:
ID+Pila+Prioridad+Dir.Incio_Ejecución
Thread
Hacemos referencia a los hilos POSIX mediante un ID de tipo:
pthread_t
Un hilo puede averiguar su ID llamando a:
pthread_self
II.2.2. Espacio de Nombres
A continuación se define la estructura de los tipos de datos del estandar POSIX.1c. Cada
tipo de dato es de la forma: pthread[_object]_t
Existen 8 tipos de datos en el POSIX.1c:
25
Programación con POSIX Threads
TIPO DE DATO
pthread_attr_t
pthread_mutexattr_t
pthread_condattr_t
pthread_mutex_t
pthread_cond_t
pthread_t
pthread_once_t
pthread_key_t
Dr. Mario Rossainz López
DESCRIPCION
Atributo de hilo
Atributo de mutex
Atributo de variable de condición
Mutex (bloqueo con exclusión mutua)
Variable de condición
Hilo (Identificador de hilo o ID)
Ejecución una sola vez
Clave sobre datos específicos de hilo
En cuanto a las funciones estándar del POSIX.1c, éstas tienen la forma:
pthread[_object]_operation[_np│_NP]
donde:
_object: es un tipo (no requerido si es thread –hilo-)
_operation: es un tipo específico de operación
_np │_NP: Es usado para identificar funciones específicas implementadas no portables
Las funciones de threads más comunes en POSIX son:
CLASIFICACION
GESTION DE HILOS
(Existen una serie de
funciones básicas en la
gestión de hilos que
realizan una aplicación
multihilo)
FUNCION
DESCRIPCION
Crea un nuevo hilo de
pthread_create
ejecución
Compara
si
dos
pthread_equal
identificadores de hilo son
el mismo hilo
Finaliza el hilo que realiza
pthread_exit
la llamada
Sincroniza el hilo actual
con la finalización del hilo
pthread_join
específico, devolviendo el
estado del hilo por el que
se espera
Devuelve el identificador
pthread_self
del hilo que realiza la
llamada
Convierte
el
hilo
pthread_detach
especificado
en
independiente
Obtiene la política de
planificación
y
los
pthread_getschedparam
parámetros
del
hilo
especificado
Establece la política de
planificación
y
los
pthread_setschedparam
parámetros
del
hilo
especificado
26
Programación con POSIX Threads
Dr. Mario Rossainz López
pthread_kill
CLASIFICACION
EXCLUSION
MUTUA
(Un mutex es
empleado para
proteger el acceso
compartido a los
recursos)
Envía la señal especificada
al hilo especificado
DESCRIPCION
Inicializa un mutex
pthread_mutex_init
con
los
atributos
especificados
Destruye el mutex
pthread_mutex_destroy
especificado
Adquiere el mutex
pthread_mutex_lock
...