SO APUNTES Y EXAMENES (2014)

Examen Español
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería Informática - 5º curso
Asignatura SO
Año del apunte 2014
Páginas 8
Fecha de subida 10/09/2014
Descargas 0
Subido por

Descripción

Examenes resueltos y apuntes y ejercicios

Vista previa del texto

Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: JUSTIFICA TODAS LAS RESPUESTAS. UNA RESPUESTA SIN JUSTIFICAR SE CONSIDERA INVALIDA Preguntas cortas (1,5 puntos) 1. ¿Un hardware que ofrece cuatro modos de ejecución, uno de ellos de usuario y tres niveles de modos privilegiados, puede ofrecer llamadas a sistema seguras? 2.
Observamos que dos procesos tienen el mismo espacio lógico y físico, ¿Qué optimización ofrece este S.O. para que esta situación sea posible? ¿Tiene que existir alguna relación entre los procesos para que sea posible? 3.
Explica brevemente para que se utiliza el área de swap cuando aplicamos el algoritmo de reemplazo en la optimización de memoria virtual.
4.
¿De qué tipo son los ficheros . y .. que encontramos en los directorios y a que hacen referencia? Procesos, threads y memoria (1,5 puntos) CASO 1 PROCESOS: Si sabemos que un proceso ocupa (4 KB de código, 4KB de datos y 4KB de pila) a nivel usuario y que el kernel reserva PCBs de 4KB, que espacio necesitaremos (en total, usuario+sistema, incluido el proceso inicial), ejecutando el siguiente código, en los siguientes casos : 1 Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: 1. fork(); 2. fork(); 3. fork(); 1.
El sistema no implementa COW y todos los procesos están justo después del último fork 2.
El sistema implementa COW y todos los procesos están justo después del último fork CASO 2 THREADS: El proceso realiza las siguientes llamadas, sabiendo que todo es correcto y que el sistema no ofrece COW, ¿Qué espacio habrá reservado en total (incluyendo el proceso inicial) al inicio de la línea 4? 1. pthread_create(&th1,función_th,null, null); 2. pthread_create(&th2,función_th,null, null); 3. pthread_create(&th3,función_th,null, null); 4.
2 Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: Entrada/Salida (3,5 puntos) Tenemos el siguiente sistema de ficheros (todo son directorios): / home usr1 dev usr2 Y nos dan el siguiente código: 1. void f(int i){ 2. char c,buff[64]; 3. int fd; 4. sprintf(buff,”/home/usr1/%d”,i); 5. fd=open(buff,O_WRONLY|O_CREAT,0777); 6. while(read(0,&c,1)>0) write(fd,&c,1); 7. } 8. void main(int argv,char *argv[]){ 9.
int i,pid; 10.
for(i=0;i<4;i++){ 11.
pid=fork(); 12.
if(pid==0){ 13.
f(i); 14.
exit(0); 15.
} 16.
} 17.
f(i); 18.
while(waitpid(-1,null,0)>0); 19. } 1.
Describe brevemente que hace este código (procesos que se crean, que hace cada uno , etc) 2.
Sabiendo que al inicio del programa, solo están creados los canales 0,1 y 2, ¿qué valor tendrá fd para cada uno de los procesos? 3.
Cuantas entradas en la Tabla de ficheros abiertos generará este código? 3 Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: 4.
Dibuja como quedará el sistema de ficheros al acabar el programa 5.
Sabemos que la entrada std es la consola, y sabemos que el usuario teclea los siguientes caracteres 1234567890 y a continuación apreta ctrD, ¿Cuál será el contenido de cada fichero que se genera? 6.
Si nos dicen que el sistema no ofrece buffer cache y que las escrituras en disco se hacen de forma inmediata, ¿Cuántos accesos a disco se producirán en total como consecuencia del bucle de la línea 6? 7.
Antes antes de ejecutar este código tenemos los inodos y bloques de datos con el siguiente contenido. Modifícalo para representar como quedará para este caso concreto: asume que los procesos se ejecutan en orden de creación (i=0,1,2,3,4) y que cada proceso lee una letra de la entrada std.
TABLA DE INODOS EN DISCO Num_inodo #enlaces Tipo_fichero Bloques_datos 4 0 4 d 0 1 4 d 1 2 2 d 2 3 2 d 3 4 2 d 4 5 6 7 8 9 10 Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: Bloques datos Num Bloque Datos 0 1 2 3 4 .
0 ..
0 home 1 dev 2 . 1 .. 0 usr1 3 usr2 4 . 2 .. 0 . 3 .. 1 . 4 .. 1 Num Bloque Datos 9 10 11 12 13 5 5 6 7 8 14 15 16 17 Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: Análisis de código: Comunicación de procesos (3,5 puntos) Tenemos el programa “prog” que se genera al compilar el siguiente código (por simplicidad, se omite el código de tratamiento de errores): 1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
main() { int fd_pipe1[2]; int fd_pipe2[2]; int ret, i; char buf[80]; pipe(fd_pipe1); ret = fork(); if (ret > 0){ dup2(fd_pipe1[1],1); close(fd_pipe1[1]); close(fd_pipe1[0]); execlp("cat","cat",(char *) 0); } else { close(fd_pipe1[1]); pipe(fd_pipe2); ret = fork(); if (ret > 0) { dup2(fd_pipe1[0],0); close(fd_pipe1[0]); dup2(fd_pipe2[1],1); close(fd_pipe2[1]); close(fd_pipe2[0]); execlp("cat","cat",(char *) 0); } else { close(fd_pipe1[0]); dup2(fd_pipe2[0],0), close (fd_pipe2[0]); close(fd_pipe2[1]); execlp("cat", "cat", (char *) 0); } } write (2, "Fin", 3); } Contesta de forma JUSTIFICADA a las siguientes preguntas, suponiendo que ejecutamos este programa con el siguiente comando y que ninguna llamada a sistema provoca error: %./prog < fichero_entrada > fichero salida Y Suponiendo que “fichero_entrada” existe y su contenido es “abcdefghijklmnñopqrstuvwxyz” 6 Examen final de teoría 2012-2013 QT Nombre alumno: DNI: 1.
Fila,columna: Grupo de teoría: ¿Cuántos procesos crea este programa? ¿Cuántas pipes? Representa la jerarquía de procesos que creará este programa en ejecución. Asigna a cada proceso un identificador para poder referirte a ellos en el resto de preguntas. Representa también las pipes que se crean indicando qué proceso(s) lee(n) de cada una y qué proceso(s) escribe(n) en cada una. En el dibujo indica también (mediante flechas) que procesos acceden a los ficheros “fichero_entrada” y “fichero_salida” y el modo de acceso (lectura/ escritura).
Dibujo: Justificación: 2.
Completa la siguiente figura con toda la información necesaria para representar el estado de las tablas de canales de todos los procesos, la tabla de ficheros abiertos y la tabla de inodes, suponiendo que todos los procesos están justo antes de acabar la ejecución (nota: en el campo inode de la tabla i-nodes puedes poner algo que represente al i-node del dispositivo).
Tabla Canales Tabla Ficheros Abiertos Ent. TFA 0 1 2 7 #refs 0 1 2 3 4 5 6 Mod Punt l/e Ent t. inodes 0 Tabla i-nodes 0 #refs 1 inode i-tty Examen final de teoría 2012-2013 QT Nombre alumno: DNI: Fila,columna: Grupo de teoría: 3.
¿Qué contendrá fichero_salida al final de la ejecución? ¿Qué mensajes aparecerán en pantalla? 4.
¿Acabarán la ejecución todos los procesos? 5.
Queremos modificar el código para que cada cierto tiempo (por ejemplo cada segundo) aparezca un mensaje en la pantalla. Se nos ocurre la siguiente modificación del código (los cambios aparecen marcados en negrita): 1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
6.
int trat_sigarlm(int signum) { char buf[80]; strcpy(buf, “Ha llegado alarma!”); write(2,buf,strlen(buf)); alarm(1); } main() { int fd_pipe1[2]; int fd_pipe2[2]; int ret, i; char buf[80]; signal(SIGARLM ,trat_sigalrm); alarm(1); pipe(fd_pipe1); ret = fork(); // A PARTIR DE AQUI NO CAMBIA NADA //… } Suponiendo que el proceso inicial tarda más de 1 segundo en acabar, ¿funcionará? ¿Qué mensajes aparecerán ahora por pantalla? ¿Qué procesos los escribirán? ¿Cambiará en algo el resultado de la ejecución? 8 ...