documento 82

13
1 Sistemas Operativos I 2º de Ingeniería Informática Soluciones a los ejercicios propuestos A continuación se recogen las soluciones de algunos de los ejercicios propuestos más significativos. Los ejercicios sin solucionar o han sido vistos en caso, o su solución es mecánica. En cualquier caso, quien necesite ver si sus soluciones son correctas, no tengo inconveniente en revisarlas. ?? Temas 1 y 2: Introducción a los sistemas operativos, y Procesos y hebras 1. Diga cuales de las siguientes operaciones pueden realizarse únicamente en modo supervisor, o modo kernel: a) Consultar la hora del sistema. Modo usuario y modo kernel b) Cambiar la fecha del sistema. Modo kernel c) Leer una pista/sector de un disco magnético. Modo kernel d) Generar una interrupción software. Modo usuario y modo kernel e) Generar una interrupción. Modo Kernel f) Modificar la dirección de un vector de la tabla de vectores de interrupción. Kernel g) Deshabilitar las interrupciones. Modo kernel 1. En el caso de un ordenador que se vaya a usar únicamente para un único usuario, ¿qué interés puede tener la existencia de los modos de funcionamiento supervisor/usuario? Los modos de funcionamiento en sistemas monousuario protegen al sistema operativo de errores en los programas de usuario. P. ej. si MS-DOS funcionara con dos modos de funcionamiento sería más robusto frente a errores en los programas. 2. Cuestiones sobre procesos, y asignación de CPU: a) Es necesario que lo último que haga todo proceso antes de finalizar sea una llamada al sistema para finalizar. ¿Sigue siendo esto cierto en sistemas monoprogramados? Siempre es necesario, pues debemos liberar los recursos utilizados y dejarlos bajo el control del SO (p. ej. memoria, PCB, etc.). Si no hacemos esto explícitamente mediante la llamada al sistema correspondiente (por ejemplo, exit), el enlazador la inserta por nosotros. b) Cuando el controlador de un dispositivo produce una interrupción ¿se produce necesariamente un cambio de contexto?, y ¿cuando se produce una llamada al sistema?

Upload: samuporro

Post on 01-Jan-2016

752 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Documento 82

1

Sistemas Operativos I 2º de Ingeniería Informática

Soluciones a los ejercicios propuestos A continuación se recogen las soluciones de algunos de los ejercicios propuestos más significativos. Los ejercicios sin solucionar o han sido vistos en caso, o su solución es mecánica. En cualquier caso, quien necesite ver si sus soluciones son correctas, no tengo inconveniente en revisarlas. ??Temas 1 y 2: Introducción a los sistemas operativos, y

Procesos y hebras 1. Diga cuales de las siguientes operaciones pueden realizarse únicamente en modo supervisor, o

modo kernel: a) Consultar la hora del sistema. Modo usuario y modo kernel b) Cambiar la fecha del sistema. Modo kernel c) Leer una pista/sector de un disco magnético. Modo kernel d) Generar una interrupción software. Modo usuario y modo kernel e) Generar una interrupción. Modo Kernel f) Modificar la dirección de un vector de la tabla de vectores de interrupción. Kernel g) Deshabilitar las interrupciones. Modo kernel

1. En el caso de un ordenador que se vaya a usar únicamente para un único usuario, ¿qué interés puede tener la existencia de los modos de funcionamiento supervisor/usuario?

Los modos de funcionamiento en sistemas monousuario protegen al sistema operativo de errores en los programas de usuario. P. ej. si MS-DOS funcionara con dos modos de funcionamiento sería más robusto frente a errores en los programas.

2. Cuestiones sobre procesos, y asignación de CPU: a) Es necesario que lo último que haga todo proceso antes de finalizar sea una llamada

al sistema para finalizar. ¿Sigue siendo esto cierto en sistemas monoprogramados?

