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

Descripción

SO

Vista previa del texto

Primer parcial de teoría 2013_2014_Q1 Nombre alumno: DNI: Fila,columna: Grupo de teoría: Preguntas cortas (2,5 puntos) (justifica todas las respuestas) 1.
Si tenemos una nueva arquitectura, con un nuevo conjunto de instrucciones de lenguaje máquina, indica cuál de estas dos librerías deberíamos reprogramar (no compilar, sino reprogramar completamente) y porqué: librería de C y librería de sistema.
La librería de sistema porque es la que incluye la traducción de la llamada en alto nivel, por ejemplo el write, al kernel, por lo tanto incluye tanto la instrucción de lenguaje máquina para invocar al kernel como el paso de parámetros etc, que es dependiente de la arquitectura.
2.
Tenemos un sistema que ofrece la política de planificación Round Robin (tal y como la hemos explicado en clase) con un quantum de 10ms. Por simplicidad, asumiremos que los procesos solo realizan cálculo (1 ráfaga) y cada uno de ellos necesita 40ms de cpu. También por simplificar asume que todos llegan en tiempo=0 pero entran en la cola de ready en orden P0, P1, P2 y P3. Calcula cuanto tiempo de ejecución (total) tendrá cada uno de ellos y cuanto tiempo de espera.
Explicación: el tiempo de ejecución es el Tfin-Tinicio. Como todos los procesos empiezan en Tinicio=0, hay que aplicar la política para ver cuantos quantums son necesarios hasta completar los 40 ms de tiempo de cpu.
P0 P1 P3 P3 P0 P1 P3 P3 P0 P1 P3 P3 P0 P1 P3 P3 0 10 20 30 40 50 60 70 80 100 110 120 130 140 150 160 Tiempo de ejecución: El primero acabara en T=130, el segundo T=140, el tercero=T50 y el cuarto T=160 Los tiempos de espera : P0= 130-40=90ms, P1=140-40=100ms, P2=150-40=110ms, P3=16040=120ms 3.
¿Qué información contiene el TLB y en qué momentos se actualiza? El TLB contiene traducciones de páginas (de página a marco) que ya se han realizado previamente. Se actualiza cada vez que accedemos a una nueva página (por lo tanto la traducción aún no se ha hecho) y cada vez que hay un cambio de contexto, ya que se invalida todo el TLB.
4.
Nos dan la siguiente secuencia de secuencia de código y nos piden analizarla: 1.
2.
3.
4.
5.
int i=0,pid; pid=fork(); while ((pid==getpid()) && (i<3)) { i++; pid=fork();} sprint(buffer,”Hello world\n”); write(1,buffer,strlen(buffer)); ¿Cuántas veces se escribirá el mensaje de la línea 5? 1 Primer parcial de teoría 2013_2014_Q1 Nombre alumno: DNI: Fila,columna: Grupo de teoría: 2, porque el bucle de la línea 3 no hace ninguna iteración.
5.
Si tenemos un sistema que ofrece memoria virtual en el cual tenemos 4Gb de espacio lógico (máquina de 32 bits), 4Gb de memoria física instalada y 1 Gb de área de swap. ¿Cuál será el tamaño máximo de un proceso en este sistema? Será 4Gb porque un proceso no puede ser mayor que el espacio lógico Procesos y memoria (4 puntos) Tenemos el siguiente código (obviamos el control de errores para reducir el tamaño del código), que corresponde a los programas calcula_N.c y calcula.c: /// 1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
/// 1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
1.
Programa calcula_N void main(int argc,char *argv[]) { int num_tareas=atoi(argv[1]); int i; char b[64]; for (i=0;i<(num_tareas-1);i++){ pid=fork(); sprint(b,”%d”,i); if (pid==0){ execlp (“calcula”,”calcula”,b,(char *)NULL);} } sprintf(b,”%d”,num_tareas-1); execlp(“calcula”,”calcula”,b,(char *)null); while(waitpid(-1,NULL,0)>0); sprintf(b,”Acabo!\n”); write(1,b,strlen(b)); exit(0); } Programa calcula int main(int argc,char *argv[]) { char nombre_fichero[128]; sprintf(nombre_fichero,”Fichero_con_datos.%d”,atoi(argv[1])); int *datos,suma; datos=sbrk(1000*sizeof(int)); // RellenaVector: Lee del fichero y guarda el contenido en el vector, el ultimo // parámetro es el numero de elementos RellenaVector(nombre_fichero,datos,1000); suma=calculaSuma(datos,1000); // GuardaResultado(&suma); exit(1); } Dibuja el árbol de procesos que se genera si ejecutamos el programa de la siguiente forma (asigna a cada proceso un número para referirte a él más adelante: 2 Primer parcial de teoría 2013_2014_Q1 Nombre alumno: DNI: Fila,columna: Grupo de teoría: #calcula_N 10 Inicial(9) 0 1 2 3 4 5 6 7 8 Explicación: la creación de procesos se hace de forma iterativa, los hijos mutan, por lo que no continúan iterando y el proceso inicial es el que genera toda la jerarquía 2.
Indica qué proceso(s) mutarán al programa “calcula” y con qué parámetro Mutarán todos. El número en el dibujo indica el parámetro que recibirán.
3.
¿Qué proceso(s) ejecutarán el bucle de la línea 13 del programa calcula_N? Ninguno, porque los hijos mutan en el bucle de la línea 6, por lo que no salen del bucle, y el inicial muta al salir de ese bucle, por lo que tampoco continúa. Solo se ejecutaría en caso de fallar el execlp pero en este tipo de casos asumimos que no falla.
4.
Ejecutamos este programa en un sistema que implementa CoW basado en paginación, donde el tamaño de página son 4Kb. Sabemos que el programa “calcula” ocupa: 3Kb de código, 1KB de datos, 4KB de pila y 4 KB de heap. Calcula cuanta memoria física necesitamos para tener todos los procesos que hayan mutado al programa calcula a la vez ejecutándose.
Como todos los procesos mutan no comparten nada. Necesitamos (4 paginas por proceso)*10 procesos=40paginas= 160KB. Hay que considerar que una página tampoco puede albergar más de una región (código y datos no comparten página) 5.
¿En qué región de memoria encontraremos las variables nombre_fichero, datos y suma del programa calcula? En la pila ya que las tres son variables locales 6.
Miramos el fichero maps de uno de los procesos que ejecutan el programa calcula y nos encontramos las siguientes regiones (entre otras).
3 Primer parcial de teoría 2013_2014_Q1 Nombre alumno: DNI: 00400000-00401000 r-xp 00000000 fe:01 12206190 00600000-00601000 r--p 00000000 fe:01 12206190 00601000-00602000 rw-p 00001000 fe:01 12206190 00602000-00603000 rw-p 00000000 00:00 0 7fffdb043000-7fffdb064000 rw-p 00000000 00:00 0 Fila,columna: Grupo de teoría: /home2/users/professors/pr_proso/so/calcula /home2/users/professors/pr_proso/so/calcula /home2/users/professors/pr_proso/so/calcula [heap] [stack] ¿Qué valor tendrá la variable datos? Tendrá el valor 00602000 que es el inicio del heap Procesos y signals (3,5 puntos) Queremos ejecutar un cálculo limitando el tiempo dedicado a ese trabajo a 10 segundos: si sobrepasamos el límite de tiempo habrá que mostrar por pantalla el mensaje “Tiempo excedido!!” y acabar. Nos planteamos dos posibles implementaciones. En la versión A, el cálculo se hace en un programa separado; en la versión B, el cálculo es una función del mismo ejecutable inicial. A continuación tenéis una propuesta de código para ambas versiones (no aparece ni el código de prog_calc ni de func_calc porque no es relevante para el ejercicio).
// Versión A // Versión B 1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
1.
void trat_signal (int s) { char buf[80]; sprintf (buf, “Tiempo excedido!!”); write(1, buf, strlen(buf)); exit(1); } main() { char buf[80]; signal (SIGALRM, trat_signal); alarm(10); execlp(“./prog_calc”,”prog_calc”,NULL); alarm(0); sprintf (buf, “Fin de calculo!!\n”); write(1,buf,strlen(buf)); } void trat_signal (int s) { char buf[80]; sprintf (buf, “Tiempo excedido!!”); write(1, buf, strlen(buf)); exit(1); } main() { char buf[80]; signal (SIGALRM, trat_signal); alarm(10); func_calc(); alarm(0); sprintf (buf, “Fin de calculo!!\n”); write(1,buf,strlen(buf)); } Para cada versión de código, ¿es posible que se ejecute la llamada a alarm (0)? Si es así indica qué condiciones se tienen que cumplir.
4 Primer parcial de teoría 2013_2014_Q1 Nombre alumno: DNI: Fila,columna: Grupo de teoría: VERSION A Sólo se ejecutará si el exec provoca error y no es capaz de mutar (si no hay errores nunca se ejecutará) VERSION B Se ejecutará si func_calc tarda menos de 10 segundos en acabar 2.
Supón que el cálculo dura más de 10 segundos ¿Cuál será el comportamiento de cada uno de estos códigos? VERSION A El proceso recibirá SIGALRM y se ejecutará el tratamiento asociado según el ejecutable prog_calc, ya que al mutar se pierde la reprogramación del signal. Si en ese código no se ha reprogramado se ejecutará el tratamiento por defecto que es matar al proceso.
VERSION B El proceso recibirá SIGALRM y se ejecutará la función trat_signal, mostrará el mensaje “Tiempo excedido!!” y acabará 3.
Modificamos ahora el código de ambas versiones para que se cree un proceso hijo que se encargue de hacer el cálculo. A continuación tienes la nueva versión de ambos códigos (hemos marcado en negrita los cambios con respecto al código anterior). Si el cálculo dura más de 10 segundos, ¿cuál será ahora el comportamiento en cada versión? ¿Se finalizará el cálculo a los 10 segundos tal y como se quería? 5 Primer parcial de teoría 2013_2014_Q1 Nombre alumno: DNI: Fila,columna: Grupo de teoría: // Versión A // Versión B 1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
void trat_signal (int s) { char buf[80]; sprintf (buf, “Tiempo excedido!!”); write(1, buf, strlen(buf)); exit(1); } main() { int pid; char buf[80]; signal (SIGALRM, trat_signal); alarm(10); pid = fork(); if (pid == 0) { execlp(“./prog_calc”,”prog_calc”,NULL); alarm(0); } else { waitpid(-1,NULL,0); sprintf (buf, “Fin de calculo!!\n”); write(1,buf,strlen(buf)); } } void trat_signal (int s) { char buf[80]; sprintf (buf, “Tiempo excedido!!”); write(1, buf, strlen(buf)); exit(1); } main() { int pid; char buf[80]; signal (SIGALRM, trat_signal); alarm(10); pid = fork(); if (pid == 0) { func_calc(); alarm(0); } else { waitpid(-1,NULL,0); sprintf (buf, “Fin de calculo!!\n”); write(1,buf,strlen(buf)); } } VERSION A El temporizador lo ha programado el proceso padre por lo que al pasar los 10 segundos será él el que reciba el SIGALRM y ejecutará la función trat_signal (no ha mutado y por tanto no ha perdido la reprogramación). El hijo no finalizará su ejecución a los 10 seg. como se quería sinó que continuará hasta que acabe.
VERSION B El comportamiento será el mismo que en la versión A, ya que el temporizador lo ha programado el padre, y la diferencia entre ambas versiones es el código del hijo que no afecta al comportamiento del temporizador. El hijo no finalizará su ejecución a los 10 seg. como se quería sinó que continuará hasta que acabe.
6 ...