fork()

Anuncio
Sistemas Operativos II
Febrero 2001
Apellidos:
Nombre:
Puntuación total: 6 puntos.
DNI:
Nº Matrícula:
Tiempo estimado: 1h. 30 min.
Los apartados 1, 2, 3, 4 y 5 se han de responder teniendo en cuenta que el Sistema es POSIX.
Para el resto de apartados el Sistema es MINIX.
1) Dado el siguiente programa en el que se supone que las llamadas al Sistema
(POSIX) no fallan (por causas no contempladas en el propio programa) y
considerando además que cuando un proceso pasa a estado zombi es cuando el
Sistema hace que todos sus hijos pasen a ser hijos del proceso ‘Init’:
#include <unistd.h>
#include <signal.h>
main () {
int A[2], B[2], C[2], pid, m=-1,n=-1;
pipe(A); pipe(C);
if ((pid=fork())!=0) {
write(A[1],&pid,sizeof(pid));
read(C[0],&m,sizeof(m)); read(C[0],&n,sizeof(n));
if (m==pid) printf("Abuelo 1\n"); else printf("Abuelo 2\n");
kill(m,SIGTERM); kill(n,SIGTERM);
} else {
pipe(B);
if ((pid=fork())!=0) {
read(A[0],&m,sizeof(m));
if (m==getpid()) printf("Padre 1\n"); else printf ("Padre 2\n");
write(B[1],&m,sizeof(m));
pause(); /* línea comentada */
} else {
read(B[0],&m,sizeof(m));
if (m==getppid()) {
n=getpid(); printf("Nieto 1\n"); }
else {
n=getppid(); printf("Nieto 2\n"); }
write(C[1],&m,sizeof(m)); write(C[1],&n,sizeof(n)); pause();
}
}
}
Se pide que realice a los siguientes apartados:
1) Escriba la(s) posible(s) salida(s) que genera este programa. (0´4 puntos)
Sólo tiene una salida:
Padre 1
Nieto 1
Abuelo 1
2) Responda Si queda, No queda o Puede quedar algún proceso sin finalizar.
(Valor: 0,2 el acierto, -0,1 el fallo). Respuesta => No queda
Responda nuevamente a las dos cuestiones ya planteadas suponiendo que se ha
suprimido la línea comentada del listado de este programa. (Valor: mismo de antes).
1) Respuesta:
Dependiendo de si el proceso nieto muere antes que su padre o no, se producen diferentes
resultados: Padre 1
o
Padre 1
Nieto 1
Nieto 2
Abuelo 1
Abuelo 1
Si su padre muere antes, entonces el nieto es adoptado por INIT y cambia el resultado del ‘IF’
2) Respuesta: Puede Quedar
Sistemas Operativos II
Febrero 2001
2) Dado el siguiente programa en el que se supone que las llamadas al Sistema
(POSIX) no fallan (por causas no contempladas en el propio programa) y que se
ejecuta desde la línea de comando:
#include <uniste>
#include <string.h>
#include <signal.h>
void trat() { write(1,”trat”,4);}
struct sigaction acc;
main (int argc, char* argv[]) {
acc.sa_handler=trat;
sigaction(SIGALRM,&acc,0); alarm(1);
if(fork()!=0) {
acc.sa_handler=SIG_DFL; sigaction(SIGALRM,&acc,0);
execv(argv[0], argv);
}
pause();
}
Se pide que señale dos posibles opciones correctas entre las siguientes: (Valor: 0,3
cada opción señalada correctamente, -0,06 cada opción errónea)
a) El Programa escribe trat (y un proceso se queda en espera)
b) "
"
" trat (y finalizan todos los procesos)
c) "
"
" trattrat (y finalizan todos los procesos)
d) "
"
" trattrattrat... (indefinidamente, quedando procesos en espera)
e) "
"
no escribe nada y finalizan todos los procesos
f) "
"
no escribe nada y se generan nuevos procesos indefinidamente
3) Dado el siguiente programa en el que se supone que las llamadas al Sistema
(POSIX) no fallan (por causas no contempladas en el propio programa).
#include <unistd.h>
#include <signal.h>
main () {
int estado, pid;
if((pid=fork())!=0) {
waitpid(pid,&estado,0);
if (estado==0) printf("CERO"); else printf ("NOCERO");
} else {
alarm(1);
if ((pid=fork())!=0) {pause(); kill(pid,SIGTERM);}
else pause();
}
}
Se pide que señale la opción correcta entre las siguientes: (Valor: 0,6 puntos opción
correcta, -0,15 opción errónea)
a)
b)
c)
d)
e)
Se muestra CERO y se pierde una señal SIGTERM
Se muestra NOCERO y finalizan todos los procesos
Se muestra CERO y no queda ningún proceso vivo
Se muestra NOCERO y queda algún proceso vivo
No se muestra nada
Sistemas Operativos II
Febrero 2001
4) Con relación a la llamada a sistema fork (POSIX), señale qué opción es cierta entre
las siguientes: (Valor 0,6 puntos el acierto y –0.2 el fallo)
a) Las cerraduras establecidas por el proceso padre son heredadas por el proceso hijo.
b) Algunos de los valores que no cambian cuando se copia la entrada en la tabla de
procesos son: pid, ppid, uid y gid real y efectivo.
c) Aunque el padre y el hijo comparten los punteros L/E que tuviera asignados el proceso
padre al crear el proceso hijo, las modificaciones de uno de estos punteros por parte de
cualquiera de los dos procesos no afecta al otro.
d) El proceso hijo no hereda la posible alarma que pudiera tener establecida el proceso
padre.
5) Con relación a la llamada a sistema waitpid (POSIX), señale qué opción es cierta
entre las siguientes: (Valor 0,6 puntos el acierto y –0.2 el fallo)
a) El sistema operativo recorre la tabla de procesos buscando un proceso hijo, si no
encuentra ninguno en estado zombi la llamada devuelve error.
b) El sistema operativo recorre la tabla de procesos buscando un proceso hijo, si no
encuentra ninguno deja al proceso que hace la llamada en estado bloqueado.(en espera
de un hijo)
c) El sistema operativo recorre la tabla de procesos buscando un proceso hijo, si encuentra
alguno y está en estado zombi recoge el estado de terminación del hijo y devuelve dicho
resultado, eliminando además definitivamente a dicho hijo.
d) Si se efectúa esta llamada para esperar por la terminación de un proceso que no tenga el
mismo ‘gid’ que el proceso que hace la llamada, la llamada falla.
6) Con relación a la tarea de reloj de MINIX, señale qué opción es cierta entre las
siguientes: (Valor 0,6 puntos el acierto y –0.2 el fallo)
a) El mensaje SET_ALARM le puede llegar proveniente de un proceso de usuario, del
Gestor Memoria o de otra tarea de Minix.
b) Si el mensaje SET_ALARM le llega de otra tarea Minix, no devuelve el numero de
segundos que quedaban para que expirase la alarma anterior (Si estuviese establecida).
c) Cuando la rutina de tratamiento de interrupción envía el mensaje CLOCK_TICK a la
tarea de Reloj nunca se queda bloqueada, aunque sabemos que en Minix se utiliza el
paso de mensajes Rendez-vous.
d) El mensaje GET_TIME devuelve el numero de pulsos de reloj desde el 1-1-1970 a las
12 horas.
7) Con relación a la tarea de Terminal de MINIX, señale qué opción es cierta entre las
siguientes: (Valor 0,6 puntos el acierto y –0.2 el fallo).
a) El mensaje TTY_READ se recibe porque algún proceso de usuario solicita caracteres
de teclado al Gestor de Memoria y éste lo envía a su vez a la tarea de Terminal.
b) Cuando se recibe el mensaje TTY_READ, la tarea de Terminal comprueba si dispone
de los caracteres solicitados, si no es así anota la petición como pendiente y devuelve
que no ha podido terminar el trabajo para que el proceso de usuario no se quede
bloqueado.
c) La tarea de Terminal puede copiar los datos directamente al espacio de usuario.
d) El mensaje TTY_WRITE le llega como consecuencia de una llamada al sistema write
sobre un terminal. En ésta se especifica la dirección de memoria donde están los datos,
los cuales no están en el espacio de memoria del proceso de usuario sino en el del
Gestor de Minix que ha efectuado el envío del mensaje.
Sistemas Operativos II
Febrero 2001
8) Con relación al Gestor de Memoria de MINIX, señale qué opción es cierta entre las
siguientes: (Valor 0,6 puntos el acierto y –0.2 el fallo).
a) En el bucle principal del Gestor de Memoria, tras el tratamiento del mensaje recibido se
devuelve siempre un mensaje de respuesta al proceso de usuario.
b) El mecanismo que se utiliza en el bucle principal del Gestor de Memoria para
seleccionar el tratamiento de cada uno de los mensajes consiste en una instrucción de
‘C’ switch con selector tipo de mensaje.
c) El tratamiento de la llamada fork puede fallar por causa “memoria insuficiente” aunque
se dé el caso de que haya un hueco libre cuyo tamaño sea igual al total de bytes
requeridos para el nuevo proceso.
d) Durante el tratamiento de la llamada execve se busca una entrada libre en la tabla de
procesos y si no se encuentra se devuelve error.
9) Con relación al Gestor de Memoria de MINIX, señale qué opción es cierta entre las
siguientes: (Valor 0,6 puntos el acierto y –0.2 el fallo).
a) Durante el tratamiento de la llamada exit, si el proceso padre no esta esperando al hijo,
éste pasa a estado zombi, se libera su memoria y sus hijos pasan a ser hijos del proceso
INIT.
b) Cuando se trata la llamada brk, el Gestor de Memoria obtiene el puntero de pila de su
propia tabla de procesos, comprueba que no haya solapamiento entre éste y el nuevo
segmento de datos y si es así lo modifica enviando un mensaje SYS_NEWMAP a la
Tarea de Sistema para que también lo modifique.
c) La biblioteca que implementa ‘execve’ pone en la pila del proceso de usuario las
variables de entorno y los argumentos e invoca la llamada al Sistema, pasándole como
parámetros la dirección base y el tamaño de ésta. El GM copia esta pila a memoria
propia (con ayuda de la TS), se reasignan valores.....
d) Cuando el GM recibe el mensaje KSIG, éste lo trata igual que cuando se recibe una
llamada ‘Kill’ con la única diferencia de que en este caso sí se envía una respuesta a la
tarea que envió el mensaje KSIG.
Descargar