Siempre es necesario, pues debemos liberar los recursos utilizados y dejarlos bajo el control del SO (p. ej. memoria, PCB, etc.). Si no hacemos esto explícitamente mediante la llamada al sistema correspondiente (por ejemplo, exit), el enlazador la inserta por nosotros.

b) Cuando el controlador de un dispositivo produce una interrupción ¿se produce

necesariamente un cambio de contexto?, y ¿cuando se produce una llamada al sistema?

Page 2: Documento 82

2

Según la definición vista en teoría, utilizamos el término cambio de contexto para referirnos a un relevo en el proceso actual. Otros autores, utilizan "cambio de contexto" para referirse a un cambio del contexto de ejecución, o de otra forma, lo que nosotros llamamos cambio de modo. Esta confusión terminológica proviene del echo de que cuando pasamos de modo usuario a modo supervisor, debemos guardar el contexto de ejecución de modo usuario para reponerlo al volver de nuevo a el.

En concreto, cuando se produce una interrupción o se realiza una llamada al sistema, debemos salvar el contexto de ejecución si estamos en modo usuario, antes de pasar a modo kernel, pero no hay cambio de contexto según nuestra definición. Si se produce una interrupción y estamos en modo kernel, también debemos salvar el modo de ejecución antes de ejecutar el manejador de interrupciones.

¿Dónde se guarda la información asociada al cambio de contexto de ejecución? Lo veréis en SOII

c) Cuando un proceso se bloquea, ¿deberá encargarse él directamente de cambiar el

valor de su estado en el descriptor de proceso?

d) Sea un proceso que cambia de Ejecutándose a Bloqueado, ¿puede este cambio provocar un cambio de estado en otros procesos? Si es así, ¿en qué casos?

e) Idem para el cambio de estado Bloqueado a Ejecutable.

4. (*) ¿Qué debería hacer el planificador a corto plazo cuando es invocado pero no hay ningún

proceso en la cola de ejecutables? Inicialmente podríamos pensar en incluir en el código de planificador algunas líneas de código que comprueben la existencia de procesos disponibles para ejecutarse y si no los hubiese podríamos iniciar una espera ocupada o bien parar en procesador. El coste de ejecución de este fragmento de código es elevado por el número de veces que hay que realizarlo. Para optimizar la ejecución, se encontró otra solución más elegante, no tocar el código de planificador y evitar la situación descrita en el enunciado previendo siempre un proceso preparado para ejecutarse. Por tanto este proceso no debe bloquearse nunca y debe tener la prioridad más baja del sistema para no interferir con la planificación del resto de los proceso. Afortunadamente, no tenemos que diseñar este proceso, que recibe el nombre genérico de proceso nulo, pues en la mayoría de sistemas hay proceso de sistema que son utilizables para esta labor, por ejemplo el swapper en el caso de UNIX/Linux y la hebra Balance Set Manager en el caso de Windows 2000.

5. ¿Qué algoritmos de planificación quedan descartados para ser utilizados en sistemas de

tiempo compartido?

Page 3: Documento 82

3

6. La representación gráfica del cociente [(tiempo_en_cola_ejecutables + tiempo_de_CPU) / tiempo_de_CPU ] frente a tiempo_de_CPU suele mostrar valores muy altos para ráfagas muy cortas en casi todos los algoritmos de asignación de CPU. ¿Por qué?

7. Para cada una de las llamadas al sistema siguientes, especificar y explicar si su procesamiento por el sistema operativo requiere la invocación del planificador a corto plazo:

a) Crear un proceso. b) Abortar un proceso, es decir, terminarlo forzosamente. c) Suspender o bloquear un proceso. d) Reanudar un proceso (inversa al caso anterior). e) Modificar la prioridad de un proceso.

8. (*) ¿ Por qué no es el interprete de ordenes (shell) parte del propio sistema operativo ?

9. El modelo cliente-servidor es muy utilizado en sistemas distribuidos. ¿ Puede utilizarse este modelo en sistemas de un único computador?

