Practica 2 Hi Los

download Practica 2 Hi Los

of 4

Transcript of Practica 2 Hi Los

  • 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

    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 #include #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 #include #include "pthread.h" #include

  • #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

  • void imprime(int matriz[2][2]) { int i,j; for(i=0;i