ensayo
6 de febrero de 2012
En esta sesi´n vamos a escribir programas en lenguaje C que utilicen hilos y procesos para comparar
o
el rendimiento del sistema ante la gesti´n de unos y otros. En concreto, mediremos el tiempo medio de
o
creaci´n de hilos y el de creaci´n de procesos y se comparar´n. Para ello se va a utilizar el compilador
o
o
a
de C de GNU gcc que est´instalado en los equipos del laboratorio.
a
1.
Creaci´n de procesos en Linux
o
Para poder iniciar en una m´quina GNU/Linux, procesos adicionales al que se est´ ejecutando, se
a
a
emplea el comando fork cuya signatura es la siguiente:
pid_t fork ( void ) ;
Su definici´n se encuentra en los archivos de cabecera sys/types.h y unistd.h. En unistd.h est´ deo
a
a
finida la funci´n y entypes.h el tipo pid t que no es m´s que un identificador de proceso linux PID.
o
La ejecuci´n de fork crea un proceso hijo que se diferencia de su creador unicamente por su PID y
o
´
por su PPID (Parent PID, identificador del proceso padre del proceso actual).
Tras la creaci´n del proceso hijo ambos procesos son ejecutados concurrentemente, es decir, tenemos
o
dos procesos ejecutando elc´digo del programa. La diferencia entre los dos se haya en lo que devuelve la
o
llamada al fork. En cada uno de esos procesos este valor es diferente, para el proceso padre fork devuelve
el PID del proceso reci´n creado y para el proceso reci´n creado fork devuelve 0, adem´s el PPID del
e
e
a
proceso reci´n creado es el PID del proceso padre.
e
Para conocer el PID y el PPID de un proceso sepueden emplear las funciones getpid y getppid
respectivamente. Nuevamente estas funciones est´n definidas en el archivo de cabecera unistd.h con la
a
siguiente signatura:
pid_t getpid ( void ) ;
pid_t getppid ( void ) ;
El listado1 contiene un ejemplo de uso de fork:
# include < sys / types .h >
# include < unistd .h >
# include < stdio .h >
int main ( int argc , char * argv []) {
pid_tpid ;
pid = fork () ;
if ( pid == -1) {
printf ( " Fallo en fork \ n " ) ;
return -1;
} else
if (! pid ) {
printf ( " Proceso hijo : PID %d \ n " , getpid () ) ;
} else {
printf ( " Proceso padre : PID %d \ n " , getpid () ) ;
}
return 0;
}
Listado 1: Ejemplo de creaci´n de procesos en c
o
1
Ejercicio 1 Escribe el programa anterior y comprueba su funcionamiento.
2.pthread.lib: La librer´ de hilos POSIX de Linux
ıa
Para escribir programas multihilo en C podemos utilizar la librer´ pthread que implementa el stanıa
dard POSIX (Portable Operating System Interface). Para ello en nuestro programa debemos incluir
algunas cabeceras y a la hora de compilar es necesario linkar el programa con la librer´ Veamos con un
ıa.
ejemplo lo que estamos diciendo. Hagamosun programa que escriba “Hola Mundo” utilizando para ello
dos hilos distintos, uno para la palabra Hola y otro para la palabra Mundo. Adem´s, hagamos que cada
a
palabra se escriba muy lentamente para ver bien el efecto.
# include
# include
# include
# include
# include
< stdio .h >
< stdlib .h >
< string .h >
< unistd .h >
< pthread . h >
void * hola ( void * arg ) {
char * msg =" Hola " ;
int i ;
for ( i = 0 ; i < strlen ( msg ) ; i ++ ) {
printf ( " %c " , msg [ i ]) ;
fflush ( stdout ) ;
usleep (1000000) ;
}
return NULL ;
}
void * mundo ( void * arg ) {
char * msg = " mundo " ;
int i ;
for ( i = 0 ; i < strlen ( msg ) ; i ++ ) {
printf ( " %c " , msg [ i ]) ;
fflush ( stdout ) ;
usleep (1000000) ;
}
return NULL ;
}
int main ( int argc , char *argv []) {
pthread_t h1 ;
pthread_t h2 ;
p t h r e a d _ c r e a t e (& h1 , NULL , hola , NULL ) ;
p t h r e a d _ c r e a t e (& h2 , NULL , mundo , NULL ) ;
printf ( " Fin \ n " ) ;
}
Listado 2: Ejemplo de creaci´n de hilos en c
o
como se puede ver en el listado 2, hemos escrito una funci´n para cada tarea que queremos realizar
o
en un hilo. El estandard POSIX impone que toda...
Regístrate para leer el documento completo.