10. En los primeros ordenadores, cada byte de datos leído o escrito, era manejado directamente por la CPU ( es decir, no existía DMA - Acceso Directo a Memoria). ¿ Qué implicaciones tenía esta organización para la multiprogramación?

El DMA libera en gran medida a la CPU de controlar la transferencia de información de memoria a los dispositivos o de los dispositivos a memoria, por tanto se puede dedicar mayor tiempo a realizar trabajo útil, lo que permite un mayor grado de multiprogramación del sistema.

11. Considere un sistema operativo (p. ej. Solaris o Windows NT) que tiene implementados tanto procesos como hebras. a) ¿Cuál es la diferencia entre un proceso y una hebra en tal sistema? b) ¿Cuál es la ventaja de tener procesos y hebras en un sistema operativo?

Simplemente repaso de teoría.

12. Sea un sistema multiprogramado que utiliza el algoritmo Round-Robin. Sea S el tiempo que tarda el despachador en cada cambio de contexto. ¿Cuál debe ser el valor de quantum Q para que el porcentaje de uso de la CPU por los procesos de usuario sea del 80%?

13. Sea un sistema multiprogramado que utiliza el algoritmo Round-Robin. Sea S el tiempo que tarda el despachador en cada cambio de contexto, y N el número de procesos existente. ¿Cuál debe ser el valor de quantum Q para que se asegure que cada proceso “ve” la CPU al menos cada T segundos?

14. ¿Tiene sentido mantener ordenada por prioridades la cola de procesos bloqueados? Si lo tuviera, ¿ en qué casos sería útil hacerlo?

Inicialmente, no tiene sentido la ordenación de esta cola pues no puede asegurar que los eventos por los que esperan los procesos de diferente prioridad ocurran temporalmente ordenados en función de la prioridad de los mismos. Por ejemplo, un

Page 4: Documento 82

4

proceso de baja prioridad espera una lectura de disco y uno de mayor prioridad espera una entrada de teclado.

Si tendría sentido, para aquellos casos en que hay una cola de procesos bloqueados por posibles causas de bloqueo, de forma que todos los procesos de la cola esperan por lo mismo, por ejemplo, procesos bloqueados que espera por un búffer de memoria.

15. ¿Puede el procesador manejar una interrupción mientras esta ejecutando un proceso si la política de planificación que utilizamos es no apropiativa?

Las implementaciones tradicionales de SOs “esconden” las interrupciones, es decir, los procesos y gran parte de los módulos del SO no conocen nada del estado de las interrupciones que es conocido sólo por las capas más bajas el SO. En especial el planificador no debe saber nada sobre las interrupciones. Así cuando hablamos de sistema no apropiativo debemos entender que lo que se quiere decir es que no podemos invocar al planificador hasta que el proceso voluntariamente ceda el control de la CPU. Por tanto, aunque el sistema sea no apropiativo podemos atender interrupciones. Eso sí, cuando la interrupción sea atendida, debemos ceder el control de la CPU sólo al proceso que lo tenía antes de la ocurrencia de la interrupción.

16. Suponga que es responsable de diseñar e implementar un sistema operativo que va a utilizar una política de planificación apropiativa. Suponiendo que tenemos desarrollado el algoritmo de planificación a tal efecto, ¿qué otras partes del sistema operativo habría que modificar para implementar tal sistema? y ¿cuales serían tales modificaciones?

Evidentemente es un importante el módulo que implementa el algoritmo de planificación, pero no menos importante el mecanismo de activación o disparo del mismo, es decir, cuando invoco al módulo que realiza la planificación. Una de las razones por las que apropiar a la tarea en curso es que haya finalizado su cuantum o que hay una tarea preparada (por ejemplo, finalizo una e/s pendiente) de mayor prioridad. En ambos casos, (fin de plazo o de e/s) la notificación se conoce como resultado de una interrupción y por tanto el lugar natural para invocar al planificador es desde el propio manejador de interrupciones, que debe modificarse para invocar al planificador.

