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 10
Fecha de subida 10/09/2014
Descargas 1
Subido por

Descripción

Examenes resueltos y apuntes y ejercicios

Vista previa del texto

Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: Preguntas cortas 1. (0,5 puntos) Asumiendo que ninguna llamada devuelve error, representa las entradas nuevas de la TFA que aparecerán tras la ejecución del siguiente código: fork(); mknod(“pipe”, S_IFIFO|0666, 0); fd0 = open(“pipe”, O_RDONLY); fd1 = open(“pipe”, O_WRONLY); 2. (0,5 puntos) ¿Puede darse el caso que un proceso no pueda mutar porque el sistema se quede sin PCBs? 1 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: 3. (0,5 puntos) ¿Qué es la memoria virtual? 4. (0,5 puntos) Tenemos una aplicación formada por dos procesos: uno ejecuta el típico código del productor de datos y otro el de consumidor de datos. Los dos procesos tienen una región de memoria compartida para poner las variables que necesitan compartir.
//memoria compartida entre los dos procesos fd=open(”FUENTE”,O_RDONLY); while (true) { read(fd,&data_in,sizeof(data)); while (count == BUFFER_SIZE); buffer [in] = nextProduced(data_in); in = (in + 1) % BUFFER_SIZE; count++; } fd=open(“DESTINO”,O_WRONLY|O_CREAT|O_TRUNC, 0600); while (true) { while (count == 0) ; nextConsumed = buffer[out]; data_out=Calcula(nextConsumed); write(fd,&data_out,sizeof(data)); out = (out + 1) % BUFFER_SIZE; count--; } a) Indica qué problema aparece típicamente cuando utilizamos memoria compartida entre varios procesos que acceden para lectura y escritura.
2 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: b) ¿Qué variables haría falta declarar en la zona de memoria compartida? ¿Qué variables pueden causar los problemas descritos en el apartado anterior? c) Indica al menos una solución para este tipo de problemas y explica brevemente como funciona.
3 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: Problemas 1. (2 puntos) Dado el siguiente código: main (){ int pid, int i; int nhijos = 0; int valor; char buffer[80); for (i=0; i<3;i++) pid=fork(); } sprintf(buffer, “Valor pid: %d, mi pid: %d\n”, pid, getpid()); write(1,buffer,strlen(buffer)); while (wait(&valor) >0) { nhijos++; } sprintf(buffer, “Hijos acabados: %d\n”, nhijos); write(1,buffer,strlen(buffer)); } a) Representa el árbol de procesos que crea. Asigna a cada proceso un identificador cualquiera para poderlo utilizar en las siguientes preguntas.
4 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: b) Escribe el/los mensaje/s que mostrará cada proceso en salida estándar indicando el identificador del proceso que escribe el mensaje y el contenido exacto del mensaje.
Para ello utiliza los identificadores que has asignado en el apartado anterior.
c) ¿Existe algún conflicto en el uso de la variable nhijos? Si en lugar de ser una variable local fuera global, ¿habría algún conflicto? 5 Examen Final de SO Grau Nombre alumno: DNI: 2.
Fila,columna: (3 puntos) Tenemos el siguiente código en el que dos procesos se comunican mediante una pipe con nombre llamada “mipipe”: main (){ int fd,pid_h,ret,valor; char buffer[80]; char msg[80]; fd=open(“mipipe”,O_RDWR); if (fd<0){ perror(“Error abriendo la pipe”); exit(1); } pid_h = fork(); if (pid_h < 0) { perror(“Error creando proceso”); exit(1); } sprintf(buffer,”Hola, soy %d\n”,getpid()); if (pid_h == 0){ ret=read(fd,msg,sizeof(msg)); msg[ret]=’\0’; write(1, msg, strlen(msg)); write(fd,buffer,strlen(buffer)); exit(0); } write(fd,buffer,strlen(buffer)); ret=read(fd,msg,sizeof(msg)); msg[ret]=’\’0’; write(1,msg,strlen(msg)); wait(&valor); } El objetivo es que el proceso padre envíe por la pipe un mensaje con su pid a su hijo y a continuación reciba por la pipe un mensaje con el pid del hijo. Por su parte el hijo está a la espera de recibir el mensaje con el pid del padre y a continuación envía el suyo por la pipe. Padre e hijo mostrarán por salida estándar el mensaje que cada uno ha recibido por la pipe. Podéis suponer que la pipe está creada con antelación y con los permisos adecuados.
a) ¿Los mensajes enviados a través de las pipes son los que se esperan? 6 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: b) ¿Se puede garantizar que el resultado será el esperado? ¿Por qué? ¿Qué otro comportamiento podemos tener? Propón y describe dos soluciones diferentes para garantizar que el resultado será siempre el descrito en el enunciado.
c) Si en lugar de utilizar una pipe con nombre se utilizara una pipe sin nombre, ¿afectaría de alguna manera al resultado? d) Modifica el código para que se utilicen pipes sin nombre y el resultado sea siempre el descrito en el enunciado.
7 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: 3. (3 puntos) Tenemos la siguiente lista de Inodos y bloques de un sistema de ficheros basado en UNIX. Los Inodos 9 y 10 están libres, así como el bloque 9.
Inodo 2 3 4 5 6 7 8 Tipo dir dir dat dat dir dir Link Bloques 2 3 5 6 7 4 8 #ref 5 2 1 1 2 2 2 9 10 Bloques 2 3 4 5 .
2 .
3 .
7 ..
2 ..
2 ..
2 A 3 a 4 c 8 B 6 b 8 C 7 8 ABCDEFG HIJKLMN OPQRSTU VWXYZ 6 4 2 7 7 8 .
6 ..
2 e 5 /B/e 9 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: a) Dibuja el grafo de directorios.
b) Indica qué actualizaciones se producirán tanto en los Inodos como en los bloques mostrados en el enunciado si ejecutamos las siguientes líneas de comandos (NOTA: “wc –c” devuelve por la salida estándar el número de caracteres que lee por la entrada estándar): > ls / > /C/d > cat /A/b | wc –c >> /C/d Inodo 2 3 4 5 6 7 8 dir dir dat dat dir dir Link Bloques 2 3 5 6 7 4 8 #ref 5 2 1 1 2 2 2 Tipo 9 10 Bloques 2 9 3 4 5 .
2 .
3 .
7 ..
2 ..
2 ..
2 A 3 a 4 c 8 B 6 b 8 C 7 ABCDEFG HIJKLMN OPQRSTU VWXYZ 6 4 2 7 7 8 .
6 ..
2 e 5 /B/e 9 Examen Final de SO Grau Nombre alumno: DNI: Fila,columna: c) Describe qué accesos a disco se hacen al ejecutar la siguiente secuencia de sentencias, asumiendo que no hay buffer cache. Puedes asumir que el superbloque está cargado en memoria y que cada I-nodo tiene el tamaño de un bloque.
main(){ int fd; int ret; char c; fd = open(“/A/b”,O_RDONLY); ret = read(fd,&c,sizeof(c)); while (ret > 0){ write(1, &c, sizeof(c)); ret = read(fd,&c,sizeof(c)); } close(fd); } 10 ...