10
Procesos e hilos Multiprocesamiento Procesos e hilos en Linux Procesos Hilos INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

procesos_hilos

Embed Size (px)

DESCRIPTION

procesos_hilos linux

Citation preview

Page 1: procesos_hilos

Procesos e hilosMultiprocesamiento

Procesos e hilos en Linux

Procesos

Hilos

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 2: procesos_hilos

Cuando se crean programas complejos es muy fácil identificar que la secuencialidad del programa hace demasiada lenta la ejecución.

Muchas tareas pueden realizarse de forma paralela sin necesidad de esperar otras con las que no tienen dependencias extremas.

Es así como el multiprocesamiento se vuelve una opción para mejorar el tiempo de ejecución de los programas.

Es claro que si sólo existe un procesador no podrá haber multiprocesamiento, pero al menos la ejecución es más selectiva

Multiprocesamiento

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 3: procesos_hilos

Para lograr que un programa ejecute varias cosas a la vez podemos usar procesos o hilos.

Un proceso de unix es cualquier programa en ejecución y es totalmente independiente de otros procesos.

Un proceso tiene su propia zona de memoria y no es posible que otro intervenga sobre sus datos directamente.

Un proceso a su vez puede tener varios hilos de ejecución que están haciendo diferentes cosas.

Procesos e hilos en Linux

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 4: procesos_hilos

Los hilos dentro de un proceso comparten la misma zona de memoria.

Para evitar conflictos de memoria se pueden utilizar semáforos o mutex (Mutual Exclusion).

Según todo esto, un proceso es más costoso de lanzar que un hilo.

Que lanzar? Algunas recomendaciones

Procesos e hilos en Linux (cont.)

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 5: procesos_hilos

Adicional a las librerías de entrada y salida estándar, suelen utilizarse unistd para el manejo de directorios y archivos y sys/types para la búsqueda y ordenamiento de directorios y manipulación de archivos Librerías.

La función fork() es aquella que nos permite crear un nuevo proceso que corre paralelamente al original.

Después de crear los 2 procesos fork returna 0 al proceso hijo y el PID de Linux del hijo al proceso original

Procesos

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 6: procesos_hilos

La función fork() puede retornar -1 en caso de error.

El código de los procesos se agrupa dentro de condicionales (if, switch), según el retorno de la función fork().

Con la función wait() podemos dilatar la ejecución para esperar alguna condición.

La función exit() nos indica que un proceso ha terminado.

Procesos (cont.)

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 7: procesos_hilos

Las siguientes macros son muy útiles para evaluar el estado del hijo.

WIFEXITED(estadoHijo) es 0 si el hijo ha terminado de una manera anormal (caida, matado con un kill, etc). Distinto de 0 si ha terminado porque ha hecho una llamada a la función exit()

WEXITSTATUS(estadoHijo) devuelve el valor que ha pasado el hijo a la función exit(), siempre y cuando la macro anterior indique que la salida ha sido por una llamada a exit().

La comunicación entre padre e hijo puede darse a través de tuberías con la función pipe.

Procesos (cont.)

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 8: procesos_hilos

La función para crear Threads es pthread_create() que admite 4 parámetros:

pthread_t * es un puntero a un identificador de thread.

pthread_attr_t * son los atributos de creación del hilo. Hay varios atributos posibles, como por ejemplo la prioridad.

void *(*)(void *) es el tipo de una función que admite un puntero void * y que devuelve void *. El hilo terminará cuando la función termine o llame a pthread_exit()

void * es el parámetro que se le pasará a la función anterior cuando se ejecute en el hilo aparte

Hilos (Threads)

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 9: procesos_hilos

Cuando compilemos un código que maneje hilos es necesario agregar -lpthread para usar la librería.

Un hilo puede esperar uno o varios hilos para usar un resultado de ellos.

Modificando los atributos en la creación del hilo podemos lograr esperar.

Con la función pthread_attr_setdetachstate() y los valores para el atributo PTHREAD_CREATE_JOINABLE y PTHREAD_CREATE_DETACHED, podemos lograr que efectivamente un hilo espere a otro.

Ver ejemplo.

Hilos (cont.)

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES

Page 10: procesos_hilos

Para acceder sincronizadamente a datos comunes es necesario usar mutex.

Para crear un semáforo que impida el acceso inadecuado usamos la función pthread_mutex_init() con su parámetro pthread_mutex_t * que es el identificado del semáforo.

Para usar el dato que se desea acceder se usa la función pthread_mutex_lock().

Para liberar el dato se usa la función pthread_mutex_unlock().

Ver ejemplo. (para compilarlo es necesario -DMUTEX)

Hilos (cont.)

INFORMATICA II - INGENIERÍA DE TELECOMUNICACIONES