17. Suponga que es el propietario de un kiosco de helados denominado Bola de Nieve. El kiosco es atendido por un solo dependiente. La persona que desea un helado se dirige al kiosco, solicita un único helado que cuesta 3 Ptas., espera que lo despache, paga y se marcha. Cuando hay más de un cliente, se forma una cola, que la experiencia nos dice que nunca esta compuesta por más de tres personas (cuando alguien se acerca y ve más de tres personas en la cola se marcha a un competidor próximo). Un estudio de mercado indica que en media se acercan al mostrador una persona por minuto. Supón que realizas una prueba para contratar un dependiente y se presentan dos candidatos presentados, Pepe y Juan. Tras la prueba,

Page 5: Documento 82

5

descubres que Pepe atiende a un cliente en 20 segundos de media, mientras que Juan lo hace en 30 segundos, pero mientras que Pepe te pide un sueldo de 12 Ptas. hora Juan lo hará por 6 Ptas. hora. Teniendo todos estos factores en cuenta, ¿qué persona te trae más cuenta contratar teniendo en cuenta que te interesa obtener los mejores beneficios?

Comentado en clase.

18. Sean los cinco procesos descritos es la tabla siguiente

Proceso Tiempo de creación Tiempo de CPU

A B C D E

4 0 1 8 12

1 5 4 3 2

Si suponemos que tenemos un algoritmo de planificación que utiliza una política: a) FIFO (Primero en llegar, primero en ser servido), Calcular: b) Tiempo medio de respuesta c) Tiempo medio de espera d) La penalización, es decir, el cociente entre el tiempo de finalización y el tiempo de CPU.

4. Utilizando los valores de la tabla del problema anterior, calcular los tiempos medios de espera y respuesta para los siguientes algoritmos: a) Round-robin con quantum q=1 b) Round-robin con quantum q=4 c) El más corto primero (SJF)

4. Calcular el tiempo de espera medio para los procesos de la tabla utilizando el algoritmo Primero el de tiempo restante menor (SRTF).

Proceso Tiempo de creación Tiempo de CPU

A B C D E

0 1 3 9 12

3 1 12 5 5

21. Utilizando la tabla del ejercicio anterior, dibujar el diagrama Gantt para el caso de un sistema

que utiliza un algoritmo de colas múltiples con realimentación con las siguientes colas

Cola Prioridad Quantum

Page 6: Documento 82

6

1 2 3

1 2 3

4 2 1

y suponiendo que : (a) los procesos entran en la cola de mayor prioridad (mayor valor numérico), y (b) un proceso en la cola i pasa a la cola i+1 si consumen un quantum completo.

21. Consideremos los procesos cuyo comportamiento se recoge en la tabla siguiente

Proceso Tiempo creación

Comportamiento CPU Bloqueo CPU Bloqueo CPU Bloqueo CPU

A B C D

0 1 2 4

1 1 2 4

2 1 1 -

1 1 2 -

2 2 1 -

1 1 1 -

- - 1 -

- - 1 -

Dibujar el diagrama de ocupación para los siguientes algoritmos:

a) FIFO b) Round-robin, con q=1 c) Prioridades, suponiendo que las prioridades son 3 para A y B, 2 para C, y 1 para D.

d) Primero el más corto, suponiendo que la estimación de cada ráfaga coincide con la duración de la ráfaga anterior.

21. Suponga que debe maximizar la eficiencia de un sistema multiusuario y que está recibiendo quejas de muchos usuarios sobre los pobres tiempos de respuesta (o tiempos de vuelta) de sus procesos. Los resultados obtenidos con una herramienta de monitorización del sistema nos muestran que la CPU se utiliza al 99'9% de su tiempo y que los procesadores de E/S están activos solo un 10% de su tiempo. ¿Cuales pueden ser las razones de estos tiempos de respuesta pobres y por qué?

a) el quantum en la planificación Round-Robin es muy pequeño. b) la memoria principal es insuficiente.

