Examen SO (2014)

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

Descripción

SO

Vista previa del texto

Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: JUSTIFICA TODAS LAS RESPUESTAS. UNA RESPUESTA SIN JUSTIFICAR SE CONSIDERA INVALIDA EJERCICIO 1: Preguntas cortas (2 puntos) 1) En un sistema de ficheros basado en inodos a) Explica qué relación hay entre los inodos que tenemos en disco y los inodos que hay en la tabla de inodos en memoria y justifica para que necesitamos la tabla de inodos en memoria.
Los inodos de memoria son una copia de los inodos de disco. Solo están aquellos inodos que están en uso. El objetivo es ahorrarnos accesos a disco para ir más rapido b) ¿En qué tipo de fichero encontramos la relación entre el nombre de un fichero y su número de inodo? Describe brevemente dónde está esa información y donde se almacena.
En los ficheros de tipo directorio. La información está en los bloques de datos, hay dos columnas, nombre y número e inodo c) Dos procesos, con un thread cada uno, que se ejecutan de forma concurrente, ¿Pueden tener problemas de concurrencia al acceder a una variable que está declarada global? No, ya que los problemas de concurrencia se dan al acceder a memoria entre varios threads del mismo proceso.
NOTA: En este curso no trabajamos memoria compartida entre procesos, por lo tanto no es posible esta situación d) Indica si es cierto o falso y justifícalo: Los hard-links son dos ficheros, con el mismo o diferente nombre pero cada uno con su inodo, que comparten todos los bloques de datos Falso, los hard-links son dos nombres de fichero que comparten el mismo inodo , no dos inodos diferentes con los mismos bloques de datos 1 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: 2) Durante la ejecución de un proceso, ¿Un thread podría llegar a acceder a la pila de otro thread? En caso afirmativo indica cómo y en caso negativo explica porque no.
Los threads comparten el espacio de direcciones, por lo tanto SI, un thread puede acceder a la pila de otro proceso. Normalmente debido a un error de ejecución pero en cualquier caso conociendo la dirección de la pila se puede hacer.
NOTA:Hicimos un experimento de este estilo en el laboratorio.
3) En un proceso multi-thread, tenemos una función, func(), que se ejecuta de forma concurrente por varios threads. Esta función actualiza una variable global por lo que se determina que es una región crítica. Para garantizar su correcta ejecución, nos ofrecen proteger el acceso a la función con un código como el de la figura, utilizando la variable entrar para controlar el acceso.
1.
2.
3.
4.
5.
6.
int entrar=1; // variable global … Este código lo ejecuta while (entrar==0); entrar=0; más de un thread a la func(); vez entrar=1; ¿ Justifica si esta solución es o no correcta (y porqué)? NO es correcta ya que tiene a su vez el mismo problema que la misma región crítica. Podría haber un cambio de contexto entre el bucle y la asignación de la variable y el resultado ser incorrecto.
2 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: Acceso a sistema de ficheros (4 puntos) Tenemos la siguiente jerarquía de directorios, en el que los elementos marcados como cuadros son directorios y los ovalados pueden ser de cualquier tipo: / A B C d e La siguiente figura representa los inodos involucrados en esta jerarquía y el contenido de los bloques de datos. En el campo “Tipo_fichero” de los inodos ,‘d’ significa directorio, ‘-‘ significa fichero de datos, y ‘l’ significa soft-link. El bloque de datos 4 contiene los 7 bytes que forman la cadena “saludos”.
TABLA DE INODOS EN DISCO Num_inodo #enlaces Tipo_fichero Bloques_datos 0 4 d 0 1 1 l 1 2 2 d 2 3 2 d 3 4 2 4 5 6 7 8 9 10 Bloques datos Num Bloque Datos 0 .
..
A B C 0 0 1 2 3 1 2 /B .
..
d 3 2 0 4 .
..
e 4 3 0 4 5 6 7 8 saludos 1) ¿Existe algún soft-link? Si es así indica qué pathname absoluto tiene(n) en la jerarquía de directorios y el pathname absoluto del fichero o ficheros a los que apunta.
Si, /A es un soft link que apunta a /B 3 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: 2) ¿Existe algún hard-link? Si es así indica qué pathname absolutos tienen en la jerarquía de directorios y su(s) inodo(s) Si, /B/d y /C/e son hard-links cuyo inodo es el 4 3) En este sistema de ficheros ejecutamos el siguiente código 1. main (int argc, char *argv[]){ 2.
int fd_pipe[2]; 3.
int fd1, fd2, pidh,ret; 4.
char c; 5.
fd1=open(argv[1],O_RDONLY); 6.
if (fd1 < 0) { error(“argumento incorrecto”); 7.
8.
exit(1); } 9.
10. pipe (fd_pipe); 11. pidh = fork(); 12. if (pidh == 0) { 13.
close(fd_pipe[1]); 14.
close(fd1); fd2 = open(“/C/new”, O_WRONLY|O_CREAT, S_IRWXU); 15.
16.
while (read(fd_pipe[0], &c, sizeof(char)) > 0) write(fd2, &c, sizeof(char)); 17.
18.
close(fd2); close(fd_pipe[0]); 19.
20.
exit(1); 21. } 22.
23. while((ret=read(fd1,&c,sizeof(char)))>0){ 24.
write(fd_pipe[1],&c,sizeof(char)); 25. } 26. close(fd_pipe[1]); 27. close(fd1); 28. close(fd_pipe[0]); 29. exit(0); 30. } Contesta a las siguientes preguntas suponiendo que: El superbloque con la información sobre cuál es el inodo de la raíz, los bloques libres, etc… está en memoria • El tamaño de bloque es 512KB • Los inodos y bloques se asignan de manera consecutiva • No disponemos de buffer cache • Las estructuras de datos en memoria sólo disponen de la información del terminal que usa el shell que está en ejecución a) Si ejecutamos el programa de la siguiente manera • #./prog /A/d 4 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: I.
Indica cuáles de las siguientes líneas de código accederán a disco y qué accesos a disco ejecutará cada una ellas, describiendo claramente cada acceso: si es de lectura o de escritura y qué información se está accediendo. El número que aparece junto a cada línea de código se corresponde con el número de línea del programa de la figura anterior.
Línea de código Núm.
accesos descripción accesos o justificación si no se accede 5. fd1=open(argv[1],O_RDONLY); 9 10. pipe (fd_pipe); 0 14. close(fd1); (suponiendo que el close(fd1) de la línea 27 todavía no se ha ejecutado) 0 Leemos inodo raíz (0), leemos bloque raíz (0), leemos inodo A (1), leemos bloque A (1), leemos inodo raíz (0), leemos bloque raíz (0), leemos inodo B (2), leemos bloque B (2), leemos inodo d (4) Crea inodo en memoria: la pipe sin nombre no persiste una vez finalizados los procesos que las usan.
Como el inodo sigue en uso no se elimina de la tabla de inodos en memoria ni se actualize en disco 15. fd2 = open(“/C/new”, O_WRONLY|O_CREAT, S_IRWXU); 8 Leemos inodo raíz (0), leemos bloque raíz (0), leemos inodo C (3), leemos bloque C (3) (se comprueba que no existe inodo para new y se crea la entrada), leemos e inicializamos inodo new (5) y escribimos bloque C(para añadir el nombreinodo new), inodo /C (para modificar el tamaño) y el superbloque para indicar que hemos reservado un inodo nuevo.
16. while (read(fd_pipe[0], &c, sizeof(char)) > 0) 17.
write(fd2, &c, sizeof(char)); 7 Los read no acceden a disco porque leen de la pipe. Se harán tantos accesos como writes se ejecuten. Y se ejecutan tantos writes como bytes hay en el fichero /A/d: 7 escrituras en un bloque nuevo (el 5) 18. close(fd2); 1 El fichero ya no está en uso por lo tanto se tiene que eliminar el inodo de la table de inodos y actualizar su contenido en disco. Escritura del inodo de /C/new (5) II.
¿Qué cambios habrá al final de la ejecución sobre los inodos y bloques del sistema? Representa en la siguiente figura el nuevo contenido de los inodes y bloques de datos que hayan cambiado.
TABLA DE INODOS EN DISCO Num_inodo #enlaces Tipo_fichero Bloques_datos 5 0 4 d 0 1 1 l 1 2 2 d 2 3 2 d 3 4 2 4 5 1 5 6 7 8 9 10 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: Bloques datos Num Bloque 0 .
..
A B C Datos 1 /B 0 0 1 2 3 2 .
..
d 3 .
..
e new 2 0 4 3 0 4 5 4 5 6 saludos saludos 7 8 b) Si ejecutamos el programa de la siguiente manera #./prog /C/f I.
Indica cuántos accesos a código ejecutará la siguiente línea de código Línea de código Núm.
accesos descripción accesos o justificación si no se accede 5. fd1=open(argv[1],O_RDONLY); 4 Leemos inodo raíz (0), leemos bloque raíz (0), leemos inodo C (3), leemos bloque C (3) (se comprueba que no existe inodo para f y se devuelve error).
4) Si creamos el hard link /A/g para el fichero /C/e, ¿qué cambios provocará sobre los inodos y bloques del sistema? Representa en la siguiente figura el nuevo contenido de los inodos y bloques de datos que hayan cambiado..
TABLA DE INODOS EN DISCO Num_inodo #enlaces Tipo_fichero Bloques_datos 0 4 d 0 1 1 l 1 2 2 d 2 3 2 d 3 4 3 4 5 6 7 8 9 10 Bloques datos Num Bloque 0 6 1 2 3 4 5 6 7 8 Segundo control de teoría Nombre alumno: DNI: Datos .
..
A B C 7 Fila,columna: Grupo de teoría: 0 0 1 2 3 /B .
..
d g 2 0 4 4 .
..
e 3 0 4 saludos Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: Análisis de código: Comunicación de procesos (4 puntos) Queremos hacer un pipeline de tres procesos, para implementar un filtro de datos. Nos dan tres ejecutables: Filtro1, Filtro2 y Filtro3. Los tres leen sus datos de su entrada std y escriben los datos procesados por su salida std. Nuestro programa, que llamaremos filtroM. Lo que queremos es que nuestro código genere la siguiente estructura de procesos y flujo de datos. Nuestro programa se ejecuta de la siguiente forma: #FiltroM fichero_entrada.dat fichero_salida.dat (Donde fichero_entrada.dat contiene los datos de entrada y fichero_salida.dat ha de ser un fichero que se creará durante la ejecución de FiltroM y que contiene la salida del programa Filtro3) Filtro1 Filtro2 Fichero_entrada.dat Filtro3 Fichero_salida.dat Tenemos parte del programa “FiltroM” que se genera al compilar el siguiente código (por simplicidad, se omite el código de tratamiento de errores): 1. main(int argc char *argv[]) { 2.
int pid1,pid2,pid3,p1[2],p2[2]; 3.
pipe(p1); 4.
pipe(p2); pid1=fork(); 5.
6.
if (pid1==0){ // filtro1 7.
8.
execlp(“filtro1,”filtro1”,NULL); 9.
} pid2=fork(); 10.
11.
if (pid2==0){ // filtro2 12.
13.
execlp(“filtro2”,”filtro2”,NULL); 14.
} 15.
pid3=fork(); 16.
if(pid3==0){ //filtro3 17.
18.
execlp(“filtro3”,”filtro3”,NULL); 19.
} 20.
while(waitpid(-1,null,0)>0); 21. } Contesta de forma JUSTIFICADA a las siguientes preguntas.
8 Segundo control de teoría Nombre alumno: DNI: a) Fila,columna: Grupo de teoría: Escribe la secuencia de llamadas a sistema (solo llamadas a sistema), que ejecuta cada proceso de los que intervienen (no hace falta que pongas los parámetros). Obviamente solo las que se tenéis en este código.
Inicial Pipe Pipe Fork Fork Fork Waitpid (x4) Filtro1 Filtro2 Filtro3 execlp execlp execlp b) Completa la siguiente figura con los campos que faltan para que represente el estado de la tabla de canales, la tabla de ficheros abiertos y la tabla de inodos asumiendo que todos los procesos están a punto de mutar y el inicial está en la línea 20. Os damos el estado de las tablas al iniciar el main.
Tabla Canales Tabla Ficheros Abiertos Ent. TFA 0 1 2 0 0 0 1 2 3 4 Filtro 1 Ent. TFA 0 0 0 1 2 3 4 0 1 2 3 4 5 6 9 #refs 0 1 3 4 4 4 4 Mod 12 rw R W R w Punt l/e ------ Tabla i-nodes Ent t.
inodes 0 1 1 2 2 #refs 0 1 2 1 2 2 Filtro2 0 1 2 3 4 5 6 Ent. TFA 0 0 0 1 2 3 4 inode i-tty P1 P2 Filtro3 0 1 2 3 4 5 6 Ent. TFA 0 0 0 1 2 3 4 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: c) Nos proponen la siguiente secuencia para el proceso que ejecuta “filtro1” (antes de mutar) 1. close(0); 2. fd=open(argv[1],O_RDONLY); 3. dup2(p1[1],1); 4. close(p1[0]);close(p1[1]); close(p2[0]);close(p2[1]); c.1) ¿qué valor tendrá la variable fd después del open?¿Por qué? ¿Qué criterio sigue el open para elegir canal? Fd=0 ya que el open siempre devuelve el primer canal disponible, el 0 en este caso pq lo acabamos de cerrar c.2) Dibuja como quedará ahora la tabla de canales de ese proceso justo antes de mutar.
Ent TFA 0 1 2 3 4 5 6 05 02 0 1 2 3 4 c.3) ¿Es correcta esa secuencia de llamadas a sistema?¿Podrán acceder el resto de procesos a las pipes si este proceso ha cerrado los canales de acceso? (justifica tus respuestas) Si, pq de esta forma tenemos la entrada std apuntando al fichero y la salida a la primera pipe. Los canales son privados del proceso, por lo que no hay problema.
d) Nos proponen la siguiente secuencia para el proceso que ejecuta “filtro2” 10 Segundo control de teoría Nombre alumno: DNI: Fila,columna: Grupo de teoría: 1. dup2(p1[0],0);dup2(p2[1],1); 2. close(p1[0]);close(p1[1]); close(p2[0]);close(p2[1]); d.1) Dibuja como quedará su tabla de canales después de ejecutar esta secuencia.
Ent TFA 0 01 1 04 2 0 3 1 4 2 5 3 6 4 e) Nos proponen la siguiente secuencia para filtro3 3. fd=open(argv[2],O_WRONLY); 4. dup2(fd,1); 5. dup2(p2[0],0); 6. close(p1[0]);close(p1[1]); close(p2[0]);close(p2[1]); e.1) ¿Es correcta esta secuencia? Justifica si el open cumple las especificaciones del código (indica que modificarías en caso contrario). Indica además si es necesario cerrar el canal “fd” después de duplicarlo.
El open no es correcto pq hemos de crear el fichero, este caso solo serviría en caso que el fichero ya existiera y además supiéramos que el tamaño del fichero no sería un problema. Habría que usar los flags: O_CREAT|O_TRUNC e incluir los permisos.
El fichero no es necesario cerrarlo ya que con ficheros de datos no influye el número de canales abiertos.
f) Añadiendo los trozos de código propuestos… ¿conseguiríamos cumplir las especificaciones de nuestro código? Justifícalo y en caso contrario indica que cambiarías o añadirías.
Faltaría cerrar los canales de las pipes en el padre antes del waitpid.
11 ...