Sistemas Operativos II Solución problema 2 Febrero 2000 Apellidos: Nombre: PROBLEMA 1 DNI: Número de matrícula: SOLUCIÓN Puntuación: 6 puntos (0.6 por apartado) min. tiempo estimado: 1h. 30 1) A la ejecución del siguiente segmento de código: .... P0; pid = fork(); if (pid != 0) { P2; wait(estado); P1; } else { P3;} ... P0 P2 P3 P1 le corresponde el diagrama de precedencia que se muestra a su derecha. Este diagrama representa el orden de ejecución de los procedimientos “Pi” a los que se hace referencia en el código. Dado el siguiente segmento de código: .... SOLUCIÓN P0; if ( fork()!=0) if (fork() != 0) { P4; P0 wait(estado); wait(estado); if (fork() != 0) { wait(estado); P1 P2 P4 if (fork() !=0) { P6; exit(0); } else { P3; exit(0); } P5 } else { P5; exit(0); } } P6 P3 else { P2; exit(0); } else { P1; exit(0); } ... SE PIDE: dibujar el diagrama de precedencia que permita observar el orden de ejecución de los procedimientos “Pi” que aparecen en el segmento de código anterior. Suponer que las llamadas al sistema no fallan. Sistemas Operativos II Solución problema 2 Febrero 2000 2) Escribir una de las posibles salidas que generaría por pantalla la ejecución del siguiente programa. Suponer que las llamadas al sistema no fallan. main() { int com1[2], com2[2]; char buffer, *argv[2]; pipe(com1); pipe(com2); if (fork() == 0) { if (fork() == 0) { close(com1[0]); close(com1[1]); close(com2[1]); read(com2[0], &buffer, 1); write(1, &buffer, 1); } else { close(com2[0]); close(com2[1]); close(com1[1]); close(0); dup(com1[0]); close(com1[0]); argv[0] = "prog1"; argv[1] = '\0'; execv("prog1", argv); } } else { buffer = 'a'; write(com1[1], &buffer, 1); buffer = 'b'; write(com2[1], &buffer, 1); } } donde prog1 es un fichero ejecutable generado a partir del siguiente programa: main() {char buffer; read(0, &buffer, 1); write(1,&buffer, 1); } SOLUCIÓN: ba Sistemas Operativos II Solución problema 2 Apellidos: Nombre: Febrero 2000 DNI: Número de matrícula: 3) Escribir la salida que generaría por pantalla la ejecución del siguiente programa: #include<signal.h> int pid; void f1() { kill(pid, SIGUSR1); } void f2() { kill(getpid(), SIGUSR2); } main() { int com[2]; char buffer; struct sigaction tratamiento; pipe(com); pid = fork(); if (pid == 0) { tratamiento.sa_handler = f2; sigaction(SIGUSR1, &tratamiento, 0); read(com[0], &buffer, 1); write(1, &buffer, 1); } else { tratamiento.sa_handler = f1; sigaction(SIGALRM, &tratamiento, 0); alarm(5); pause(); buffer = 'a'; write(com[1], &buffer, 1); } } SOLUCIÓN: No se escribe nada Sistemas Operativos II Solución problema 2 Febrero 2000 4) Teniendo en cuenta que el fichero f1 contiene un programa ejecutable que escribe el literal “Hola” por pantalla, que las llamadas al sistema no fallan y que la condición del if se evalúa de izquierda a derecha, indicar la salida que generaría por pantalla la ejecución del siguiente programa: main() { int i; char *argv[2]; argv[0] = "f1"; argv[1] = '\0'; for (i=0; i<3; i++) { if (execv("f1") == execv("f1")) printf("H"); } } SOLUCIÓN: Hola 5) Teniendo en cuenta que las llamadas al sistema no fallan, indicar la salida que generaría por pantalla la ejecución del siguiente programa: main() { int estado, pid, i; char buffer; buffer = 'H'; for (i=0; i<2; i++) { pid = fork(); if (pid == waitpid(pid, &estado, 0)) { write(1, &buffer, 1); } } } SOLUCIÓN: HHH 6) El fichero Datos contiene las caracteres: abcdef. Teniendo en cuenta que las llamadas al sistema no fallan, indicar una de las posibles salidas por pantalla que generaría la ejecución del siguiente programa: Sistemas Operativos II Solución problema 2 Apellidos: Nombre: Febrero 2000 DNI: Número de matrícula: #include<fcntl.h> main() { int df1, df2; char *buffer; df1 = open("Datos", O_RDONLY, 0700); if (fork() == 0) { read(df1, &buffer, 3); write(1, &buffer, 3); df2 = open("Datos", O_RDONLY, 0777); read(df2, &buffer, 3); write(1, &buffer, 3); } else { read(df1, &buffer, 3); write(1, &buffer, 3); } } SOLUCIÓN: abcdefabc 7) Indicar dos razones por las cuales pueda fallar la llamada al sistema “wait” de MINIX. La llamada al sistema wait puede fallar porque el proceso que la ejecuta no tenga ningún hijo o porque mientras el proceso está esperando por la muerte de un hijo le llegue una señal que tenga asociado un tratamiento de función. 8) Indicar una razón por la cual el Gestor de Memoria de MINIX le solicite algún trabajo al Gestor de Ficheros durante la ejecución de la llamada al sistema “execve”. Una de las razones es para solicitarle al GF que obtenga la información del i-nodo asociado al fichero que se pasa como primer parámetro de la llamada execve. 9) La llamada al sistema “pause” de MINIX siempre falla (devuelve –1) a no ser que el proceso muera durante su ejecución. Explicar brevemente por qué. Cuando un proceso de usuario ejecuta la llamada al sistema pause, este se queda bloqueado hasta la recepción de una señal. Cuando el Gestor de memoria de MINIX detecta que debe enviarle una señal al proceso bloqueado en la llamada Sistemas Operativos II Solución problema 2 Febrero 2000 pause, comprueba el tipo de tratamiento que tiene asociado. Si este es el tratamiento por defecto, el Gestor de memoria mata al proceso. Si el tratamiento asociado es una función, el Gestor de memoria comprueba si el proceso está ejecutando una llamada (que es la situación), en cuyo caso le devuelve –1 al proceso (la llamada falla). 10) Para cada una de las siguientes llamadas al sistema de MINIX indicar si durante su ejecución se activa la tarea del sistema y en caso afirmativo indicar una razón por la que se produzca esa situación: brk (direccion). Modifica el segmento de datos. La dirección del segmento de datos se mantiene en la tabla de procesos del Gestor de Memoria y del núcleo del S.O. Sí, se activa la tarea del sistema para que modifique la información en la tabla de procesos del núcleo. setuid (nuevoUid). No se activa la tarea del sistema. write (df, &buffer, tamaño) (df está asociado a un fichero grabado en disco). Sí, se activa la tarea del sistema para copiar la información de espacio de usuario (de la variable buffer) a la cache de bloques del gestor de Ficheros. signal (numeroSeñal, función). No se activa la tarea del sistema.