c) el sistema operativo tiene que manejar mucha memoria principal por lo que las rutinas de gestión de memoria están consumiendo todos los ciclos de CPU.

d) la CPU es muy lenta. e) el quantum en la planificación Round-Robin es muy grande.

Un cuantum pequeño genera sobrecarga pero no malos tiempos de respuesta. Si la memoria principal fuese insuficiente los procesadores de dispositivos estarían más ocupados por ejemplo accediendo a disco si utilizamos intercambio o paginación por demanda. La complejidad de la gestión de memoria no tiene que ver el tamaño de la misma. Si la CPU fuese muy lenta, hubiésemos obtenido un 100% de ocupación. Por último, un cuantum grande si nos da unos tiempo de respuesta malos y es compatible con los valores mostrados por la herramienta de vigilancia.

Page 7: Documento 82

7

21. Cinco trabajos esperan para ejecutarse en un sistema de computación. Sus tiempos de ejecución esperados son 9,6,3,5 y X. ¿En qué orden deberán ejecutarse si se desea minimizar el tiempo medio de espera? (Su respuesta dependerá de X).

??Tema 3: Sincronización y comunicación entre procesos 1. Cuando ocurre el evento por el cual un proceso está bloqueado, se invoca a un

procedimiento, que denominaremos Desbloquear, para colocar el proceso en la cola de planificación correcta. Antes de realizar ninguna otra acción este procedimiento deshabilitar (desactivar) las interrupciones. Explique por qué. La cola de bloqueado es una sección crítica que debemos proteger del acceso simultáneo de los procesos (procesos que se bloquean) y los manejadores de interrupciones (desbloquean a procesos para los cuales a tenido lugar el evento que esperaban). El mecanismo que sincronización que utilizamos en este caso es deshabilitar/habilitar las interrupciones ya que uno de los flujos de control implicados son los manejadores de interrupciones.

2. Para calcular el número combinatorio (n k) = n(n-1)(n-2)...(n-k+1)/k!, desarrollamos un programa con dos procesos. El proceso P1 calcula el numerador y deposita el resultado en una variable compartida, denominada x, mientras que P2 calcula el factorial y deposita el valor en la variable y. Sincronizar los procesos P1 y P2, utilizando semáforos, para que el proceso P2 realice la división, es decir x/y.

Declaración-inicialización de variables globales y semáforos n, k, x=1, i=1: enteros s:=0 : semáforos

P1 P2 For i = n-k+1 to n do Begin x:=x+i; end signal (s)

y:=1 for j=2 to k do begin y:=y*j; end wait(s) escribir (x/y);

Nota: En los primeros problemas propuestos, vamos a dibujar una caja en la que aparece:

(a) el recuadro superior contiene la declaración-inicialización de variables globales y semáforos necesarias para el ejercicio, (b) dos o más recuadros verticales que contiene fragmentos del código de los procesos. Se deja al lector el completar tanto las declaraciones-inicializaciones necesarias así como el código necesario para resolver el ejercicio.

Page 8: Documento 82

8

1. Sean los procesos P1, P2 y P3, cuyas secuencias de instrucciones son las que se muestran en el cuadro. Sincronizar los procesos de forma que las secuencias b en P1, f en P2, y h en P3, sean ejecutadas como mucho por dos procesos simultáneamente.

Declaración-inicialización de variables y semáforos S:= 2: semáforo

P1 P2 P3 while true do begin a wait(s) b signal(s) c end

while true do begin d wait(s) e signal(s) f end

while true do begin g wait(s) h signal(s) i end

1. Dos procesos P1 y P2 se pasan información a través de una estructura de datos, ED. Sea un entero, n, que indica en todo momento el número de elementos útiles en ED y cuyo valor inicial es 0. El proceso P2 retira de ED en cada ejecución el último elemento depositado por P1, y espera si no hay elementos a que P2 ponga más. Supón que ED tiene un tamaño ilimitado, es decir, es lo suficientemente grande para que nunca se llene.

