Examen parcial de Sistemas Operativos, 30 de Abril de 2004. Segundo curso de Ingenierías Técnicas de Informática de Sistemas y de Gestión, URJC. Contesta cada pregunta en una hoja separada. No olvides poner tu grupo y titulación en cada hoja. Problema 1 (3 puntos) Tenemos un directorio que contiene, entre otras cosas, fotos: ficheros con extensión.jpg o.jpg. 1. Las fotos tienen mucha resolución. Queremos reducirlas a 800x600 puntos y publicar la versión reducida en un web. Para reducir el tamaño podemos usar el comando convert -geometry 800x600 origen destino Para publicar en el web, basta copiar al directorio public_html del home del usuario. (Suponemos este directorio existente y con la estructura necesaria). 2. Proceden de un sistema contaminado por un virus, así que hay ficheros que a pesar de su extensión, no son imágenes jpeg sino ejecutables. Si son verdaderas imágenes el comando file mostrará un mensaje similar a este. imagen01.jpg: JPEG image data, EXIF standard 0.73, 10752 x 2048 Haz un script de shell bash que reciba como primer argumento el nombre del directorio, que compruebe cada fichero, que lo reduzca y publique si está bién y que lo borre si está contaminado, mostrando un mensaje parecido a este: imagen01.jpg imagen02.jpg imagen03.jpg CONTAMINADO. Se borra el fichero. ok. Reducido y publicado. ok. Reducido y publicado. 1 ficheros contaminados y borrados 2 ficheros reducidos y publicados. Nota: Extrema el cuidado con la caligrafía de las comillas, recuerda que en UNIX tienen distintos significados. #!/bin/bash # Sería necesario comprobar que $1 existe y que es un directorio, # aunque por simplificar, aqui no lo hemos pedido publicados=0 1
contaminados=0 cd $1 for i in ls *.[jj][pp][gg] do if file $i grep -i jpeg then convert -geometry 800x600 $i $HOME/public_html/$i publicados= echo $publicados+1 bc done echo $i ok. reducido y publicado else rm $i echo $i CONTAMINADO. Se borra el fichero contaminados= echo $contaminados+1 bc fi echo echo $contaminados ficheros contaminados y borrados $publicados ficheros reducidos y publicados Problema 2 (4 puntos) Escribir un programa que, utilizando llamadas al sistema de UNIX haga lo siguiente: 1. Al ejecutarlo desde el shell, quiero que el shell me devuelva el prompt y me pida la siguiente linea de comandos al tiempo que se pone a ejecutar el programa El programa debe ejecutar el comando ping aquamar cada segundo, e imprimir un mensaje siempre que dicho comando falle. La tercera vez que falle, ha de acabar su ejecución 2. Supongamos que en el sistema solo esta ejecutando el shell desde el que ejecuto dicho programa, y que se emplea un scheduler con planificacion por prioridades dinamicas y round-robin (cuanto = 0.5 segundos, dos niveles de prioridad, se sube la prioridad si no se consume el cuanto, se baja en caso contrario). Dibuja el diagrama de planificación (tiempo y estado de planificacion de cada proceso) para la ejecución del apartado 1. // Ejecuta ping aquamar. Devuelve 1 si el comando // no se ha podido ejecutar o si su ejecucion acabo // insatisfactoriamente. 2
function ejecutar : integer is status: integer; p := fork(); case p of -1: return 1; 0: execl("/bin/ping", "ping", "aquamar", nil); exits(1); endcase; wait(status address); if status /= 0 then return 1; else return 0; endif; // La implementacion de lo que hace este programa // Ejecuta un ping cada segundo y aborta si hay mas // de tres fallos de ejecucion en el ping. procedure problema is nfallos : integer; nfallos := 0; loop sleep(1); // duermo un segundo nfallos := nfallos + ejecutar(); if nfallos > 3 then write(2, "el ping falla mas de 3 veces", 28); exit(1); endif; // El programa principal. No hace el trabajo, hace un fork // para que sea un hijo el que ejecuta el codigo. procedure principal is p := fork(); case p of -1: exit(1); 0: problema(); endcase; // no hay procesos exit(0); // el padre se va 3
El shell ejecuta el programa, y luego pasa a leer la siguiente linea. Se pasa el tiempo bloqueado. Main arranca el hijo y muere. El hijo se pasa la vida arrancado un nieto para el ping y esperando a que este acabe. Supongo que ninguno de ellos acaba su cuanto, por lo que todos estan a alta prioridad. A pesar de ser round robin, el hijo tiene suficiente con menos de un cuanto para arrancar al nieto, por lo que el diagrama queda como sigue. Problema 3 (3 puntos) En el año 2020 se han suprimido todas las señales de tráfico, incluidos los semaforos viales. Cada coche esta gobernado automáticamente por un programa. Hay una zona de la ciudad con la geometría de la figura, con dos calles de sentido único que se cruzan doblemente. En cada recodo caben N=7 vehículos. Cada coche debe atravesar las dos intersecciones para salir de la zona, y está garantizado que cuando sale de la segunda no hay coches que le impidan continuar. Calle B INTERSECCION Y Calle A INTERSECCION X 1. Podría haber interbloqueos en este problema? Por qué? 4
2. Se pide programar con semáforos el código de cada coche, los que avanzan por la calle A y los que avanzan por la calle B, para que no haya choques (por una intersección sólo puede pasar un coche al tiempo) ni atascos perpetuos o innecesarios en esta zona de la ciudad. La norma de cortesía de no entrar en una intersección si no se puede progresar más allá sigue vigente. 1. Sí pueden presentarse interbloqueos. Si llegan 8 coches uno detras de otro por cada calle y el octavo ocupa la interseccion antes de darse cuenta de que no puede avanzar más, entonces se llega a una situación en la que no hay avance posible. Los coches de una calle estan esperando a que los de la otra liberen una intersección, y viceversa. 2. Se tiene un mutex por cada una de las intersecciones (mutex-x, mutex-y) y semáforos con 7 plazas para cada uno de los recodos (Recodo-A, Recodo-B). El pseudocódigo de un coche que avanza por la calle A sería el siguiente: avanza hasta interseccion X wait(recodo-a) wait(mutex-x) pasa intersección X signal(mutex-x) avanza hasta interseccion Y wait(mutex-y) pasa intersección Y signal(mutex-y) signal(recodo-a) El código del vehículo que avanza por la calle B sería el homólogo. 5