You are on page 1of 6

Pr actica 1: Concurrencia entre procesos

Jos e Luis Quiroz Fabi an

Objetivos
Aprender el concepto de concurrencia. Aplicar el concepto de concurrencia haciendo uso de la funci on fork.

Los objetivos buscados en esta pr actica son los siguientes:

Concurrencia

Un programa ordinario consiste en declaraciones de datos e instrucciones en un lenguaje de programaci on. Las instrucciones son ejecutadas de manera secuencial en una computadora. Un programa concurrente es un conjunto de programas secuenciales los cuales son ejecutados en paralelismo real o bien abstracto (por ejemplo en un sistema multiproceso con un s olo procesador). En esta pr actica estudiaremos el concepto de concurrencia haciendo uso de la funci on fork. Primero mostramos como trabaja dicha funci on. Posteriormente mostramos algunos ejemplos usando fork. Finalmente terminamos con 2 ejercicios.

Creaci on de procesos: fork()

Los procesos de un sistema Linux (y en general en un sistema basado en Unix) tienen una estructura jer arquica, de manera que un proceso (proceso padre) puede crear un nuevo proceso (proceso hijo) y as sucesivamente. Para el desarrollo de aplicaciones con varios procesos, el sistema operativo Linux proporciona la funci on fork(). Cabecera: #include <unistd.h> int fork(void);

Descripci on del comportamiento funci on fork() crea un nuevo proceso exactamente igual (mismo c odigo) al proceso que invoca la funci on. Ambos procesos contin uan su ejecuci on tras la llamada fork(). En caso de error, la funci on devuelve el valor -1 y no se crea el proceso hijo. Si no hubo ning un error, el proceso padre (que realiz o la llamada) obtiene el pid (identicador) del proceso hijo que acaba de nacer, y el proceso hijo recibe el valor 0. Tanto el proceso padre como el proceso hijo contin uan su ejecuci on en la l nea siguiente despu es del llamado fork como se ilustra en la siguiente gura:
Padre
pid_t pid; . . . pid=fork();

Hijo fork()
pid_t pid; . . . pid=fork();

Instruccin a ejecutar Instruccin despus del pid=fork();

Operaciones wait y exit

Debido al parentesco que adquieren un par de procesos cuando uno crea al otro estos se pueden comunicar s olo una vez haciendo uso de las funciones wait y exit. Cabecera: #include <stdlib.h> void exit(int status); Descripci on del comportamiento funci on exit() termina al proceso que la manda a invocar. El valor de status se le regresa al proceso padre para que este pueda conocer como termin o su proceso hijo. Cabecera: #include <stdlib.h> pid_t wait(int status); Descripci on del comportamiento funci on 2

wait() obtiene el estado con el que termina uno de sus procesos hijo. Cuando un proceso ejecuta wait y ninguno de sus procesos hijos ha terminado, este se queda bloqueado. El valor que regresa esta funci on es el pid del proceso hijo que termin o. La funci on wait almacena la informaci on de estado con el que termin o un proceso hijo en la memoria apuntada por status. Esta informaci on puede ser evaluada usando las macros: WIFEXITED(status) es distinto de cero si el hijo termin o normalmente. WEXITSTATUS(status) eval ua los ocho bits menos signicativos del valor de regreso de un hijo que termin o.

5
5.1

Ejemplos usando fork


Creaci on de un padre con su hijo

Este primer ejemplo se muestra como crear un proceso con un s olo hijo. Gr acamente la soluci on la podemos representar como sigue:
Padre

Hijo

La soluci on en c odigo ser a la siguiente:


#include <stdio.h> #include <unistd.h> #include <stdlib.h> /* Entrada: Salida: Descripci on:Creaci on de un proceso padre con un hijo */ main() { int i; switch(fork()){ case 0: printf("Soy el proceso hijo: %d y mi padre es %d \n",getpid(),getppid()); break; case -1:

printf("Error en la creaci on del proceso \n"); exit(0); default: printf("Soy el proceso padre: %d \n",getpid()); } sleep(10); }

5.2

Un proceso padre con N hijos

En este ejemplo se busca generar la siguiente topolog a de procesos:


Padre

....
Hijo 1 Hijo N

Como se muestra en la gura anterior, se tiene un proceso padre con N hijos. La soluci on de este problema se presenta a continuaci on con N = 4.
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #define N 4 /* Entrada: Salida: Descripci on:Creaci on de N hijos de un padre */ main() { int i; pid_t pid;

for(i=0;i<N;i++){ switch(pid=fork()){ case 0: printf("Soy el proceso hijo: %d y mi padre es %d \n",getpid(),getppid()); break; case -1: printf("Error en la creaci on del proceso \n"); exit(0); default:

printf("Soy el proceso padre: %d \n",getpid()); } if(pid==0) break; } sleep(10); }

5.3

Compilaci on y ejecuci on

Los programas ejemplos de esta pr actica se encuentran en la p agina del curso. Despu es de descargarlos para compilarlos y ejecutarlos realice lo siguiente: Compilaci on: Desde un interprete de comandos ejecute gcc fork.c -o fork Ejecuci on: Desde un interprete de comandos ejecute ./fork

Ejercicios

1.- Un proceso padre con N descendientes. Las lineas punteadas representan comunicaci on entre los procesos (un proceso hijo le env a a su padre en que estado termin o).
Padre Hijo 1

....

Hijo N

2.- En este ejercicio el primer proceso (el proceso ra z) le pedir a al usuario un n umero de la forma k= 2n + 1 con 0. En base a este n umero se deber a crear un arbol de procesos el cual presentar a un patr on semejante al de la Figura 1. En esta gura se supone que k=7. Al nal el primer proceso deber a imprimir el n umero total de procesos creados.

Figure 1: Arbol de procesos impares

You might also like