Declaración-inicialización de variablesy semáforos ex:=1, algo:=0: semáforos

P1 P2 While true do dato_calculado:= calcular_dato(); wait(ex) n:=n+1; DE[n]:=dato_calculado; signal(ex); signal(algo) end

while true do wait(algo); wait(ex); dato:=DE[n]; n:=n-1 signal(ex); operar_dato(dato); end

1. El cuadro que sigue nos muestra dos procesos concurrentes que comparten una variable global x (las restantes variables son locales a los procesos)

Declaración-inicialización de variables y semáforos var x: entero s:=0, s1:=1:semáforos

P1 P2 While true do begin wait(s); wait(s);/*apartado b*/

while true do begin wait(s1); leer_teclado (d);

Page 9: Documento 82

9

m:=2*x-n; signal(s1); signal(s1); /*apartado b*/ imprimir (m); End

x:=d-c*5 signal(s); end

a) Sincronizar los procesos para que P1 use todos los valores x suministrados por P2. b) Sincronizar los procesos para que P1 utilice un valor sí y otro no de la variable x, es

decir, utilice los valores primero, tercero, quinto, etc.

1. En la fábrica de bicicletas MountanenBike, tenemos tres operarios que denominaremos OP1, OP2 y OP3. OP1 monta ruedas, OP2 monta el cuadro de las bicicletas, y OP3, el manillar. Un cuarto operario, el Montador, se encarga de tomar dos ruedas, un cuadro y un manillar, y monta la bicicleta. Sincronizar las acciones de los tres operarios y el Montador en los siguientes casos:

a) Los operarios no tienen ningún espacio para almacenar los componentes producidos, y el Montador no podrá coger ninguna pieza si esta no ha sido fabricada previamente por el correspondiente operario. b) Los operarios OP2 y OP3 sólo tienen espacio para almacenar 10 piezas de las que producen, por tanto, deben esperar si habiendo producido 10 piezas no es retirada ninguna por el Montador. El operador OP1 tiene espacio para 20 piezas.

Declaración-inicialización de variablesy semáforos espacio1:=20, espacio2:=10, espacio3:=10:semáforos. /*apartado (b) */ R:=0,m:=0, f:= 0: semáforos

OP1 OP2 OP3 Montador while true do begin wait(espacio1); Hacer_rueda(); signal(r); End

While true do begin wait(espacio2); Hacer_cuadro(); signal(m); End

while true do begin wait(espacio3); hacer_manillar(); signal(f); End

While true do Begin wait(r ); Coge_rueda(); signal(espacio1); wait(r ); Coge_rueda(); signal(espacio1); wait(m); Coge_cuadro(); signal(espacio2); wait(f); Coge_manillar(); signal(espacio3); Montar_bici(); End

1. Sentados en una mesa del Restaurante Atreveteacomer, están dos personas, cada una de las

cuales esta tomando un plato de sopa, y entre las dos comparten una fuente de ensalada.

Page 10: Documento 82

10

Estas dos personas no tienen mucha confianza y no pueden comer las dos simultáneamente del plato de ensalada. Se pide:

a) Diseñar un programa que resuelva el problema. b) Ahora, supón que existe un camarero encargado de retirar los platos de sopa cuando estos están vacíos, es decir, cuando cada una de las personas ha tomado diez cucharadas. Solucionar esta variante teniendo en cuenta que el camarero debe cambiar los platos a las dos personas a la vez.

Declaración-inicialización de variables y semáforos

Ex:=1, s, s1,s2:=0: semáforos /* apartado b*/ Contador1,contador2:=0: enteros

Comensal-1 Comensal-2 Camarero (Apartado b) while true { if contador1=10 then {signal(s); wait(s1); contador1:=0;} tomar_una_cucharada; contador1=contador1+1 wait(ex); comer_ensalada(); signal(ex); }

while true { if contador2=10 then {signal(s); wait(s1); contador2:=0;} tomar_una_cucharada; contador2=contador2+1 wait(ex); comer_ensalada(); signal(ex); }

