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 de SO-grado 2013-2014 QT Nombre alumno: DNI: Preguntas cortas (justifica todas las respuestas) (2 puntos) 1. Define qué es la buffer cache, qué tipo de información encontramos y cuál es su objetivo La buffer cache es una cache de bloques de disco. Encontramos los bloques de disco que hemos leído anteriormente (hasta un límite, ya que la buffer cache puede llenarse lógicamente). El objetivo es ahorrarnos accesos a disco.
2. Explica qué ventajas e inconvenientes tendría tener un sistema de asignación en disco que definiera bloques de tamaño variable respecto al sistema de asignación que hemos explicado en clase en el cual los bloques de disco son del mismo tamaño.
Ventajas: La ventaja es que desaparecería la fragmentación interna ya que podríamos ajustar los bloques al tamaño que necesitemos.
Inconvenientes: Complicaría mucho la gestión ya que no serían todos los bloques iguales. Habría que almacenar el tamaño de los bloques así como definir un algoritmo para seleccionar el mejor bloque. Aparecería fragmentación externa. También dificultaría muchísimo la existencia de una optimización como la buffer cache 3. Si tenemos una máquina con cuatro CPUs y queremos que en cada CPU se pueda ejecutar un thread de un proceso diferente, ¿Es suficiente con tener una MMU o necesitamos una por CPU? Necesitamos una por cpu para que cada cpu haga su propia traducción de direcciones lógicas a físicas.
4. Si el fichero A tiene en su bloque de datos el siguiente contenido: /home/usr/pedro.txt Y sabemos qué /home/usr/pedro.txt es un fichero de datos que existe en el sistema de ficheros. Suponed que estamos haciendo un open de A y el open ya ha leído su inodo. El comportamiento del open a partir de este punto depende del tipo de fichero de A. Indica qué dos comportamientos podría tener y con qué tipo de fichero se correspondería cada uno.
1 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: DNI: Si resulta que A es un fichero de datos, ya hemos acabado el open, habrá que actualizar las tablas de e/s de memoria.
Si resulta que A es un softlink, tendremos que leer los inodos y los bloques de datos correspondientes al path /+home+usr+pedro.txt Procesos y ficheros (justifica todas las respuestas) (3 puntos) Queremos implementar un código que copie el contenido del fichero F1 en F2 en paralelo en una máquina que dispone de 4 CPUs. Para ello queremos repartir la copia entre 4 procesos distintos. Nos proponen el siguiente fragmento de código y se pide que contestes justificando tus respuestas a las siguientes preguntas.
NOTA: F1 y F2 ya existen en el momento de ejecutar el código. El tamaño de F2 es el mismo que el de F1, pero su contenido es todo 0’s. Asume que ninguna llamada a sistema de este código devuelve error.
1.
2.
3.
4.
5.
6.
7.
i=0;pid=0; while((i<3) && (pid==0)){ i++; pid=fork();} fd_in=open(“F1”,O_RDONLY); fd_out=open(“F2”,O_WRONLY); while(read(fd_in,&c,sizeof(char)){ write(fd_out,&c,sizeof(char)); } 1. Analiza la jerarquía de procesos que genera este código para ver si realmente es la deseada. Queremos que la copia la realicen 4 procesos concurrentes. Dibuja la jerarquía e indica si cumple las especificaciones (en cuanto a procesos). Indica, además, quiénes son los que participan en la copia del fichero.
Se crean 3 procesos donde los que iteran en el bucle son los hijos. Al final también tenemos 4 procesos concurrentes inicial i=0 i=1 i=2 2 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: DNI: 2. Dibuja el estado de las tablas de entrada/salida de todos los procesos asumiendo que los procesos que copian están al inicio del bucle (línea 5) (os damos el estado inicial del proceso inicial): 0 1 2 3 4 T. canales 0 0 0 1 2 0 1 2 3 4 5 6 7 8 T. canales 0 1 2 3 4 0 0 0 3 4 T. Ficheros abiertos #refs Modo 3 12 rw 1 R 1 W 1 R 1 W 1 R 1 W 1 R 1 W T. canales 0 1 2 3 4 0 0 0 5 6 Punt l/e -0 0 0 0 0 0 0 0 Ent T. inodos 0 1 2 1 2 1 2 1 2 0 1 2 T. inodos #refs 1 4 4 inodo i-tty i-F1 i-F2 T. canales 0 1 2 3 4 0 0 0 7 8 Comentarios: Como hay 4 procesos, hemos de dibujar 4 tablas de canales. Como los open’s están después de los forks, cada proceso hace sus open’s y no comparten las entradas de la tabla de ficheros abiertos. Lo que podría variar es el orden en que se hacen los open’s y por lo tanto el número de la entrada de la TFA a la que apuntan los canales 3 y 4 de cada proceso.
3 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: DNI: 3. Nos dicen que el fichero F1 tiene un tamaño de 10.000 bytes y sabemos que el tamaño del bloque de disco es de 512 bytes. Sabemos además que el sistema implementa la optimización de buffer cache compartida para inodos y bloques de datos (sabemos que la buffer cache es los suficientemente grande como para albergar todos los bloques de disco de este ejercicio).
a. ¿Podemos saber exactamente cuántos accesos a disco realizará este código, considerando todos los procesos, para leer el fichero “F1”? En caso afirmativo indica cuantos y en caso negativo justifícalo.
Comentario: Como estamos accediendo al mismo fichero, no importa cuántos procesos haya a la vez ni cuantos accesos hagamos. El primer proceso que acceda a un byte de un bloque lo cargará en la buffer cache y los otros ya se lo encontrarán 10000/512=20 bloques b. ¿Podemos saber exactamente cuántos bytes leerá cada proceso? Comentario: Cada proceso hace un open del fichero con lo que no comparten el puntero de lectura/escritura y cada uno leerá el fichero entero.
10.000 bytes cada uno c. ¿Se cumplen las especificaciones de que el fichero F2 sea exactamente igual que F1? (analiza sólo este aspecto en esta pregunta) Si, F2 será igual que F1, aunque haremos 4 copias. El resultado final será el mismo porque no comparten la posición de l/e d. Finalmente, analiza si este código tiene algún fallo respecto a lo que queríamos conseguir y en ese caso explica brevemente qué modificaciones harías para arreglarlo.
Se soluciona calculando que trozo debe copiar cada proceso y usando lseek para posicionarse y copiar una parte del fichero .
4 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: DNI: Gestión de memoria (justifica todas las respuestas) (3 puntos) En un proceso con varios threads, uno de ellos ejecuta el código de la siguiente función (la línea 4 es el único malloc del código): 1.
2.
3.
4.
5.
6.
int *v; void * func_thread(void *p) { v=(int *)malloc(10.000*sizeof(int)); …// Usamos v y otros calculos } 1. Si observamos el ejecutable de este programa, ¿En qué sección del ejecutable encontraremos la variable v? En la sección BSS ya que es una variable sin inicializar 2. ¿En qué región de memoria del espacio lógico del proceso estará declarada la variable v? En la región de datos, ya que es una variable global 3. ¿En qué región de memoria podremos encontrar la memoria reservada por malloc? En el heap, ya que es memoria reservada durante la ejecución 4. ¿Esa nueva zona de memoria, será accesible por otros threads? ¿Podría formar parte de una región crítica? Si, ya que el heap es accesible para todos los threads 5. Nos dan los siguientes datos sobre nuestro programa y sobre el sistema: • El primer malloc siempre reserva un espacio 10 veces mayor que el espacio pedido • La librería de C necesita 4096 bytes para sus datos de gestión.
• El vector v se accede desde otros threads (el programa tiene 10 threads) • El espacio lógico del proceso es 3kb de código, 4Kb para cada pila, y sabemos que no hay más variables globales ni más mallocs • Un PCB ocupa 4096 bytes para un proceso con un thread y un extra de 4096 bytes por thread adicional.
5 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: • • DNI: El sistema implementa la optimización de COW No se comparten páginas entre regiones.
Calcula el espacio lógico que ocupará nuestro proceso y el espacio físico que necesitará reservar el kernel para su ejecución. (Indícalo por regiones y separado espacio de usuario y espacio de kernel) Usuario Espacio lógico: código=4k, datos=4k, pilas=10x4k, heap=10x10000xsizeof(int)+4096 Espacio físico: código=4k, datos=4k, pilas=10x4k, heap=10x10000xsizeof(int)+4096 Kernel Espacio lógico: 4kb (primer thread)+9x4k (resto threads) Espacio físico: 4kb (primer thread)+9x4k (resto threads) 6 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: DNI: Signals (justifica todas las respuestas) (2 puntos) Tenemos el siguiente código (se omite el tratamiento de errores para facilitar la legibilidad) en el que un proceso principal crea a un proceso hijo.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
void trat_signal (int s) { write(1, “Fin Tiempo!\n”, 12); exit(1); } main (){ int pid, status; int fd_pipe[2]; char c; signal (SIGALRM, trat_signal); pipe (fd_pipe); pid = fork(); if (pid >0) { write(fd_pipe[1], “soy tu padre\n”, 13); waitpid(-1,NULL, 0); } else { alarm(2); while (read(fd_pipe[0], &c, sizeof(c)) > 0) write(1, &c, sizeof(c)); alarm(0); } write(1, “Fin\n”,4); } Suponiendo que la comunicación del mensaje “soy tu padre\n” tarda 1 milisegundo (por tiempo de comunicación entendemos el tiempo necesario para que el receptor lea el mensaje y lo trate), contesta razonadamente a las siguientes preguntas: 1. ¿Qué mensajes veremos en salida estándar? Indica qué proceso (el principal o el hijo) escribirá cada mensaje.
Soy tu padre\n: lo muestra el proceso hijo, al recibir por la pipe la cadena que le manda el padre Fin Tiempo!\n: lo muestra el hijo. El hijo se queda bloqueado en la lectura de la pipe porque quedan posibles escritores en ella. Al pasar los 2 segundos del temporizador que ha programado recibe el sigalrm, ejecuta el tratamiento asociado que escribe este mensaje y finaliza el proceso hijo.
Fin: lo muestra el padre. El padre se queda bloqueado en el waitpid hasta que el hijo acaba en el tratamiento del signal, entoces continúa escribiendo este mensaje y acaba. El hijo nunca llega a este punto porque muere en el tratamiento del signal.
7 Examen final de teorı́a de SO-grado 2013-2014 QT Nombre alumno: DNI: 2. Suponiendo que modificamos este código y movemos la llamada a sistema alarm(2) de la línea 18 a la línea 13, y la llamada a sistema alarm(0) de la línea 21 a la 16, ¿qué mensajes veremos en salida estándar? Indica qué proceso (el principal o el hijo) escribirá cada mensaje.
Soy tu padre\n: lo muestra el proceso hijo, al recibir por la pipe la cadena que le manda el padre Fin Tiempo!\n: lo muestra el padre. El padre se queda bloqueado en el waitpid esperando a que acabe su hijo que está bloqueado en la lectura de la pipe. Con este cambio el temporizador lo programa el padre que será el único que reciba el sigalrm al pasar los 2 segundos, ejecuta el tratamiento asociado que escribe este mensaje y finaliza el proceso padre. El hijo se queda bloqueado en la lectura de la pipe porque aunque el canal de escritura de la pipe del padre se cierre al morir todavía queda abierto el canal de escritura del hijo.
3. Suponiendo que sobre el código original, sin hacer ningún cambio, eliminamos ahora la llamada signal de la línea 9, ¿qué mensajes veremos en salida estándar? Indica qué proceso (el principal o el hijo) escribirá cada mensaje.
Soy tu padre\n: lo muestra el proceso hijo, al recibir por la pipe la cadena que le manda el padre Fin: lo muestra el padre. El padre se queda bloqueado en el waitpid hasta que el hijo acaba en al recibir el sigalrm, entoces continúa escribiendo este mensaje y acaba. El hijo nunca llega a este punto porque muere al recibir el signal. En este caso se ejecuta el tratamiento por defecto que consiste en matar al proceso.
4. Suponiendo que sobre el código original, sin hacer ningún cambio, movemos ahora la llamada signal de la línea 9 la línea 13, ¿qué mensajes veremos en salida estándar? Indica qué proceso (el principal o el hijo) escribirá cada mensaje.
Soy tu padre\n: lo muestra el proceso hijo, al recibir por la pipe la cadena que le manda el padre Fin: lo muestra el padre. El padre se queda bloqueado en el waitpid hasta que el hijo acaba en al recibir el sigalrm, entoces continúa escribiendo este mensaje y acaba. El hijo nunca llega a este punto porque muere al recibir el signal. En este caso como la reprogramación la hace el padre una vez creado al hijo, el hijo tiene asociado al signal el tratamiento por defecto que consiste en matar al proceso.
8 ...