Universidad de Carabobo Facultad Experimental de Ciencias y Tecnología Departamento de Computación Sistemas Operativos Prep. Carlos I. Buchart I. Nombre:___________________________________ Práctica previa al Segundo Parcial Teoría 1. ¿Qué son los procesos cooperativos? Defina condición de competencia y explique cómo ocurre en los procesos cooperantes. ¿Estos son los únicos que pueden generarla? 2. Durante el desarrollo de la práctica se utilizará el término recurso, es útil recordar esta definición. Defina recursos: consumibles, reutilizables, expropiables, no expropiables. 3. Defina la sección crítica. ¿Por qué se habla del problema de la sección crítica? 4. Explique los tres (3) requerimientos que debe poseer una solución válida al problema de la sección crítica. ¿Qué problema se generaría si no se respetase cada uno de estos requisitos? 5. Compare las diferentes aproximaciones de Dekker y la solución de Peterson. Indique con cuáles de los requerimientos cumplen, y con cuáles no, mencionando un contraejemplo. 6. ¿Cuáles son las instrucciones de hardware que se pueden emplear para la solución del problema de la sección crítica? 7. Defina atomicidad. ¿Puede la atomicidad ser implementada por software si ésta no está disponible en el hardware? Explique. ¿Se podrá resolver el problema de la sección crítica utilizando nada más la atomicidad? 8. La inhabilitación de interrupciones representa una solución “desde la raíz” al problema de la sección crítica. Mencione algunas deficiencias y peligros de esta técnica. 9. Dos de las principales técnicas que se utilizan comúnmente cuando un proceso no puede entrar a su sección crítica son la espera activa y la espera bloqueada. ¿Qué ventajas y desventajas presentan? ¿Es siempre la espera activa menos eficiente que la espera bloqueada, en términos de uso del CPU? 10. Defina semáforos, sus tipos y cómo se utilizan en la solución del problema de la sección crítica. 11. ¿Cómo se utilizan las instrucciones test&set y swap en la solución del problema de la sección crítica? Indique el número de procesos que pueden ser controlados. 12. ¿Qué otros mecanismos de sincronización importantes suelen ofrecer los sistemas operativos? Defínalos. 13. Explique el funcionamiento de las tuberías sin nombre (pipes) y con nombre (FIFO). ¿Cómo se utilizan en la sincronización de procesos? 14. Explique el paso de mensajes directo e indirecto, con bloqueo y sin bloqueo. ¿Qué ventajas y desventajas ofrece cada uno? 15. ¿En qué se diferencian los monitores de los semáforos? Ejemplifique. 16. ¿Qué es el bloqueo mutuo o interbloqueo? Explique las condiciones que originan un interbloqueo. 17. ¿Por qué se consideran las tres primeras condiciones (exclusión mutua, retención y esperar, no apropiación), condiciones necesarias más no suficientes para el interbloqueo? ¿Qué implicaciones tiene en los métodos para manejar los bloqueos mutuos? 18. ¿Puede producirse un bloqueo mutuo entre procesos que comparten un solo recurso? Explique. 19. Explique el esquema de prevención de bloqueos mutuos. ¿Por qué no puede prevenirse la exclusión mutua? 20. El esquema de evitación de interbloqueos requiere información acerca de los recursos a utilizar por parte de cada proceso. Mencione algunas situaciones en las cuales esto no es posible. 21. Si un sistema operativo no implementa ni la prevención ni la evitación de interbloqueos puede originarse uno. Explique las diferentes técnicas de recuperación, sus ventajas y desventajas. 22. Explique la solución integrada de Silberchatz y Galvin para la solución del problema del bloqueo mutuo. Práctica 1. La segunda aproximación de Dekker a la solución del problema de la sección crítica para dos procesos, se implementó en lenguaje Java de la siguiente forma: public class Dekker_2 extends ModeloExclusion { private volatile boolean[] m_bFlag = new boolean[2]; public Dekker_2() { m_bFlag[0] = false; m_bFlag[1] = false; } public void entrarSC(int iId) { int other = 1 - iId; m_bFlag[iId] = true; while (m_bFlag[other] == true) Thread.yield(); } public void salirSC(int iId) { m_bFlag[iId] = false; } } Modifique el código para soportar N procesos. 2. Considérese el siguiente programa: int block[2]; // booleano int turn=0; // turn=0..1 void P(int id) { // id=0..1 while(1) { block[id]=1; while(turno!=id) { while(block[1-id]); turno=id; } // Sección crítica block[id]=0; // Sección no crítica } } Encuentre un contraejemplo que demuestre que esta solución es incorrecta. Es interesante destacar que incluso en las Comunicaciones de la ACM se equivocaron con esta solución. (STALLINGS. Sistemas Operativos – Segunda edición. Pág. 219). 3. La Universidad de Carabobo está trabajando en el desarrollo de un mini-kernel completamente nuevo, llamado UCIX. Un grupo de diseñadores ha propuesto que los semáforos binarios y los monitores sean implementados utilizando la instrucción test&set, mientras que otro grupo ha propuesto realizarlos mediante el paso de mensajes. Esto condujo a una acalorada discusión y se ha decidido que usted realice un análisis de ambas soluciones y determine cuál deberá ser utilizada. Para ello debe realizar la implementación de ambos esquemas y compararlos. 4. Un problema clásico en el estudio de sincronización entre procesos es el problema del productorconsumidor. Este problema puede ser generalizado bajo dos esquemas: productores-consumidores (en el cual se posee un buffer limitado para almacenar los objetos producidos), y escritores-lectores (con buffer ilimitado). Este último ejemplifica perfectamente lo que sucede en una base de datos, donde algunos procesos pueden estar realizando solicitudes de lectura y otros de escritura. Diseñe un algoritmo, empleando monitores, que evite el caos en un servidor de bases de datos. Las políticas a seguir son: a. En un mismo momento pueden coexistir varios procesos lectores. b. Para que un proceso pueda escribir en la base de datos, deberá tener acceso exclusivo a la misma. c. Un proceso escritor tendrá, inicialmente, prioridad sobre un proceso lector, pero éste último no debería morir de inanición, por lo que no deberán escribir más de cuatro (4) procesos antes de que él pueda realizar su lectura. 5. Suponga ahora que la comunicación bajo UCIX se realiza únicamente mediante tuberías. Desarrolle un algoritmo que permita emular un “pseudo-paso de mensajes” entre dos procesos. Además, investigue las llamadas al kernel de Linux relacionadas con el uso de tuberías e implemente su algoritmo en C. 6. En práctica se estudió la solución al problema de los filósofos comensales. Para evitar el bloqueo mutuo se restringió la cantidad de filósofos que en un momento dado podrían estar compitiendo por sus chopsticks. ¿Qué esquema de control de interbloqueo fue utilizado? Desarrolle otra propuesta diferente para evitar el interbloqueo en este problema. 7. Otro problema de sincronización es el de los fumadores de cigarrillos (SILBERCHATZ-GALVIN-GAGNE. Sistemas Operativos – Sexta edición. Pág. 223). Existen tres (3) fumadores que continuamente enrollan cigarrillos y luego se lo fuman. Para un cigarrillo se necesita una cierta cantidad de papel, tabaco y un fósforo para encenderlo. Cada fumador posee dotación ilimitada de un solo ingrediente (uno papel, otro tabaco y otro fósforos). Existe un (1) agente que posee cantidad ilimitada de todos los ingredientes. Alternativamente, éste va colocando dos ingredientes en una mesa y entonces, el fumador que posee el ingrediente faltante los recoge y fuma su cigarrillo. Luego indica al agente que ha terminado y éste repite la operación. Realice un programa en Java que sincronice a los fumadores y el agente. 8. ¿Qué enfoque de recuperación de interbloqueos usaría usted si estuviera a su cargo el sistema de control de las válvulas de presión de la Refinería El Palito? Razone su respuesta. 9. ¿Puede un sistema detectar si un proceso está sufriendo de inanición? En caso afirmativo, explique cómo puede hacerlo. En caso negativo, indique cómo puede entonces manejar el problema de la inanición. (SILBERCHATZ-GALVIN-GAGNE. Sistemas Operativos – Sexta edición. Pág. 249). CB/cb