while true { wait(s); wait(s); quitar_sopa(); poner_sopa(); signal (s); signal(s); }

1. (**) En clase, hemos visto el problema de sincronización conocido como los filósofos-

comensales. La solución comentada en clase reduce la concurrencia de la aplicación. Diseñar una solución mejor, de entre las propuestas en clase, para solucionar este problema.

2. (**) En clase hemos enunciado el problema de los lectores-escritores, y hemos dado una solución que favorece a los lectores frente a los escritores. De una solución al problema que trate más equitativamente a ambos tipos de procesos.

Protocolo en seudocódigo

Solución:

-- Variables -- R:semáforo:=O cuenta solicitudes pendientess para leer cuando un escritor

está escribiendo y los lectores bloqueados en R. W:semáforo:=0 cuenta solicitudes pendientes para escribir cuando los lectores

leen y los escritores están bloqueados en W.

-- Escritor -- Adquirir recurso para escritura: Declarse escritor activo. Si no hay lectores ejecutándo-se, podemos

ser un escritor que escribe (cuando nos toca).

Esperar por cerrojo escritura. Escribir Liberar recurso tras escribir:

Liberar cerrojo escritura. Un escritor activo menos.

Si no hay más escritores activos y espera algún lector, despertarlo.

-- Lector -- Adquirir recurso para lectura: Declararse

lector activo. Si no hay escritores activos, puede ser un lector que lee.

LeerLiberar recurso tras lectura: Un lector activo menos.

Si no hay lectores ejecután-dose y hay algún escritor esperando, despertarlo.

Page 11: Documento 82

11

Wguarda:semáforo:=1 asegura exclusión mutua para escritura. Cguarda: semáforo:=1 asegura exclusión mutua a varios contadores que

mantienen la pista de cuantos lectores y escritores estan activos. ar cuenta los lectores activos rr lectores activos que estan leyendo aw número de escritores activos ww escritores activos que han procedido a la fase de escritura.

-- Código –

3. Esboce una solución de como un sistema operativo puede implementar semáforos con el mecanismo de habilitar/deshabilitar interrupciones.

4. No es infrecuente encontrar un computador que utiliza tanto la instrucción TestAndSet como otra primitiva de sincronización, tal como los semáforos. Estos dos tipos juegan dos papeles diferentes que no compiten entre sí. Explicar por qué ocurre esto.

5. (**) La vida real esta llena de problemas de sincronización. Uno de estos casos se da en las barberías. Suponga una barbería con un barbero, una silla para cortar el pelo y 4 sillas para que los clientes esperen sentados a que les toque su turno. Si no hay clientes, el barbero, que es bastante vago, duerme en su silla. Cuando llega un cliente debe despertar al barbero. Si llegan más clientes mientras que el barbero esta pelando y hay sillas libres, se sientan y esperan su turno. Si no hay sillas libres se van. Programar una solución para el Barbero y los Clientes que este libre de condiciones de carrera. Solución: */ Variables y semáforos */

sillas=n: var ; número de sillas para los clientes que esperan espera=0: var ; número de clientes en espera (nos permite conocer el valor del semáforo

clientes)

? Lectorwait(cguarda)ar:=ar+1if ( aw == 0 ) {

rr:=rr+1signal(R) }

signal(cguarda)wait(R)leerwait(cguarda)rr:=rr-1ar:=ar-1if ( rr==0 ) {

while ww<awww:=ww+1signal(W) }

signal(cguarda)

? Escitor

wait(cguarda)aw:=aw+1if ( rr==0 ) {

ww:=ww+1signal(W) }

signal(cguarda)wait(W)wait(wguarda)escribesignal(wguarda)wait(cguarda)ww:=ww-1aw:=aw-1if ( aw==0 ) {

while rr<arrr:=rr+1signal(R) }

signal(cguarda)

Page 12: Documento 82

12

