Problema 1 (3 puntos)

Descargar (0)

Texto completo

(1)

Examen parcial de Sistemas Operativos

,

30 de Abril de 2004.

Segundo curso de Ingenier´ıas T´ecnicas de Inform´atica de Sistemas y de Gesti´on, URJC.

Contesta cada pregunta en una hoja separada. No olvides poner tu grupo y titulaci´on en cada hoja.

Problema 1 (3 puntos)

Tenemos un directorio que contiene, entre otras cosas, fotos: ficheros con extensi´on .jpg o .JPG.

1. Las fotos tienen mucha resoluci´on. Queremos reducirlas a 800x600 puntos y publicar la versi´on reducida en un web.

Para reducir el tama˜no podemos usar el comando

convert -geometry 800x600 origen destino

Para publicar en el web, basta copiar al directorio public_htmldel 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´on, no son im´agenes jpeg sino ejecutables. Si son verdaderas im´agenes el comando file mostrar´a 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´a bi´en y que lo borre si est´a con-taminado, mostrando un mensaje parecido a este:

imagen01.jpg CONTAMINADO. Se borra el fichero. imagen02.jpg ok. Reducido y publicado.

imagen03.jpg 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.

Soluci´

on

#!/bin/bash

# Ser´ıa necesario comprobar que $1 existe y que es un directorio, # aunque por simplificar, aqui no lo hemos pedido

(2)

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 ‘

echo $i ok. reducido y publicado else

rm $i

echo $i CONTAMINADO. Se borra el fichero contaminados=‘echo $contaminados+1 | bc‘ fi

done

echo $contaminados ficheros contaminados y borrados echo $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´on

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´on (tiempo y estado de planificacion de cada proceso) para la ejecuci´on del apartado 1.

Soluci´

on

// Ejecuta ping aquamar. Devuelve 1 si el comando // no se ha podido ejecutar o si su ejecucion acabo

(3)

function ejecutar : integer is status: integer; begin 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; end;

// 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; begin

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; end;

// El programa principal. No hace el trabajo, hace un fork // para que sea un hijo el que ejecuta el codigo.

procedure principal is begin

p := fork(); case p of -1:

exit(1); // no hay procesos 0:

problema(); endcase;

exit(0); // el padre se va end;

(4)

El shell ejecuta el programa, y luego pasa a leer la siguiente linea. Se pasa el tiempo blo-queado.

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˜no 2020 se han suprimido todas las se˜nales de tr´afico, incluidos los semaforos viales. Cada coche esta gobernado autom´aticamente por un programa.

Hay una zona de la ciudad con la geometr´ıa de la figura, con dos calles de sentido ´unico 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´a garantizado que cuando sale de la segunda no hay coches que le impidan continuar.

Calle A

Calle B

INTERSECCION X

(5)

2. Se pide programar con sem´aforos el c´odigo 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´on s´olo 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´on si no se puede progresar m´as all´a sigue vigente.

Soluci´

on

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´as, entonces se llega a una situaci´on en la que no hay avance posible. Los coches de una calle estan esperando a que los de la otra liberen una intersecci´on, y viceversa. 2. Se tiene un mutex por cada una de las intersecciones (mutex-X, mutex-Y) y sem´aforos

con 7 plazas para cada uno de los recodos (Recodo-A, Recodo-B).

El pseudoc´odigo 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´on X signal(mutex-X)

avanza hasta interseccion Y wait(mutex-Y)

pasa intersecci´on Y signal(mutex-Y) signal(Recodo-A)

Figure

Actualización...

Referencias

Related subjects :