Está en la página 1de 4

TRABAJO DE SISTEMAS OPERATIVOS

Procesos e Hilos
1.1. Procesos
1. Observa el siguiente código y escribe la jerarquía de procesos resultante.
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char ∗argv[ ]) {

int num;
pid t pid;

for (num= 0; num< 3; num++) {
pid= fork();
printf ("Soy el proceso de PID %d y mi padre tiene%d de PID.\n",
getpid(), getppid());
if (pid!= 0)
break;
srandom(getpid());
sleep (random() %3);
}
if (pid!= 0)
printf ("Fin del proceso de PID %d.\n", wait (NULL));

return 0;
}
Ahora compila y ejecuta el código para comprobarlo. Contesta a las siguientes
preguntas:
¿Por qué aparecen mensajes repetidos?
Presta atención al orden de terminación de los procesos,
• ¿Qué observas?
• ¿Por qué?

2. Observa el siguiente código y escribe la jerarquía de procesos resultante.
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char ∗argv[ ]) {

int num;
pid _t pid;
srandom(getpid());
for (num= 0; num< 3; num++) {
pid= fork();
printf ("Soy el proceso de PID %d y mi padre tiene%d de PID.\n",
getpid(), getppid());
if (pid== 0)
break;
}
if (pid== 0)
sleep(random() %5);
else
for (num= 0; num< 3; num++)
printf ("Fin del proceso de PID %d.\n", wait (NULL));
return 0;
}

} 6. i< 2. num< 2. num++) { nuevo= fork(). cont1++) { pid= fork(). /∗ 1 ∗/ if (nuevo!= 0) { nuevo= fork().h> #include <sys/wait. /∗ 1 ∗/ if (nuevo== 0) break. char ∗argv[ ]) { int cont1. /∗ 3 ∗/ printf("Soy el proceso %d y mi padre es%d\n". "ls". Después. NULL). if ((num== n) && (nuevo== 0)) execlp ("ls".h> #include <stdlib. Dibuja la jerarquía de procesos que resulta de la ejecución del siguiente código. compila y ejecuta el código para comprobarlo (deberás añadir llamadas al sistema getpid. Indica para cada nuevo proceso el valor de las variables i y j en el momento de su creación. Estudia el siguiente código y escribe la jerarquía de procesos resultante. #include <sys/types. getppid y wait para conseguirlo). cont1< L1. cont2++) { for (cont1= 0. /∗ 2 ∗/ break. /∗ 2 ∗/ nuevo= fork(). j< i+2. j++) { nuevo= fork(). "-l". for (cont2= 0. } nuevo= fork().h> #include <unistd. Presta atención al orden de terminación de los procesos. i++) { pid= getpid(). 4. ¿qué observas? ¿Por qué? 3. Considerando el siguiente fragmento de código: for (num= 1. pid t pid. num<= n. cont2< L2. .Ahora compila y ejecuta el código para comprobarlo. getppid()). 5. } } if (pid!= getpid()) break. Dibuja la estructura del árbol de procesos que obtendríamos al ejecutar el siguiente fragmento de código: for (num= 0. cont2. } if (pid!= 0) break. getpid(). if (pid== 0) break.h> #define L1 2 #define L2 3 int main (int argc. for (j= 0. b) Indica en qué procesos se ha cambiado la imagen del proceso usando la función execlp. num++) { nuevo= fork(). } a) Dibuja la jerarquía de procesos generada cuando se ejecuta y n es 3. for (i= 0.h> #include <stdio.

/∗ profundidad ∗/ anchura= atoi(argv[2]).2 se muestra un ejemplo. haz que se informe de los tiempos de ejecución de las aplicaciones xload y kcalc que se generen así como del tiempo total de ejecución. por ejemplo. Escribe un programa que genere un árbol de procesos similar al que aparece en la figura 1. NULL). return 0. int prof. . "kcalc". i< 2. En el ejemplo. sleep (2). de la siguiente manera: #include <stdio. profundidad= atoi(argv[1]). NULL).h. int main (int argc. for (j= 0. pid t pid. } Modifica el programa anterior para que la expansión en anchura del ´árbol se produzca sólo en aquellos niveles de profundidad par (y distinta de cero).h> #include <stdlib. fin. } 7. nuevo1. La llamada time(NULL) devuelve los segundos transcurridos desde las 00:00:00 del 1/1/1970 hasta el instante de la llamada. char ∗argv[ ]) { int i. char ∗argv[ ]) { int i. puedes utilizar la función time() de la librería estándar time. Para calcular el tiempo transcurrido. } } if (pid!= getpid()) execlp ("kcalc". Tu programa podrá empezar. /∗ anchura ∗/ /∗ completar aquí ∗/ printf("Soy el proceso %d y mi padre es%d\n". j. Los valores de profundidad y anchura del árbol serán dados como parámetros de entrada por el usuario en cada ejecución. se considera que la profundidad es 5 y la anchura 3. i++){ pid= getpid().1.h> int main (int argc. j< i+2. time _t ini. getpid(). if (argc!= 3) exit(0). if(nuevo== 0){ break. j++){ nuevo= fork(). for (i= 0. En la figura 1.h> #include <unistd. nuevo. } return 0. } 8. Introduce las llamadas al sistema wait para que una vez generado el árbol de procesos los hijos sean esperados por sus respectivos padres. } return 0. Además. nuevo1= fork(). if(nuevo1== 0) execlp ("xload". anch. Dibuja la jerarquía de procesos que resulta de la ejecución del siguiente código. getppid()). "xload".

Indica qué problemas se producen. por qué y cómo resolverlos.9. Observa el siguiente fragmento de código que trata de medir el tiempo de ejecución del programa prueba. if (fork()!= 0) { wait (NULL).exe". printf ("Tiempo empleado: %ld\n". } . fin-inicio). NULL). 10. Time_ t inicio= 0. fin= 0.exe". "prueba.3 para profundidad n. fin= time (NULL). execlp ("prueba. } else { inicio= time (NULL). Escribe el fragmento de código que genera la jerarquía de procesos que se muestra en la figura 1.exe.