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.