SISTEMAS OPERATIVOS II Solución examen mayo 2006 SOLUCION EXAMEN mayo 2006 1. Explique razonadamente si las siguientes afirmaciones son verdaderas o falsas: I) (1 p) El núcleo del UNIX SVR3 mantiene fundamentalmente tres tipos de estructuras de datos para implementar la política de memoria mediante demanda de páginas: las tablas de páginas, la tabla de datos de los marcos de página y la tabla de intercambio. II) (1 p) En el UNIX BSD4.3 cuando un proceso completa una llamada al sistema y va a retornar a modo usuario, su prioridad de planificación es configurada al valor que se encontraba almacenado en el campo p_cpu de su entrada asociada en la tabla de procesos. Solución: I) El núcleo mantiene fundamentalmente cuatro tipos de estructuras de datos para implementar la política de memoria mediante demanda de página: las tablas de páginas, las tablas de descriptores de bloques de disco, la tabla de datos de los marcos de página y la tabla de intercambio. En conclusión la afirmación es FALSA. II) Cuando un proceso completa la llamada al sistema y va a retornar a modo usuario, su prioridad de planificación es configurada a su prioridad en modo usuario actual, es decir, al valor que se encontraba almacenado en el campo p_usrpri de su entrada asociada en la tabla de procesos. Indicar que el campo p_cpu contiene el tiempo transcurrido desde que el proceso utilizó por última vez la CPU, también denominado uso reciente de la CPU. En conclusión la afirmación es FALSA. 1 SISTEMAS OPERATIVOS II Solución examen mayo 2006 2 Conteste razonadamente a las siguientes cuestiones relativas al algoritmo inthand() del núcleo de UNIX. a)(0.5 p) ¿Para que usa el núcleo este algoritmo?. b)(1.5 p)¿Cuáles son las principales acciones que realiza este algoritmo? Solución: a) El núcleo invoca al algoritmo inthand() para el tratamiento de las interrupciones. b) Se van a utilizar, por simplificar, las siguientes abreviaturas: • npi, es el nivel de prioridad de interrupción actual almacenado en el registro de estado del procesador. • npii, es el nivel de prioridad de interrupción asociado a un determinado tipo de interrupción. El algoritmo inthand() realiza principalmente las siguientes acciones: 1) Salvar el contexto del proceso actual. 2) Elevar el nivel de prioridad de interrupción. Es decir, se hace npi=npii. Por tanto, las interrupciones que lleguen con un nivel de prioridad de interrupción igual o menor que npi quedan bloqueadas o enmascaradas temporalmente. De esta forma se logra preservar la integridad de las estructuras de datos del núcleo. 3) Obtener el vector de interrupción. Normalmente, las interrupciones aparte del npii pasan al núcleo alguna información que le permite identificar el tipo de interrupción de que se trata. En un sistema con interrupciones vectorizadas, cada dispositivo suministra al núcleo un número único denominado número del vector de interrupción que se utiliza como un índice en una tabla, denominada tabla de vectores de interrupción. Cada entrada de esta tabla es un vector de interrupción, que contiene, entre otras informaciones, un puntero al manejador o rutina de servicio de la interrupción apropiado. 4) Invocar al manipulador o rutina de servicio de la interrupción. 5) Restaurar el contexto del proceso, una vez que se ha concluido la rutina de servicio de la interrupción. 2 SISTEMAS OPERATIVOS II Solución examen mayo 2006 3 (2 p) Explique razonadamente las ventajas y las desventajas que poseen los ficheros FIFO frente a las tuberías sin nombre. Solución: Los ficheros FIFO poseen las siguientes ventajas sobre las tuberías sin nombre: • Tienen un nombre en el sistema de archivo. • Pueden ser accedidos por procesos sin ninguna relación familiar. • Son persistentes, es decir, continúan existiendo hasta que un proceso los desenlaza explícitamente. Por tanto son útiles para mantener datos que deban sobrevivir a los usuarios activos Asimismo, los ficheros FIFO poseen las siguientes desventajas con respecto a las tuberías sin nombre: • Deben ser borrados de forma explícita cuando no son usados. • Son menos seguros que las tuberías, puesto que cualquier proceso con los privilegios adecuados puede acceder a ellos. • Son difíciles de configurar y consumen más recursos. 3 SISTEMAS OPERATIVOS II Solución examen mayo 2006 4. (1.5 p) Explique brevemente el significado de los elementos de la siguiente línea del fichero /etc/passwd apolo:*2Xc6QoVK024pR:506:302:Loreto Gracia:/home/apolo/work:/bin/bash Solución: El significado de los elementos de esta línea es el siguiente: • apolo es el nombre de usuario. • 2Xc6QoVK024pR es la clave encriptada. El asterisco * que aparece al principio de la clave en esta línea está indicando que la cuenta de este usuario se encuentra actualmente deshabilitada. • 506 es el uid. • 302 es el gid. • Loreto Gracia es el nombre completo del usuario. • /home/apolo/work es el directorio de trabajo inicial. • /bin/bash es el intérprete de comandos inicial. 4 SISTEMAS OPERATIVOS II Solución examen mayo 2006 5. Conteste razonadamente a los siguientes apartados: a) (1.25 p) Explicar el significado de cada una las sentencias marcadas con []de este código. b) (1.25 p) Si j06 es el ejecutable que resulta de compilar este programa y al ejecutarlo se le asigna el pid 526, explique el funcionamiento del programa tras terminar de ejecutar las siguientes dos ordenes desde la línea de comandos: 1) $ j06 & 2)$ kill -SIGUSR1 526 #include <signal.h> void f1(int sig); [1] main() { long x; int k,h; struct sistema{ int A[2][2]; int b; }uno,*sis; [2] [3] [4] [5] [6] [7] sis=&uno; sis->b=3; signal(SIGUSR1,f1); [8] for (h=0;h<2;h++) { for (k=0;k<2;k++) sis->A[h][k]=(k*h)%uno.b; } [9] [10] [11] [12] [13] [14] if (h<2) uno.A[h-1][k-1]=12; else x=sigsetmask(sigmask(SIGUSR1)); [15] [16] pause(); printf("\n%d %d\n%d %d\n", uno.A[0][0],uno.A[0][1],uno.A[1][0],uno.A[1][1]); [17] [18] } { void f1(int sig) printf("\nAsd2341\n"); } Solución: a) El significado de cada una de las sentencias marcadas con [] de este código es el siguiente: [1] Declaración de la función principal main del programa, que en este caso no posee parámetros de entrada ni de salida. [2] Declaración de la variable x de tipo entero largo. [3] Declaración de la variables k y h de tipo entero. [4] Se define el tipo de estructura sistema que consta de dos campos. El primer campo A es una matriz o array bidimensional entero de dos filas y dos columnas. El segundo campo b es un número entero. Asimismo en esta sentencia se declara la estructura uno del tipo sistema y el puntero *sis a una estructura del tipo sistema. 5 SISTEMAS OPERATIVOS II Solución examen mayo 2006 [5] Se asigna al puntero sis la dirección de la estructura uno. [6] Se asigna el valor 3 al campo b de la estructura uno, mediante el uso del puntero sis. [7] Llamada al sistema signal que asigna el manejador f1 a las señales del tipo SIGSUR1 (Señal 1 definida por el usuario). [8] Bucle for cuyo índice de control h se inicializa al valor h=0. La condición que debe ser satisfecha para que se continúe la ejecución del bucle es que h sea menor de 2. El índice se incrementa en una unidad (h++) al finalizar una ejecución del bucle. En cada ejecución del bucle se ejecutan las sentencias [9] y [10]. [9] Bucle for cuyo índice de control k se inicializa al valor k=0. La condición que debe ser satisfecha para que se continúe la ejecución del bucle es que k sea menor de 2. El índice se incrementa en una unidad (k++) al finalizar una ejecución del bucle. En cada ejecución del bucle se ejecuta la sentencia [10]. [10] Se multiplica k por h. Al valor obtenido se le divide por el valor del campo b de la estructura uno. El resto de esta división entera se asigna al elemento [h][k] del campo A de la estructura uno mediante el uso del puntero sis. [11] Sentencia condicional if, para comprobar si el valor de h es menor de 2. En caso afirmativo se ejecuta la sentencia [12]. [12] Se asigna el valor 12 al elemento [h-1][k-1] del campo A de la estructura uno. [13] Sentencia condicional else asociada con la sentencia [11]. En el caso de que el valor de h no sea menor de 2 se ejecuta [14]. [14] Llamada al sistema sigsetmask para bloquear la recepción de las señales del tipo SIGUSR1. En la variable x se almacena la máscara de señales original que se tenía especificada antes de invocar a esta llamada al sistema. [15] Llamada al sistema pause, hace que el proceso que la invoca quede a la espera de la recepción de una señal que no ignore o que no tenga bloqueada. [16] Función printf, para escribir el valor de los cuatro elementos del campo A de la estructura uno en el dispositivo de salida estándar (típicamente el monitor) de acuerdo con la siguiente cadena de control “\n%d %d\n%d %d\n“. Es decir, en pantalla se mostraría lo siguiente: un salto de línea, el valor entero de A[0][0], un espacio en blanco, el valor entero de A[0][1], un salto de línea, el valor entero de A[1][0], un espacio en blanco, el valor entero de A[1][1] y un salto de línea. 6 SISTEMAS OPERATIVOS II Solución examen mayo 2006 [17] Declaración de la función f1, que no devuelve ningún parámetro de salida y que recibe como entrada el número entero que identifica a una señal. [18] Función printf para escribir en el dispositivo de salida estándar, de acuerdo, a la siguiente cadena de control “\nAsd2341\n”. Es decir, en pantalla se mostraría lo siguiente: un salto de línea, la cadena de caracteres Asd2341 y un salto de línea. b) 1)La ejecución desde la línea de comandos de la orden $ j06 & hace que se comience a ejecutar en segundo plano del terminal un proceso A instancia del fichero ejecutable j06, al que de acuerdo con el enunciado se le asigna un pid=526. Dicho proceso en primer lugar asigna al puntero sis la dirección de la estructura uno. En segundo lugar asigna el valor 3 al campo b de la estructura uno, mediante el uso del puntero sis. En tercer lugar invoca a la llamada al sistema signal que asigna el manejador f1 a las señales del tipo SIGSUR1. En cuarto lugar, mediante el uso de dos bucles for anidados, asigna los siguientes valores a los elementos del campo A de la estructura uno: A[0][0]=0,A[0][1]=0, A[1][0]=0, A[1][1]=1. En quinto lugar, comprueba si el valor de h es menor de 2. La comprobación es negativa, ya que h=2, por lo que invoca a la llamada al sistema sigsetmask para bloquear la recepción de las señales del tipo SIGUSR1. Finalmente, invoca a la llamada al sistema pause que hace que el proceso A quede espera de la recepción de una señal que no ignore o que no tenga bloqueada. b) 2) La orden $ kill -SIGUSR1 526, envía al proceso con pid=526 (el proceso A) una señal SIGUSR1. Como el proceso A tiene bloqueadas dicho tipo de señales, el proceso permanece en segundo plano a la espera de recibir una señal que no ignore o que no tenga bloqueada. 7