Sei sulla pagina 1di 4

Sistemas Operativos

Practica 2: procesos ligeros (hilos).




Objetivos:

El beneficio de crear aplicaciones con hilos.
Disear estructuras de concurrencia de acuerdo a las necesidades de las aplicaciones.

Introduccin

Un hilo o proceso ligero forma parte de un proceso, y es una unidad bsica de utilizacin del CPU,
cuya caracterstica es que comparte una misma regin de memoria con otros hilos.

Un proceso puede tener uno o ms hilos. Cuando un proceso tiene un solo hilo decimos que es un
proceso monohilo. Si el proceso tiene ms de un hilo, se dice que es un proceso multihilado.
Actualmente la mayora de las aplicaciones tienden a ser multihiladas, con la finalidad de aumentar su
rendimiento o bien para incorporar funciones sin perder su rendimiento actual. Esto cada vez es ms
evidente con la utilizacin de procesadores con ms de un ncleo (multicore) debido a que una
aplicacin multihilada puede explotar eficientemente este tipo de procesadores.

En esta prctica estudiaremos como implementar aplicaciones multihiladas en lenguaje C. Como
primera parte implementaremos un hola mundo multihilado. Posteriormente resolveremos la suma
de matrices usando hilos. Finalmente se revisarn un conjunto de llamados del sistema sobre
archivos para utilizarlos en uno de los ejercicios propuestos.

Hilos en lenguaje C

Usando la librera pthread.h tenemos diferentes llamados al sistema para trabajar con hilos. Los
principales son:

#include <pthread.h>

int pthread_create (pthread_t *tid, const pthread_attr_t *attr, void
*(*star_routine)(void *), void *arg);
void pthread_exit (void *value_ptr);
int pthread_join (pthread_t thread, void **value_ptr);
pthread_t pthread_self (void);

Los hilos se crean con la funcin pthread_create, y son colocados en una cola de hilos listos para su
ejecucin. A continuacin se explica sus argumentos de este llamado al sistema.

pthread_t *tid Indica que se debe colocar la direccin de una variable de tipo pthread_t, para
almacenar en ella el identificador del hilo si es que la llamada tuvo xito. En caso que se
desee crear varios hilos, puede emplear un arreglo para almacenar los identificadores.
const pthread attr_t *attr Los atributos del hilo se encapsulan en el objeto atributo al que
apunta attr. Si attr es NULL, el nuevo hilo tendr los atributos por omisin.
void *(*star_routine)(void *) El tercer argumento, start_routine es el nombre de una funcin
a la que el hilo invoca cuando inicia su ejecucin. La funcin debe devolver un puntero sin
tipo (void *) y solo puede tener un argumento que debe ser un puntero sin tipo. Esto no es
una limitacin, sino una ventaja, ya que se puede emplear como argumento cualquier tipo y
despus la funcin recuperar el tipo haciendo un cast.
void *arg El ltimo argumento es la direccin de alguna variable que se desea pasar como
parmetro de la funcin.

La funcin pthread_exit termina el hilo que la invoca. El valor del argumento value_ptr queda
disponible para pthread_join, si esta tuvo xito. Sin embargo, el value_ptr en pthread_exit debe
apuntar a datos que existan despus que el hilo ha terminado, as que no puede asignarse como
datos locales automticos para el hilo que est terminando. La funcin pthread_exit invoca a
controladores de terminacin de hilos, cosa que return no hace.

La funcin pthread_join suspende la ejecucin del hilo invocador hasta que el hilo identificado con
thread termine, ya sea porque llamo a pthread_exit o porque fue cancelado. Esta llamada es similar a
waitpid en el nivel de procesos. Si value_ptr no es NULL, entonces el valor retornado por thread es
almacenado en la ubicacin apuntada por value_ptr.

La funcin pthread_self devuelve el identificador del hilo que esta invocando la funcin.

Ejemplo de Hola mundo con hilos

#include <stdio.h>
#include <stdlib.h>
#include "pthread.h"
void imprime();
int main()
{
pthread_t hilo1;
pthread_t hilo2;
if((pthread_create( &hilo1, NULL,(void *)&imprime,NULL))!=0)
{
printf("Error en la creacin de hilos\n");
exit(0);
}
if((pthread_create( &hilo1, NULL,(void *)&imprime,NULL))!=0)
{
printf("Error en la creacin de hilos\n");
exit(0);
}
pthread_join(hilo1,NULL);
pthread_join(hilo2,NULL);
return 0;
}

void imprime()
{
printf("Hola mundo\n");
sleep(100);
pthread_exit(NULL);
}

Ejemplo de suma de matrices con hilos

#include <stdio.h>
#include <stdlib.h>
#include "pthread.h"
#include <time.h>
#define TAM 2

void imprime(int matriz[2][2]);
void suma(void *id);
void inicializa_matriz(int modulo,int matriz[2][2]);
int matA[TAM][TAM];
int matB[TAM][TAM];
int matC[TAM][TAM];

int main()
{
pthread_t hilo1;
pthread_t hilo2;
int id_thread0=0;
int id_thread1=1;
srand(time(NULL));
inicializa_matriz(3,matA);
inicializa_matriz(3,matB);
inicializa_matriz(1,matC);
imprime(matA);
imprime(matB);
if ((pthread_create( &hilo1, NULL,(void *)&suma,(void
*)&id_thread0))!=0)
{
printf("Error en la creacin de hilos\n");
exit(0);
}
if((pthread_create( &hilo1, NULL,(void *)&suma,(void
*)&id_thread1))!=0)
{
printf("Error en la creacin de hilos\n");
exit(0);
}
pthread_join(hilo1,NULL);
pthread_join(hilo2,NULL);
imprime(matC);
return 0;
}

void inicializa_matriz(int modulo,int matriz[2][2])
{
int i,j;
for(i=0;i<TAM;i++)
for(j=0;j<TAM;j++)
matriz[i][j]=rand()%modulo;
}

void suma(void *id)
{
int i;
int id_thread=*((int *)(id));
for(i=0;i<TAM;i++)
matC[id_thread][i]=matA[id_thread][i]+matB[id_thread][i];
pthread_exit(NULL);
}

void imprime(int matriz[2][2])
{
int i,j;
for(i=0;i<TAM;i++)
{
for(j=0;j<TAM;j++)
printf("%d ",matriz[i][j]);
printf("\n");
}
printf("\n");
}

Ejercicios

Desarrollo la suma de matrices para un N dado por el usuario. Se deber generar un hilo para
que realice los clculos de la suma de cada rengln de la matriz resultante.
Desarrolle el producto de matrices mediante hilos. Se generar un hilo por cada rengln de la
matriz resultante.

En ambos programas el tamao de las matrices se le pedirn al usuario (Usar matrices dinmicas).

Potrebbero piacerti anche