ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Programacion Concurrente Y Paralela

itanium100112 de Marzo de 2014

6.770 Palabras (28 Páginas)332 Visitas

Página 1 de 28

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

...

Descargar como (para miembros actualizados) txt (57 Kb)
Leer 27 páginas más »
Disponible sólo en Clubensayos.com