AMPLIACIÓN DE SISTEMAS OPERATIVOS (71023016) Material permitido: Solo calculadora no programable Tiempo: 2 horas N Septiembre 2015 Aviso 1: Todas las respuestas deben estar debidamente razonadas. Aviso 2: Escriba con buena letra y evite los tachones. Aviso 3: Solución del examen y fecha de revisión en http://www.uned.es/71023016/ 1. Conteste razonadamente a los siguientes apartados: a) (1 p) Enumerar y comentar brevemente las estructuras de datos utilizadas en Windows NT 6.0 para implementar la seguridad. b) (1 p) ¿Qué es la capa anónima de Solaris? ¿Qué funciones desempeña? 2. (2 p) Defina los siguientes conceptos: núcleo no expropiable, núcleo expropiable y puntos de expropiación. 3. (2 p) Enumerar las principales características de un sistema de archivos UFS. 4. (2 p) Explique razonadamente cuál sería el resultado de la ejecución de las siguientes órdenes: a) sort < X > Y b) ls -l > dtrat c) X=$(date) d) more ∼/fer.dat AMPLIACIÓN DE SISTEMAS OPERATIVOS (71023016) Material permitido: Solo calculadora no programable Tiempo: 2 horas N Septiembre 2015 Aviso 1: Todas las respuestas deben estar debidamente razonadas. Aviso 2: Escriba con buena letra y evite los tachones. Aviso 3: Solución del examen y fecha de revisión en http://www.uned.es/71023016/ 5. (2 p) En la Figura 1 se muestra el código C del programa s2015. Supóngase que al invocar este programa desde la línea de ordenes de un intérprete de comandos en un SOBUNIX se crea un proceso con PID=1000 y que la asignación de los PIDs de los procesos hijos, si se llegaran a crear, se realizaría incrementando en una unidad el PID del proceso padre. Suponer además que el intérprete de comandos desde donde se lanza s2015 tiene asociado PID=925. Conteste razonadamente si a los siguientes apartados: a) (1 p) Explique la utilidad de la funciones pthread_create y pthread_join. b) (1 p) Determinar el número de procesos y de hilos que produce la ejecución del proceso PID=1000 asociado al programa s2015. #include <stdio.h> #include <pthread.h> void *fun1(void *id); void *fun2(void *id); main() { pthread_t hu1,hu2; pthread_create(&hu1, NULL, *fun1, NULL); pthread_create(&hu2, NULL, *fun2, NULL); pthread_join(hu1, NULL); pthread_join(hu2, NULL); } void *fun1(void *id) { for(;;); } void *fun2(void *id) { int i=0; for(i=0;i<4;i++) printf("\nMensaje2"); pthread_exit(NULL); } Figura 1 – Código C del programa s2015 UNED - Ampliación de Sistemas Operativos (Cód. 71023016) Solución Examen Septiembre 2015 AMPLIACIÓN DE SISTEMAS OPERATIVOS (Cód. 71023016) Solución Examen Septiembre 2015 Solución Ejercicio 1 a) La implementación de la seguridad en Windows se basa principalmente en el uso de las siguientes estructuras de datos: – Ficha de acceso (access token). Cuando un usuario se autentifica Windows asigna al primer proceso creado para el usuario, el proceso explorer.exe que implementa el escritorio, una ficha de acceso que es heredada por todos los procesos que cree dicho proceso inicial debido a la interacción del usuario con el escritorio. Una ficha de acceso es una estructura que contiene, entre otros, los siguientes datos: ◦ Identificador de seguridad del usuario al que pertenece el proceso. En Windows cada usuario tiene asociado un identificador de seguridad (Security IDentifier, SID), que lo identifica de forma univoca. El SID es un número binario largo parte del cual se genera aleatoriamente. El SID de un proceso puede ser obtenido usando la función LookupAccountSid. ◦ Identificador de seguridad del grupo de usuarios al que pertenece el proceso. Similar al SID de usuario pero aplicado a nivel de grupo. ◦ Grupos. Especifica los grupos a los que pertenece el usuario. Este campo es necesario para implementar la API POSIX. ◦ Lista de control de acceso discrecional. Es la lista de control de acceso asignada por defecto a los objetos creados por el proceso. ◦ Privilegios. Permiten proporcionar a un proceso permisos para realizar ciertas tareas reservadas para el administrador, como por ejemplo apagar el computador o el acceso a ciertos archivos. – Descriptor de seguridad. En Windows cuando se crea un objeto se le asigna un descriptor de seguridad que es una estructura de datos que especifica las operaciones que pueden realizar los diferentes usuarios sobre el objeto. Contiene, entre otros, los siguientes datos: SID del usuario propietario del objeto, SID del grupo propietario del objeto y un puntero a la lista de acceso discrecional (Discretionary Access Control List, DACL) asociada al objeto. La DACL del objeto contiene una o varias entradas. Cada entrada contiene un SID (de usuario o de grupo), el estado asociado a dicha entrada: permitir o denegar, y el conjunto de operaciones seleccionadas sobre el objeto. b) Sobre la memoria anónima el núcleo trabaja usando un determinado conjunto de funciones que constituyen la denominada como capa anónima, entre las funciones que forman parte de esta capa se encuentran las siguientes: – anon_alloc. Esta función permite obtener una página anónima nueva. – anon_dup. Esta función duplica las referencias a un conjunto de páginas anónimas. Se utiliza durante el tratamiento de la llamada al sistema fork para duplicar en el espacio del proceso hijo un segmento del proceso padre que tiene páginas anónimas. El efecto de esta operación es incrementar en una unidad el contador de referencias de las estructuras anon de cada página anónima del segmento compartida por el padre y el hijo. – anon_free. Elimina las referencias a un conjunto de páginas anónimas. El efecto de esta operación es decrementar en una unidad el contador de referencias de las estructuras anon de cada página privada del conjunto. Solamente cuando el contador alcanza el valor 0 se puede eliminar dicha página anónima y dejar la estructura anon desasignada. 1 UNED - Ampliación de Sistemas Operativos (Cód. 71023016) Solución Examen Septiembre 2015 – anon_private. Hace una copia privada de una página y le asigna una estructura anon. – anon_zero. Crea una página llena de ceros y le asigna una estructura anon. Solución Ejercicio 2 Un núcleo se dice que es no expropiable si a una unidad planificable ejecutándose en modo núcleo no se le puede expropiar el uso del procesador. Sólo se le puede expropiar en los siguientes casos: para tratar las interrupciones, cuando regresa a modo usuario o cuando entra en el estado dormido a la espera de que ocurra algún evento. Ejemplos de SOBUNIX de núcleo no expropiable son SVR3 y BSD 4.3. Este tipo de núcleos son más propensos a sufrir el problema de la inversión de prioridad, sin embargo reducen el número de mecanismos de sincronización usados en el núcleo. Por el contrario, un núcleo se dice que expropiable si a una unidad planificable ejecutándose en modo núcleo se le puede expropiar el uso del procesador. En este caso, conviene tener presente que con objeto de garantizar la integridad de las estructuras del núcleo existen algunas regiones de código del núcleo en las que no está permitida la expropiación. A dichas regiones se les denomina puntos de no expropiación. Un ejemplo de SOBUNIX de núcleo expropiable es Solaris. La implementación de un núcleo expropiable requiere que las estructuras del núcleo estén protegidas por mecanismos de sincronización. Algunos SOBUNIX, como por ejemplo SVR4, aplican una medida intermedia que consiste en permitir la expropiación del núcleo sólo en determinados puntos del código del núcleo denominados puntos de expropiación. En estos puntos se garantiza que las estructuras de datos del núcleo se encuentran en un estado consistente. En estos sistemas una unidad planificable ejecutándose en modo núcleo solo puede ser expropiada cuando alcanza un punto de expropiación. Solución Ejercicio 3 Las características principales de un sistema de archivos UFS son las siguientes: • Trabaja con un tamaño de bloque de datos de 4 KiB o 8 KiB. Además para reducir la fragmentación interna cada bloque se divide en fragmentos que pueden ser asignados individualmente. De esta forma la fragmentación interna promedio pasa de ser de medio bloque a medio fragmento. Tanto el tamaño de bloque como el número de fragmentos (1, 2, 4 o 8) se fija al crear el sistema de archivos. • Tiene en cuenta la geometría del disco a la hora de alojar los nodos-i y los bloques de datos de los archivos. Con ello se consigue mejorar el rendimiento del sistema ya que se reduce el tiempo de búsqueda de las cabezas de lectura/escritura del disco, y en consecuencia, el tiempo de las operaciones de E/S. • Por motivos de seguridad mantiene varias copias del superbloque, que es una estructura de datos que contiene información administrativa y estadística de todo el sistema de archivos. Si solo existiese una copia del superbloque, como pasaba en los sistemas de archivos S5FS, y ésta se corrompiera debido algún error en el disco todo el sistema de archivos quedaría inutilizado. • Las entradas de los directorios son de tamaño variable y pueden ser compactadas para reducir la fragmentación. El nombre de un archivo puede tener hasta 255 caracteres. • Soporta enlaces simbólicos los cuales pueden ser creados con la llamada al sistema symlink. • Soporta la llamada al sistema rename que permite renombrar de forma atómica a un archivo o directorio. Con el uso de rename se evita tener que invocar primero a la llamada al sistema link para crear un enlace duro que establezca el nuevo nombre del archivo y a continuación usar la llamada al sistema unlink para borrar el enlace duro que establecía el nombre antiguo. 2 UNED - Ampliación de Sistemas Operativos (Cód. 71023016) Solución Examen Septiembre 2015 Solución Ejercicio 4 1) Esta orden ordena (sort) por orden alfabético las líneas del archivo X y escribe el resultado en el archivo Y. 2) Esta orden almacena en el archivo dtrat el resultado de la orden ls -l, que genera un listado largo de los archivos del directorio de trabajo incluyendo tamaño, permisos, propietario, permisos, etc. Si el archivo dtrat no existe se crea. Si el archivo ya existe se eliminará su contenido y se remplazará por la salida de la orden ls -l. 3) Esta orden define una variable para el intérprete denominada X y le asigna como valor la cadena de caracteres generada por el comando date, la cual contiene la fecha y la hora del sistema. 4) Esta orden muestra en la pantalla el contenido del archivo fer.dat ubicado en el directorio de trabajo inicial. Señalar que el nombre de ruta del archivo especificado en esta orden hace uso del comodín tilde '∼' el cual sustituye al nombre de ruta absoluta (/home o /users) del directorio que contiene los directorios de trabajo de todos los usuarios. Si se utiliza en la forma "∼/" entonces hace referencia al nombre de ruta absoluta del directorio de trabajo inicial del usuario. Solución Ejercicio 5 a) La función pthread_creat crea un hilo de usuario para ejecutar una función determinada. Por su parte, la función pthread_join suspende la ejecución del hilo de usuario que ha invocado a esta función hasta que termine la ejecución de un determinado hilo de usuario. b) La ejecución del proceso con PID=1000 asociado a la ejecución del programa s2015 no produce la creación de ningún otro proceso de usuario pero si la creación de tres hilos de usuarios. El primer hilo de usuario o hilo principal del proceso se crea implícitamente para ejecutar la función main. El segundo hilo se crea al invocar el hilo principal por primera vez a la función pthread_creat. Mientras que el tercer hilo se crea al invocar el hilo principal por segunda vez a la función pthread_creat. 3