Vous êtes sur la page 1sur 9
UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 1 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 1 de 9

I.

TEMA: GESTION DE HILOS

II.

OBJETIVO DE LA PRACTICA

Al finalizar la presente práctica, el estudiante:

1. Conoce la implementación y gestión de hilos en el sistema operativo Linux.

2. Escribe aplicaciones que hagan uso adecuado de hilos utilizando el lenguaje de programación 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 guía de gestión de procesos

IV.

MATERIALES

Para el desarrollo de la presente práctica 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 programación del lenguaje de programación C para Linux.

V.

MARCO TEORICO

SERVICIOS POSIX PARA LA GESTION DE HILOS

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 función 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 );

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 2 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 2 de 9

Asignar el tamaño de la pila El prototipo de esta función es:

int pthread_attr_setstacksize ( pthread_attr_t *attr, int stacksize

);

Obtener el tamaño de la pila El prototipo de esta función es:

int pthread_attr_getstacksize ( pthread_attr_t *attr, int stacksize

);

Establecer el estado de terminación El prototipo de esta función es:

int pthread_attr_setdetachstate (pthread_attr_t *attr, int detachstate

);

Obtener el estado de terminación El prototipo de esta función es:

int pthread_attr_getdetachstate (pthread_attr_t *attr, int *detachstate

);

CREACION, IDENTIFICACION Y TERMINACION DE HILOS.

Crear un hilo El prototipo de esta función es el siguiente:

int pthread_create (

pthread_t *thread, pthread_attr_r *attr, void*(*start_routine) (void*), void *arg

);

Obtener el identificador de un hilo El prototipo de esta función es:

pthread_t pthread_self (

void );

Esperar la terminación de un hilo El prototipo de esta función es:

int pthread_join ( pthread thid,

void

**value

);

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 3 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 3 de 9

Finalizar la ejecución de un hilo El prototipo de esta función es:

int pthread_exit ( void *value

);

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 compilación deberá ser:

gcc –o ejemplo ejemplo.c –pthread

VI. TRABAJO DE LABORATORIO.

1. Escriba una aplicación que cree un hilo que imprima un carácter por consola

Solución

// Nombre

:

creaHilo.c

// Objetivo

:

crea un hilo que imprime el carácter X

// Autor

:

Edwin Carrasco

// FCreacion

:

06/12/2007

// FModificacion

:

---

#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);

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 4 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 4 de 9

//Este proceso imprime el caracter '0'

while(1)

{

fputc('O',stderr);

}

exit(0);

}

2. Escriba un programa que cree dos hilos no independientes.

Solución

// Nombre

:

hilosDependientes.c

// Objetivo

:

crea dos hilos dependientes

// Autor

:

Edwin Carrasco

// FCreacion

:

06/12/2007

// FModificacion

:

#include<pthread.h>

#include<stdio.h>

void func(void)

{

printf( "Soy el hilo %d \n", pthread_self());

pthread_exit(0);

}

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);

}

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 5 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 5 de 9

3. Escriba un programa que cree dos hilos, a los cuales les debe pasar como parámetros el carácter que cada uno debe imprimir, así como el número de veces que imprimirán el mismo

Solución

// Nombre

:

pasoParametros.c

// Objetivo

:

muestra el mecanismo de paso de

// Autor

:

parámetros a hilos Edwin Carrasco

// FCreacion

:

06/12/2007

// FModificacion

:

#include <pthread.h> #include <stdio.h>

/* Parametros para funcion de impresion. */ struct char_print_parms

{

 

char caracter; int cuenta;

/* El caracter a imprimir. */ /* 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;

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 6 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 6 de 9

/*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 número primo. Este valor será, mostrado por el proceso principal

Solución

// Nombre

:

primo.c

// Objetivo

:

calcula el N-esimo número primo

// Autor

:

Edwin Carrasco

// FCreacion

:

06/12/2007

// FModificacion

:

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

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 7 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 7 de 9

/*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;

}

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 8 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 8 de 9

VII. PRACTICAS DE LABORATORIO 1. Escriba una aplicación que cree un hilo para hallar el
VII.
PRACTICAS DE LABORATORIO
1. Escriba una aplicación que cree un hilo para hallar el enésimo número perfecto, otro para
calcular el iésimo término 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 partición del arreglo. El algoritmo se ilustra en el siguiente
gráfico tomado de www.wikipedia.org
VIII.
BIBLIOGRAFIA

LIBROS

[L01].

Carretero J, et. al “Sistemas Operativos. Una Visión Aplicada”, 1ra edición. Editorial

[L02].

McGraw Hill 2001 Deitel, H “Operating Systems”. Editorial Addison Wesley 1990.

[L03].

Deitel & Deitel, “Como Programar En C/C++”. Editorial Prentice Hall 2da edición.

[L04]. Marquez, M. “UNIX. Programación Avanzada”. 2da edición. Editorial Alfaomega

2001.

[L05]. Perez F, et. al. “Problemas De Sistemas Operativos. De La Base Al Diseño”. 2da edición. Editorial McGraw Hill, 2003.

Stallings, W. “Sistemas Operativos”. 5ta edición. Editorial Prentice Hall 2005

[L06].

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 9 de 9

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 9 de 9

[L07]. Tanenbaum, A. “Sistemas Operativos. Diseño e Implementación”. 3ra edición. Editorial Prentice Hall 2006. [L08]. Tanenbaum, A. “Sistemas Operativos Modernos”. 2da edición. 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/.

hilos. [W03]. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html. Tutorial de programación con hilos. [W04]. http://www.humanfactor.com/pthreads/. Tutorial de programación con hilos.

con

Tutorial

de

programación

[W05]. http://sourceware.org/pthreads-win32/. Tutorial de programación con hilos en el sistema operativo Windows [W06]. http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html. Tutorial de programación con hilos.

[W07]. http://www.ibm.com/developerworks/linux/library/l-posix1.html. programación con hilos.

Tutorial

de

[W08]. http://pages.cs.wisc.edu/~lhl/cs740/assignments/references/pthreads.ps.

Tutorial

de

programación con hilos. [W09]. http://www.dmoz.org/Computers/Programming/Threads/POSIX/. programación con hilos.

Tutorial

de

[W10]. Barney,

Threads Programming”.

https://computing.llnl.gov/tutorials/pthreads/index.html. Tutorial de programación con hilos.

B.

POSIX