TAREA 1
COMUNICACIÓN Y SINCRONIZACIÓN ENTRE PROCESOS 5.1. Enu E nu mere mer e cuat cuatrr o elementos de dise di señ ñ o par a los l os cual es es neces necesar i o el conce con cepto pto de concur concu r r encia. enci a. • Todo sistema operativo debe ser capaz de seguir la pista de los distintos procesos activos. Esto lo hace por medio de los bloques de control de procesos. • Todo sistema operativo debe asignar y retirar los distintos recursos a cada proceso activo. Entre estos recursos se incluyen: • Tiempo de procesador: es la función de planificación, tratada en la parte Cuatro. • Memoria: la mayoría de los sistemas operativos emplean esquemas de memoria virtual. • Archivos. • Dispositivos de E/S. • Todo sistema operativo debe proteger los datos y los recursos físicos de cada proceso contra injerencias no intencionadas de otros procesos. Esto supon e emplear técnicas relativas a la memoria, archivos y dispositivos de E/S, que se estudian. • Los resultados de un proceso deben ser indep endientes de la velocidad relativa a la que se realiza la ejecución de otros procesos concurrentes. 5.2. ¿En ¿En que tr es contextos contextos se se prese presentan nt an l a concur r enci a? La concurrencia se puede presentarse p resentarse en tres contextos diferentes: • Múltiples aplicaciones: la multiprogramación se creo para permitir que el tiempo de procesador de la máquina fuese compartido dinámicamente entre varias aplicaciones activas. • Aplicaciones estructuradas : como ampliación de los principios del diseño modular y la programación estructurada, algunas aplicaciones pueden implementarse eficazmente como un conjunto de procesos concurrentes. • Estructura del sistema operativo: Las mismas ventajas de estructuración son aplicables a los programadores de sistemas y se ha comprobado que algunos sistemas operativos están implementados como un conjunto de procesos o hilos. 5.3. ¿Cuá ¿Cu ál es son l os r equi sitos sit os bá sicos par a la l a ejecuci ejecu ció ón de d e pr ocesos ocesos concu r r entes ent es? ? 1. Tiempo de procesador: es la función de planificación, tratada en la parte cuatro. 2. Memoria: la mayoría de los sistemas operativos emplean esquemas de memoria virtual. 3. Archivos . Almacena la información
4. Dispositivos de E/S. 5.4. En um ume er e tres niveles de conoci conocimi mi ento nt o entr e pr pr oces ocesos y defi defina na br evemente vemente cada uno de ell ell os. os. 1. Los procesos no tienen conocimiento de d e los demás; estos son procesos independientes que no están pensados para operar juntos. Ej: la multiprogramación de varios procesos independientes. Sus posibles problemas de control son la exclusión mutua, interbloqueo (recursos renovables y la inanición). 2. Los procesos tienen un conocimiento indirecto de los otros los procesos no conocen necesariamente a los otros por sus identificadores de proceso, pero comparten el acceso a algunos objetos, como un buffer de E/S. Estos procesos muestran cooperación para cooperación para compartir el objeto común. 3. Los procesos tienen un conocimiento cono cimiento directo de los otros los procesos son capaces de comunicarse con los demás por el identificador de proceso y están diseñados para trabajar conjuntamente en alguna actividad. Estos procesos también muestran cooperación. ¿Cuá ál es l a dif di f erenci a entr e pr oces ocesos en competencia competenci a y proce pr ocesos sos en cooperaci ón? • ¿Cu La diferencia entre procesos en competencia y procesos en cooperación es que los procesos concurrentes entran en conflicto cuando compiten por el usos del mismo recurso. No hay intercambio de información entre los procesos en competencia. Sin embargo, la ejecución de un proceso puede influir en el comportamiento de los procesos que c ompiten.
Mientras que el caso de cooperación comprende los procesos que interactúan con otros sin tener conocimiento explícito de ellos. • En umere los tres problemas de contr ol asociados a la competencia entr e pr ocesos y defina brevemente cada un o de ellos • Exclusión mutua: dos o más procesos quieren acceder a un único recurso no compatible como una impresora. Durante el curso de la ejecución, cada proceso enviara órdenes al dispositivo de E/S, recibiendo información de estado, y enviando o recibiendo datos. • Interbloqueo: Dos procesos P1 y P2 y dos recursos R1 y R2, supóngase que cada proceso necesita acceder a ambos recursos para llevar a cabo una parte de su función. • Inanición: tres procesos p1, p2 y p3 necesitan acceder periódicamente al recurso R. • En umere los requi sitos para l a exclu sión mutu a Los requisitos para la exclusión mutua son: • Debe cumplirse la exclusión mutua: sólo un proceso de entre todos los que poseen secciones críticas por el mismo recurso u objeto compartido, debe tener permiso para entrar en ella en un instante dado. • Un proceso que se interrumpe en una sección no crítica debe hacerlo sin interferir con los otros procesos. • Un proceso no debe poder solicitar acceso a una sección crítica para después ser demorado indefinidamente; no puede permitirse el interbloqueo o la inanición. • Cuando ningún proceso está en su sección crítica cualquier proceso que solicite entrar en la suya debe poder hacerlo sin dilación. • No se deben hacer suposiciones sobre la velocidad relativa de los procesos o el número de procesadores. • Un proceso permanece en su sección crítica sólo por un tiempo finito. operaci ones se pueden hacer sobr e un semáforo? • ¿Qué Las operaciones que se pueden realizar sobre un semáforo son: • Un semáforo puede iniciarse con un valor no negativo. • La operación wait disminuye el valor del semáforo. Si el valor se hace negativo, el proceso que ejecuta el wait se bloquea. • La operación SIGNAL incrementa el valor del semáforo. Si el valor no es positivo, se desbloquea un proceso bloqueado por una operación wait. • ¿Cuál es la diferenci a entr e los semáfor os general es y los binarios? La diferencia es que un semáforo binario sólo puede tomar los valores 0 y 1. Son más sencillos de implementar y puede demostrase que tienen la misma potencia de expresión que los semáforos generales. • ¿Cuál es la diferenci a entr e los semáforos dé biles y los robustos? La diferencia es que el semáforo débil no especifica el orden en el que se retiran los procesos de la cola. Mientras que la robusta emplea la política FIFO en donde el proceso que ha estado bloqueado durante más tiempo se libera de la cola. • ¿Qué es un monitor ? Un monitor es son estructuras de un lenguaje de programación que ofrecen una funcionalidad equivalente a la de los semáforos y que son más fáciles de controlar. • ¿Cuál es la diferenci a entr e bloqueador y no bloqueador con r elación a los mensajes? La diferencia es que tanto el emisor como el receptor pueden ser bloqueantes o no bloqueantes. • Bloqueante: tanto el emisor como el receptor se bloquean hasta que se entrega el mensaje; esta técnica se conoce como rendezvous. • No bloqueante: nadie debe esperar el send no bloqueante es la forma más natural para muchas tareas de programación concurrente. Por ejemplo si se usa para solicitar una operación de salida, le permite al proceso solicitante realizar la solicitud en forma de mensaje y continuar.
5.13. ¿Cuáles son las condiciones asociadas en general asociadas con el pr oblema de las lecturas/escrituras? • Cualquier número de lectores pueden leer el archivo simultáneamente. • Sólo puede escribir en el archivo un escritor en cada instante. • Si un escritor esta accediendo al archivo, ningún lector puede leerlo.
Problemas del Texto 1. Considérese el algoritmo de Dekker, escrito para un número de arbitrario de procesos, cambiando la sentencia ejecutada cuando se abandona la sección crítica de turno = 1 – i /* es decir, P0 pone turno a 1 y P1 pone turno a 0 */ a turno = ( turno + 1 ) % n /* n= números de procesos */
Evaluar el algoritmo cuando el número de procesos que ejecutan concurrentemente es mayor de dos. Si tenemos varios procesos concurrente con un algoritmo de esta forma se estará viendo solamente q ue la sección critica estará libre cuando el residuo de la división del total de los procesos sea un numero exactamente divisible entre la cantidad n de procesos.
2. Otro método de software para la exclusión mutua es el algoritmo de la panadería de Lamport, llamado así porque está basado en la costumbre de las panaderías y de otras tiendas en las que cada cliente recibe un número al llegar, lo que permite servirles por turnos. El algoritmo es como sigue: booleano eleccion[n]; int numero[n]; while (cierto) { eleccion[i] = cierto; numero[i] = 1 + max(numero[ ], n); eleccion[i] = falso; for (int j=0; j<>n; j++) { while (eleccion[j]) { }; while ((numero[j] !=0) && (numero[j], j) <> (numero[i], i)) { }; /* seccion critica */; numero[i] = 0; /* resto */; } } Los vectores eleccion y numero se inicia a falso y a 0, respectivamente. El i-esimo elemento de
cada vector puede ser leído y modificado por el proceso i, pero solo puede ser leído por otros procesos. La notación (a, b) < (c, d) se define como: (a
• ] y el P[j] toman el mismo numero y que i es diferente de j, entonces Pi entra primero; sino lo hace Pj (P=numero). En la sección de salida vemos que el Pi asigna 0. 1. Demostrar que este algoritmo evita el interbloqueo. a < c or si a = c y b < d max(a0,...ak) es un número b tal que: b >= ai para i=0,..k Si Proceso[i] está dentro SC es que Proceso[k] ha escogido un numero[k]!= 0, y (numero[i],i) < (numero[k],k). Si nos basamos en este supuesto y en lo dicho anteriormente este algoritmo no permitirá el interbloqueo; ya que la sección critica estará disponible para que sea usada por otro proceso. 1. Demostrar que respeta la exclusión mutua. La exclusión mutua esta siendo respetada ya que el algoritmo solo permite que un proceso de los n existente entren a la sección critica y que los otros esperen a que esta sección este libre para entrar.
3. Demostrar que los siguientes métodos de software para la exclusión mutua no dependen de la exclusión mutua básica del nivel de acceso a la memoria. • El algoritmo de la panadería. • El algoritmo de Peterson. La operabilidad de ambos logaritmos esta dada para brindar soluciones mediante software, los cuales usaran direcciones de memoria que serán dadas por el Sistema Operativo; mas no así direcciones físicas asignadas directamente en la memoria. O sea que el hardware no formara parte directa de la solución de la exclusión mutua.
4. El siguiente problema se empleó una vez en un examen: Parque Jurasico está formado por un museo de dinosaurios y un parque excursiones de safari. Hay m pasajeros y n coches monoplazas. Los pasajeros dan vueltas por el museo durante un tiempo y después se ponen en fila para dar un paseo en un coche de safari. Cuando el coche está disponible, carga un pasajero y recorre el parque durante un tiempo aleatorio. Si los n coches están todos dando vueltas a los pasajeros, los que quieren subir deben esperar; si un coche está listo para recoger pasajeros, pero no hay ninguno esperando, el coche debe esperar. Use semáforos para sincronizar los procesos de los m pasajeros con los n coches. Determinar si el siguiente código es correcto. Ignorar la sintaxis y las declaraciones ausentes de variables. Recuerde que P y V corresponden con wait y signal . \begin{literalmente} Recurso Parque-Jurasico () sem coche_vacio := 0, tomar_coche := 0, coche_lleno := 0, pasaj_libre := 0 process pasajero(i := 1 to num_pasajeros) do true -> dormir(int(random(1000*tiempo_paseo))) P(coche_vacio); V(tomar_coche); P(coche_lleno) P(pasaj_libre) od end pasajero process coche(j:=1 to num_coches) do true -> V(coche_libre); P(tomar_coche); V(coche_lleno) dormir(int (random(1000*tiempo_recorrido)) V(pasaj_libre) od end coche end Parque_Jurasico \end{literalmente}
Según mi punto de vista la lógica tiene sentido, en lo que se ve se usan tres semáforos y un contador de procesos (pasajeros). Los semáforos serán coche_vacio, tomar_coche, coche_lleno. Estos semáforos le envían la señal de wait o signal a los procesos (pasajeros) para que se ejecuten (tomen el bus). La codificación utilizada es un poco enredada pero se tiene la lógica, la política utilizada para definir los semáforos es bastante buena.
5. Considérese el algoritmo de semáforos. ¿Cambiara el significado del programa si se intercambian las siguientes sentencias? Wait(e); wait(s) Signal(s); signal(n) Wait(n); wait(s) Signal(s); signal(e)
Si nos basamos en el algoritmo del Productor-Consumidor del libro de Stalling (figura 5.16), podemos ver que las funciones declaradas se ejecutan mediante caída libre; al momento de hacer dichos cambios estaremos cambiando el significado del programa. Si tomamos la función productor y cambiamos wait(e) por wait(s) el wait del tamaño de buffer estará en 1 siempre y si el tamaño requerido por el proceso es mayor puede generar errores. Al ir bajando en la ejecución del programa vemos que a la hora de enviar una señal para la inserción de otro proceso en el buffer se vera siempre en 0, o sea no habrá una señal de que se ha insertado un proceso. Analizando el algoritmo para la parte del consumidor el primer wait entrará en 1, en primera instancia el programa puede tomarlo como si ya el consumidor ha tomado ya el p roceso.
6. Responda a las siguientes cuestiones relativas a la barbería equitativa: Requiere el código que cobre el pago de un corte de pelo a un cliente el mismo barbero que lo terminó?
Si se coloca en el código que el mismo barbero sea el que cobre el corte, el proceso (cliente) se demorara más tiempo con el barbero y dejara a los otros procesos esperando más tiempo. Esto puede llevar a una gran espera y retrazar todo el funcionamiento.
Usan los barberos siempre la misma silla?
La misma silla será utilizada, ya que existe una relación entre el barbero y la silla; al momento que se liberó la silla, será liberado el barbero el cual e stará dispuesto para atender otro cliente.
7. Este problema demuestra el modo en que se usan tres semáforos para coordinar tres tipos de procesos. Santa Claus duerme en su taller del Polo Norte y sólo puede despertarse por (1) los nueve renos que vuelven de sus vacaciones en el Pacifico Sur o (2) algún duende que tiene dificultades para hacer juguetes; para permitir que Santa Claus duerme, los duendes sólo pueden despertarle cuando son tres los que tienen problemas. Cuando tres duendes van a plantear sus problemas, cualquier otro que desee visitar a Santa Claus debe esperar a que vuelvan. Si Santa Claus despierta y encuentra y encuentra tres duendes en la puerta de su taller, junto con el último reno que vuelve al trópico, Santa Claus decide que los duendes pueden esperar hasta después de Navidad, porque es mas importante poner su trineo a punto (se supone que los renos no quieren dejar trópico y que permanecen allí hasta el ultimo momento posible). El último reno en llegar debe avisar a Santa Claus mientras los otros esperan calentitos en un refugio antes de ser enjaezados al trineo. Resuelva este problema por método de semáforos. semáforo re = 0 semáforo en = 0 semáforo enj = 1 semáforo noenj = 1 semáforo en-cuar = 1 semáforo salir = 1
/* Enanos */ while (true) { hacer(); en-espera(); wait(en-cuar); consul(); wait(salir); } void en-espera() { if (e<>3) then { wait(en) en=en + 1 else en-listo(); } /* Renos */ while (true) { navidad(); re-regre(); wait(enj); entregar(); wait(noenj); } void re-regre(){ if (r==8) { wait(enj); else re = re + 1; } /* Santa Claus */ while (true) { despertado(); } void despertado() { wait(enj) entregar() wait(noenj); } void despertado() & en-listo() { wait(en-cuar); consulta() wait(salir) }
8. Demostrar que el paso de mensajes y los semáforos tienen una funcionalidad equivalente: a. implementando el paso de mensajes por medio de semáforos. Pista: haga uso de un área de elementos compartidos para contener buzones, cada uno de ellos formado por un vector de espacios para mensajes.
/* productor – consumidor */ cap = prod = 1 cons = 1 void productor () { while (cierto) producir() wait(e) wait(prod) signal(prod) mens() } } void consumidor () { while (cierto) { coger () wait(cons) signal(cons) mens() } } void mens() { msg[prod] = prod + 1 msg[cons] = cons + 1 }
b. implementando un semáforo por medio del paso de mensajes. Pista: cree un proceso independiente para la sincronización. void productor () { while (cierto) { receive(producir, msjp) msj. = producir( ) send(consumir, msjp) } } void consumidor () { while (cierto) { receive(consumir, msjp) consumir(mjsp) send(producir, null)
} } void mens() { buzon1(producir) buzon2(consumir) producir = producir + 1 consumir = consumir + 1 }