Gestion de Hilos
Gestion de Hilos
Gestion de Hilos
ECP 1 de 9
I.
II.
OBJETIVO DE LA PRACTICA Al finalizar la presente prctica, el estudiante: 1. Conoce la implementacin y gestin de hilos en el sistema operativo Linux. 2. Escribe aplicaciones que hagan uso adecuado de hilos utilizando el lenguaje de programacin C en Linux
III.
TRABAJO PREPARATORIO. Para un trabajo con mejores resultados, es imprescindible que el estudiante: 1. Revise los conceptos de procesos e hilos. 2. Haya resuelto los ejercicios propuestos de la gua de gestin de procesos
IV.
MATERIALES Para el desarrollo de la presente prctica es necesario contar con: 1. Computador con arquitectura x86. 2. Sistema operativo Linux instalado en el computador o en su defecto un liveCD o liveUSB que incluya el compilador GCC y un editor de texto pre instalado. 3. Manual de programacin del lenguaje de programacin C para Linux.
V.
MARCO TEORICO
ATRIBUTOS DE UN HILO Crear atributos de un proceso ligero Este servicio permite iniciar un objeto atributo que se puede utilizar para crear nuevos hilos. El prototipo de esta funcin es:
int pthread_attr_init ( pthread_attr_t *attr );
Destruir atributos Destruye el objeto de tipo atributo pasado como argumento a la misma. Su prototipo es:
int pthread_attr_destroy ( pthread_attr_t * attr );
CREACION, IDENTIFICACION Y TERMINACION DE HILOS. Crear un hilo El prototipo de esta funcin es el siguiente:
int pthread_create ( pthread_t *thread, pthread_attr_r *attr, void*(*start_routine) (void*), void *arg
);
COMPILAR UN PROGRAMA QUE UTILIZA HILOS. Para compilar un programa que utiliza hilos, debemos utilizar el modificador pthread del GCC. As para compilar el programa llamado ejemplo.c que utiliza hilos, la orden de compilacin deber ser: gcc o ejemplo ejemplo.c pthread
VI.
TRABAJO DE LABORATORIO.
1. Escriba una aplicacin que cree un hilo que imprima un carcter por consola
Solucin
// // // // // Nombre Objetivo Autor FCreacion FModificacion : : : : : creaHilo.c crea un hilo que imprime el carcter X Edwin Carrasco 06/12/2007 ---
#include<pthread.h> #include<stdio.h> void imprime_x(void ) { while(1) { fputc('X',stderr); } pthread_exit(0); } main() { //Variables pthread_t hilo; int iret; //Creamos un hilo que ejecuta el proceso imprime_x() iret = pthread_create(&hilo, NULL,(void*) imprime_x, NULL);
Solucin
// // // // // Nombre Objetivo Autor FCreacion FModificacion : : : : : hilosDependientes.c crea dos hilos dependientes Edwin Carrasco 06/12/2007
#include<pthread.h> #include<stdio.h>
main() { pthread_t h1, h2; int iret1, iret2; iret1 = pthread_create(&h1, NULL,(void*) func, NULL); iret2 = pthread_create(&h2, NULL, (void*)func, NULL); printf("El hilo principal %d continua ejecutando\n",getpid()); pthread_join(h1, NULL); pthread_join(h2, NULL); exit(0); }
3. Escriba un programa que cree dos hilos, a los cuales les debe pasar como parmetros el carcter que cada uno debe imprimir, as como el nmero de veces que imprimirn el mismo
Solucin
// Nombre // Objetivo // Autor // FCreacion // FModificacion : : : : : pasoParametros.c muestra el mecanismo de paso de parmetros a hilos Edwin Carrasco 06/12/2007
#include <pthread.h> #include <stdio.h> /* Parametros para funcion de impresion. */ struct char_print_parms { char caracter; /* El caracter a imprimir. */ int cuenta; /* El numero de veces a imprimir. */ };
/* Imprime un numero de caracteres en stderr, segun se especifica en PARAMETROS, que es un apuntador a la estructura char_print_parms. */ void* char_print (void* parametros) { /*Hace un cast sobre el apuntador al tipo adecuado. */ struct char_print_parms* p = (struct char_print_parms*) parametros; int i; for (i = 0; i < p->cuenta; ++i) { fputc (p->caracter, stderr); } return NULL; } /*El programa main. */ int main () { pthread_t hilo1_id; pthread_t hilo2_id; struct char_print_parms hilo1_args; struct char_print_parms hilo2_args;
/*Crea un nuevo hilo para imprimir 30,000 'X's. */ hilo1_args.caracter = 'X'; hilo1_args.cuenta = 30000; pthread_create (&hilo1_id, NULL, &char_print, &hilo1_args); /*Crea un nuevo hilo para imprimir 20,000 'O's. */ hilo2_args.caracter = 'O'; hilo2_args.cuenta = 20000; pthread_create (&hilo2_id, NULL, &char_print, &hilo2_args); /*Nos aseguramos que elprimer hilo haya terminado */ pthread_join(hilo1_id, NULL); /*Nos aseguramos que el segundo hilo haya terminado */ pthread_join(hilo2_id, NULL); /*Podemos salir de forma segura */ return 0; }
4. Escriba un programa que cree un hilo. El hilo debe devolver el N simo nmero primo. Este valor ser, mostrado por el proceso principal
Solucin
// // // // // Nombre Objetivo Autor FCreacion FModificacion : : : : : primo.c calcula el N-esimo nmero primo Edwin Carrasco 06/12/2007
#include <pthread.h> #include <stdio.h> /*Calcula numeros primos sucesivos. Devuelve el N-esimo numero primo, en donde N es el valor apuntado por *arg. */ void* calcula_primo (void* arg) { int candidato = 2; int n = *((int*) arg); while (true) { int factor; int es_primo = 1;
/*Prueba la primalidad mediante divisiones sucesivas. */ for (factor = 2; factor < candidato; ++factor) { if (candidato % factor == 0) { es_primo = 0; break; } } /*Es el numero primo que estamos buscando? */ if (es_primo) { if (--n == 0) { /*Devuelve el numero primo deseado como el valor de retorno del hilo. */ return (void*) candidato; } } ++candidato; } return NULL; }
int main () { pthread_t hilo; int que_primo = 5000; int primo; /*Inicia el hilo procesador, hasta el 5,000-esimo numero primo.*/ pthread_create (&hilo, NULL, &calcula_primo, &que_primo); /*Hacer algun otro trabajo aqui... */ printf("Estoy esperando\n"); /*Esperar que termine el hilo de numeros primos, y tomar el resultado.*/ pthread_join (hilo, (void*) &primo); /* Imprimir el primo mayor calculado. */ printf("El %d-esimo numero primo es %d.\n", que_primo, primo); return 0; }
VII.
PRACTICAS DE LABORATORIO 1. Escriba una aplicacin que cree un hilo para hallar el ensimo nmero perfecto, otro para calcular el isimo trmino de la serie de Fibonacci, otro para hallar la suma de los resultados devueltos por los primeros hilos. El programa principal debe mostrar la salida de cada hilo. 2. Escriba un programa que ordene un arreglo de caracteres utilizando el algoritmo Merge utilizando hilos para cada particin del arreglo. El algoritmo se ilustra en el siguiente grfico tomado de www.wikipedia.org
VIII.
BIBLIOGRAFIA LIBROS [L01]. Carretero J, et. al Sistemas Operativos. Una Visin Aplicada, 1ra edicin. Editorial McGraw Hill 2001 [L02]. Deitel, H Operating Systems. Editorial Addison Wesley 1990. [L03]. Deitel & Deitel, Como Programar En C/C++. Editorial Prentice Hall 2da edicin. [L04]. Marquez, M. UNIX. Programacin Avanzada. 2da edicin. Editorial Alfaomega 2001. [L05]. Perez F, et. al. Problemas De Sistemas Operativos. De La Base Al Diseo. 2da edicin. Editorial McGraw Hill, 2003. [L06]. Stallings, W. Sistemas Operativos. 5ta edicin. Editorial Prentice Hall 2005
[L07]. Tanenbaum, A. Sistemas Operativos. Diseo e Implementacin. 3ra edicin. Editorial Prentice Hall 2006. [L08]. Tanenbaum, A. Sistemas Operativos Modernos. 2da edicin. Editorial Prentice Hall 2001.
REFERENCIAS WEB [W01]. Carrasco E. http://www.uandina.edu.pe/dais/ecarrasco. Sitio web de la asignatura. [W02]. http://www.llnl.gov/computing/tutorials/pthreads/. Tutorial de programacin con hilos. [W03]. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html. Tutorial de programacin con hilos. [W04]. http://www.humanfactor.com/pthreads/. Tutorial de programacin con hilos. [W05]. http://sourceware.org/pthreads-win32/. Tutorial de programacin con hilos en el sistema operativo Windows [W06]. http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html. Tutorial de programacin con hilos. [W07]. http://www.ibm.com/developerworks/linux/library/l-posix1.html. Tutorial de programacin con hilos. [W08]. http://pages.cs.wisc.edu/~lhl/cs740/assignments/references/pthreads.ps. Tutorial de programacin con hilos. [W09]. http://www.dmoz.org/Computers/Programming/Threads/POSIX/. Tutorial de programacin con hilos. B. POSIX Threads Programming. [W10]. Barney, https://computing.llnl.gov/tutorials/pthreads/index.html. Tutorial de programacin con hilos.