clientes=0: semáforo; número de clientes barbero=0; semáforos ; a 0 indica que el barbero esta ocupado, a 1 esta libre mutex=1. semáforo; para exclusión mutua /* código del barbero */ /* código de un cliente */ while (true) { wait(mutex) wait(clientes); if (espera < sillas) { wait(mutex); espera=espera-1; espera= espera –1; signal(cliente); signal(barbero); signal(mutex); signal(mutex); wait(barbero); cortar_pelo(); pelarse();} } else signal(mutex); }}

6. A partir de un mecanismo de semáforos deseamos construir las rutinas enviar(buzon, mensaje) y recibir(buzon, mensaje) para implementar un mecanismo de paso de mensajes con buzones. Para ello, disponemos de una matriz BUZON de 10 elementos, cada elemento es una cadena de m caracteres, donde se almacenan los mensajes. Tenemos una variable compartida, n, que indica el número de mensajes que hay en cada momento en el buzón. Implementar:

a) Un mecanismo de designación indirecta síncrona. b) Idem del anterior, obligando al emisor a bloquearse hasta que un receptor tome el

mensaje.

Declaraciones-inicializaciones Funcion enviar(buzon, mensaje) { n:=n+1; buzon(n):= mensaje; }

funcion recibr(buzon, mensaje) { mensaje:= buzon(n); n:=n-1; }

Solución idéntica a la del problema productor-consumidor 1. Discute la viabilidad de utilizar la instrucción TestAndSet suministrada por el repertorio de

instrucciones de un multiprocesador para obtener exclusión mutua en los siguientes casos:

Page 13: Documento 82

13

a) Como mecanismo para ser utilizado en programas de usuario. b) En las rutinas de tratamiento de interrupción como método alternativo a

deshabilitar/habilitar las interrupciones total o parcialmente. c) Para implementar las operaciones wait() y signal() de los semáforos.

2. (*) Considere un ordenador que no posee la instrucción Test-and-Set, pero sí tiene una instrucción Swap(a,b) que intercambia el contenido de dos palabras de memoria (a y b) en una sola acción individual. Mostrar cómo se puede utilizar esta instrucción para resolver el problema de la exclusión mutua, es decir, diseñar el protocolo de entrada y el protocolo de salida a la sección crítica.

procedure Swap (var a,b: boolean) var temp: boolean begin

temp := a; a := b; b := temp

end Silberschatz apartado 6.3 de la 4ª edición. 3. Utilizando la instrucción test_and_set, hemos desarrollado el siguiente fragmento de código

para resolver el problema de la sección crítica: (inicialmente cerrojo = false) repeat while TestAndSet(cerrojo) do no-op; SecciónCrítica; cerrojo:= false; RestoSección; until false;

¿Cuál(es) de la(s) propiedad(es) que debe satisfacer una solución de la sección críticas no se satisface(n) con el código anterior? Justifique la respuesta.

4. La exclusión mutua utilizando semáforos se logra inicializando un semáforo a 1 (llamémoslo mutex), comenzando todas las secciones críticas con una operación wait(mutex) y finalizando todas las secciones críticas con una operación signal(mutex). ¿ Qué ocurre si un proceso que está dentro de una sección crítica realiza una operación wait(mutex) ?

5. (*) En un sistema electrónico de transferencia de fondos, existen miles de procesos idénticos que funcionan como sigue. Cada proceso lee en una línea la cantidad de dinero a transferir, el número de cuenta destinataria y el número de cuenta de origen de la transferencia. Entonces, bloquea las dos cuentas, transfiere el dinero, y libera las cuentas. Con muchos procesos así, existe un peligro real de interbloqueo (un proceso puede bloquear la cuenta x pero no puede bloquear la cuenta y porque otro proceso la tiene bloqueada y ese proceso esta directa o indirectamente esperando la cuenta x). Describa un esquema que evite el peligro de interbloqueo. No esta permitido desbloquear una cuenta una vez que se ha bloqueado hasta que la transacción se complete.