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