DISEÑO Y ADMINISTRACIÓN DE SISTEMAS OPERATIVOS Material permitido: Texto base y calculadora. Tiempo: 90 minutos. Febrero de 2021 AvEx Aviso 1: El formato y el orden en el que se presentan las preguntas en la herramienta AvEx es diferente para cada estudiante. Examen AvEx Debido a las circunstancias excepcionales provocadas por el COVID19 ha sido necesario adaptar el modelo de Examen de Diseño y Administración de Sistemas Operativos para su evaluación en la plataforma AvEx. Cada estudiante ha realizado un examen diferente cuyas preguntas han sido seleccionadas aleatoriamente de la siguiente forma: Bloque 1 (5 preguntas de 1 punto de entre las siguientes) Número 1 (1 punto). Explique razonadamente si las siguientes afirmaciones son verdaderas o falsas: a) (0.5 p) El mayor problema de seguridad en un sistema de ficheros s5fs proviene del superbloque. b) (0.5 p) Una de las principales limitaciones del planificador del UNIX BSD4.3 es que presenta inversión de prioridades. RESPUESTA: A) Es cierta, El mayor problema de seguridad proviene del superbloque que contiene información vital sobre el sistema de ficheros como por ejemplo la lista de bloques libres y el tamaño de la lista de nodos-i libres y cada sistema de ficheros contiene una única copia de su superbloque. (ver 8.8.8 Análisis del s5fs) B) También es cierta, la planificación tradicional de UNIX tiene inversión de prioridades (ver 5.4.4 Análisis) Número 2 (1 punto) Explica razonadamente si las siguientes afirmaciones son verdaderas o falsas: a) (0.5 p) En un intérprete de comandos de UNIX la pulsación de las teclas [control + w] permite borrar todo el contenido de la línea de órdenes. b) (0.5 p) En un sistema UNIX la entrada de un fichero en un directorio constituye un enlace simbólico para el fichero. RESPUESTA A) Falso, sólo borra una palabra “word”, para borrar toda la línea hay que pulsar ctrl+u (ver página 83). B) Falso, cada entrada de un directorio es un enlace duro al fichero que apunta (ver 8.5 Enlaces simbólicos) Número 3 (1 punto) Se tiene un computador con una memoria principal de capacidad CMP= 16 Mbytes y un tamaño de página SP = 1Kbyte. Calcula el número total de marcos de página. RESPUESTA El número de marcos de página se calcula a partir de la fórmula 5 del tema 7: NTM=CMP/SP= 24·220/210=214=16384 marcos de página. Número 4 (1 punto) Razona brevemente si es verdadera o falsa cada una de las siguientes afirmaciones: a) (0.5 puntos) Un cambio de contexto es el conjunto de tareas que debe realizar el núcleo para aplazar o finalizar la ejecución del proceso actualmente en ejecución y comenzar o continuar con la ejecución de otro proceso. b) (0.5 puntos) Las interrupciones son atendidas en modo usuario dentro del contexto del proceso que se encuentra actualmente en ejecución, aunque dicha interrupción no tenga nada que ver con la ejecución de dicho proceso. RESPUESTA A) Cierto, ver página 144. B) Falso, son atendidas en modo núcleo, ver 3.7 Tratamiento de las interrupciones Número 5 (1 punto) Razona brevemente si es verdadera o falsa cada una de las siguientes afirmaciones: a) (0.25 puntos) Unix clasifica la interfaz del driver en función de que este sea de modo bloque o de modo carácter. b) (0.25 puntos) El núcleo de UNIX sólo llama a un driver cuando se produce una interrupción en el dispositivo asociado. c) (0.25 puntos) La parte superior del driver está aislada del área U del proceso invocador. Esto produce una protección efectiva de la memoria. d) (0.25 puntos) Todos los drivers controlan dispositivos físicos. RESPUESTA A es correcta (ver la página 418 del libro base). El resto son falsas ya que el núcleo llama al driver en muchos más supuestos (pag 419) como en el arranque del dispositivo las operaciones E/S o las instrucciones de control. La parte superior del driver puede acceder al área U del proceso invocador, la parte inferior no. Y la última es falsa debido a la existencia de pseudodispositivos como men o /dev/null (pag 418). Número 6 (1 punto) En un directorio existe un único fichero de texto “prueba.txt” cuyo contenido es “hola”, el propietario del fichero invoca las siguientes acciones en un terminal: $ ln prueba.txt texto.txt $ ln -s prueba.txt datos.txt $ rm prueba.txt ¿Después de invocar dichas acciones cuál de las siguientes afirmaciones es cierta? a) (0.25 puntos) El contador de referencias de “datos.txt” vale 2. b) (0.25 puntos) Al invocar “cat datos.txt” se imprime “hola”. c) (0.25 puntos) Al invocar “cat texto.txt” se imprime “hola”. d) (0.25 puntos) Al invocar “cat prueba.txt” se imprime “hola”. RESPUESTA La única afirmación cierta es la C). El usuario primeramente crea un enlace duro a prueba.txt (usando ln) cuyo nombre es texto.txt, esto incrementa el contador de referencias de dicho nodo-i (que en caso de no existir más referencias pasaría a valer 2). La segunda sentencia crea un enlace simbólico (ln –s) de nombre datos.txt hacia el mismo archivo prueba.txt pero esto no afecta en absoluto al nodo-i del archivo prueba.txt. Finalmente, la tercera sentencia borra el nombre prueba.txt pero no el archivo puesto que todavía existe un enlace duro que apunta hacia él (texto.txt). La respuesta A) es falsa puesto que el fichero datos.txt recién creado tiene el contador de referencias a 1 (es un enlace simbólico, no un enlace duro). B) También es falsa ya que el enlace simbólico datos.txt apunta hacia un nombre que ya no existe y se producirá un error al intentar acceder a él. C) es verdadera ya que el fichero original cuyo contenido era “hola” sigue existiendo y es accesible a través del enlace duro “texto.txt”. d) es falso ya que el nombre “prueba.txt” ha sido borrado y al intentar leerlo se producirá un error. Número 7 (1 punto) Razona brevemente si es verdadera o falsa cada una de las siguientes afirmaciones: Si debido a un fallo en la alimentación se corrompe la lista de bloques libres del sistema de un sistema de ficheros s5fs…. a) (0.25 puntos) El disco queda inutilizable. b) (0.25 puntos) No ocurre nada puesto que la lista de bloques libres sólo sirve para localizar rápidamente espacio libre en el disco. c) (0.25 puntos) Es necesario arreglar el sistema de ficheros usando las herramientas que proporciona el sistema. d) (0.25 puntos) Gracias al Journaling el sistema s5fs es capaz de detectar y arreglar el error automáticamente cuando se reinicie. RESPUESTA A es Falso, el problema puede (y debe) solucionarse usando fsck o herramientas similares (ver 8.9 Comprobación del estado de un sistema de ficheros) por ese mismo motivo C) es cierto. B Es falso ya que, es necesario hacer la reparación, de lo contrario en caso de que un bloque aparezca en la lista de bloques libres cuando en realidad está ocupado corre el peligro de ser sobrescrito por otro fichero perdiéndose sus datos. Esto es especialmente grave si el fichero es un directorio (todos los archivos podrían quedar huérfanos). Además, si un bloque no está ocupado ni tampoco en la lista de bloques libres el sistema de ficheros no podrá utilizarlo (lo que es un desperdicio de espacio, pero no tan grave como la pérdida de datos). D) También es falso ya que s5fs no implementa Journaling (ver 8.12.1.a Journaling) Número 8 (1 punto) Razona brevemente si es verdadera o falsa cada una de las siguientes afirmaciones: a) (0.5 puntos) Un sistema UNIX BSD4.3 es no expropiable, es decir, si un proceso se está ejecutando en modo núcleo no se le puede expropiar el uso de la CPU para que la use otro proceso aunque éste sea más prioritario. b) (0.5 puntos) El núcleo suministra poco apoyo para el almacenamiento temporal en los dispositivos de modo carácter. RESPUESTA A verdadera, El núcleo tradicional de UNIX es estrictamente no expropiable. Es decir, si el proceso actual se encuentra en modo núcleo (debido a una llamada al sistema o a una interrupción), no puede ser forzado a ceder la CPU a un proceso de mayor prioridad (ver 5.4 Planificación tradicional en UNIX). B verdadera La interfaz de los dispositivos modo bloque suministra un apoyo razonable para la asignación y gestión del espacio de almacenamiento temporal (buffers). No obstante, no existe este esquema uniforme para los dispositivos modo carácter (véase 9.6.1 Motivación). Número 9 (1 punto) Razona brevemente si es verdadera o falsa cada una de las siguientes afirmaciones: a) b) c) d) (0.25 puntos) d_close() es invocado cada vez que un proceso deja de usar un dispositivo. (0.25 puntos) c_open() se encarga de la apertura de dispositivos de modo carácter. (0.25 puntos) b_open() se encarga de la apertura de los dispositivos de modo bloque. (0.25 puntos) d_strategy() puede modificar el orden en el que se realizan las operaciones de E/S. RESPUESTA A) es falsa ya que d_close() se invoca cuando se libera la última referencia al dispositivo, es decir, cuando ningún proceso tiene este dispositivo abierto. B) y C) son falsas ya que existe un único método d_open() que puede abrir dispositivos de tipo bloque y caracter. D) es cierta: d_strategy() se llama así ya que el driver puede usar alguna estrategia para reordenar las peticiones pendientes con objeto de optimizar el rendimiento del dispositivo (ver 9.4.4 Puntos de entrada de un driver). Bloque 2 (1 pregunta de 2 puntos de entre las siguientes) Número 10 (2 puntos) Se parte del fichero ordinario test, con permiso de lectura y escritura para el propietario, y permisos de lectura para el resto de los usuarios. Los bits S_ISUID , S_ISGID y S_ISVTX están desactivados. Escriba los comandos que hay que aplicar sucesivamente para para que los permisos del fichero sigan la siguiente secuencia: a) b) c) d) - rwrwrwrw- ---w-w-w- r—rwrwx rwt RESPUESTA Existen múltiples formas válidas de hacerlo, a continuación, se muestra una de ellas. Se parte de la siguiente máscara de modo simbólica: - rw- r-- r-A) Es necesario eliminar el permiso de lectura para el grupo, para ello puede usarse la siguiente orden: $ chmod g-r test B) Basta con añadir permisos de lectura a todos los usuarios $ chmod a+w test C) Se requiere aplicar permisos de ejecución al resto de usuarios, por ejemplo, usando la siguiente orden: $ chmod o+x test D) La diferencia respecto al modo anterior que en octal es 0627 es que en este caso el sticky bit está activado (t). Para activar dicho bit basta con hacer: $ chmod 1627 test Número 11 (2 puntos) Supóngase que el directorio de trabajo actual de un usuario contiene tres ficheros ordinarios (datos, foto.jpg, listas.txt) y tres subdirectorios (fotos, videos, correo). Explica razonadamente cual sería el resultado de la ejecución de las siguientes órdenes desde la línea de comandos ($) de un terminal UNIX: a) (0.5 p) $ echo *s b) (0.5 p) $ echo * c) (0.5 p) $ echo foto? d) (0.5 p) $ echo foto* RESPUESTA A) El comodín se expande a un número cualesquiera de caracteres de modo que se muestran todos los ficheros que acaben en “s”, es decir “datos fotos videos” B) El comodín se expande a todos los ficheros y directorios y se muestra “correo datos foto.jpg fotos listas.txt videos” C) La interrogación se expande a un carácter por lo que se muestra “fotos” pero no foto.jpg D) Se muestran todos los ficheros que comiencen por “foto” es decir “foto.jpg fotos” Bloque 3 (1 problema de 3 puntos) Problema (3 puntos) (3 puntos) Conteste razonadamente a los siguientes apartados: a) (2 p) Explique brevemente qué hace el siguiente programa y cuál es su salida cuando el código se compila en el fichero ejecutable examen, se ejecuta con la orden ./examen DyASO y no se produce ningún error. b) (0.5 p) Si no se ejecutase la línea [21] ¿Qué ocurriría? c) (0.5 p) ¿Por qué no se usan instrucciones de espera (wait) ni es necesario imprimir inmediatamente las salidas (fflush) para que la salida sea siempre la misma y no haya condiciones de carrera? RESPUESTA Parte A: El programa comprueba que hay dos argumentos de entrada, el primero es el nombre del ejecutable y el segundo “DyASO”. En caso contrario emite un mensaje de error y sale del programa (exit) con código de retorno -1. Entonces, mediante la función signal asocia la señal SIGALARM con la función fun1, esto significa que cuando se reciba la citada señal se ejecutará la función fun1. La sentencia if comprueba si se ha producido un error y en caso afirmativo imprime dicho error con perror y finaliza el programa con código de retorno -2. A continuación, la llamada a sistema time almacena en la posición de memoria donde se encuentar x el tiempo actual medido en segundos (desde el 1 de enero de 1970). Hecho esto el proceso realiza la llamada al sistema alarm pasándole 7 como argumento, esto programa una alarma de tiempo real que se disparará transcurridos 7 segundos. Seguidamente la llamada al sistema pause que detiene el proceso hasta que reciba una señal que no esté bloqueada o ignorada. Cuando hayan pasado 7 segundos y se dispare la alarma el sistema operativo envía la señal SIGALARM al proceso, eso hace que se despierte y se ejecute en primer lugar el manejador de la señal fun1 que imprime un salto de línea y a continuación “Recibo señal:” seguido de la cadena de texto que describe dicha señal (obtenida mediante strsingal) Cuando fun1 acaba el programa continúa ejecutándose por la línea 18 (la inmediatamente siguiente a “pause” que acaba de concluir), de este modo se vuelve a medir el tiempo y se almacena en la variable y. Puesto que han pasado 7 segundos al calcular el resultado se obtiene 7 y por lo tanto la línea [20] imprime “7 DyASO correcto” ya que DyASO era el segundo argumento a la función (argv[1]). La instrucción [21] envía una señal SIGTERM al proprio proceso, el proceso al recibirla emite un mensaje de terminación y finaliza su ejecución inmediatamente, de modo que [21] no llega a ejecutarse. Por lo tanto, el programa espera 7 segundos y la salida es: recibo señal: Alarm clock ¡Problema 7 DyASO correcto! Terminado Parte B: Si no se enviase la señal SIGTERM el programa ejecutaría la línea [22] e imprimiría el mensaje ¡Erróneo! Parte C: Todo ocurre en el contexto de un único proceso (no hay forks) que además tiene un único hilo de ejecución, por eso no hay problemas de sincronización ni hace falta usar wait ni fflush. Estas instrucciones se utilizan cuando se quiere sincronizar la terminación de los procesos o utilizar la salida estándar por orden cuando hay varios procesos/hilos.