La literatura de sistemas operativos está repleta de interesantes problemas que se han descrito y analizado ampliamente, mediante el uso de una variedad de métodos de sincronización. En las siguientes secciones examinaremos dos de los problemas más conocidos.
El problema de los filósofos comelones.
En 1965, Dijkstra propuso y resolvió un problema de sincronización al que llamó el problema de los filósofos comelones. Desde ese momento, todos los que inventaban otra primitiva de sincronización se sentían obligados a demostrar qué tan maravillosa era esa nueva primitiva, al mostrar con qué elegancia resolvía el problema de los filósofos comelones. Este problema se puede enunciar simplemente de la siguiente manera. Cinco filósofos están sentados alrededor de una mesa circular. Cada filósofo tiene un plato de espagueti. El espagueti es tan resbaloso, que un filósofo necesita dos tenedores para comerlo. Entre cada par de platos hay un tenedor.
La distribución de la mesa se ilustra en la figura
La solución que se presenta en la figura está libre de interbloqueos y permite el máximo
paralelismo para un número arbitrario de filósofos. Utiliza un arreglo llamado estado para llevar el
registro de si un filósofo está comiendo, pensando o hambriento (tratando de adquirir tenedores).
Un filósofo sólo se puede mover al estado de comer si ningún vecino está comiendo. Los i vecinos
del filósofo se definen mediante las macros IZQUIERDO y DERECHO. En otras palabras, si i es 2,
IZQUIERDO es 1 y DERECHO es 3.
El programa utiliza un arreglo de semáforos, uno por cada filósofo, de manera que los filó-
sofos hambrientos puedan bloquearse si los tenedores que necesitan están ocupados. Observe que
cada proceso ejecuta el procedimiento filosofo como su código principal, pero los demás procedimientos
(tomar_tenedores, poner_tenedores y probar) son ordinarios y no procesos separados.
Una solución al problema de los filósofos comelones.
El problema de los lectores y escritores
El problema de los filósofos comelones es útil para modelar procesos que compiten por el acceso exclusivo
a un número limitado de recursos, como los dispositivos de E/S. Otro problema famoso es el
de los lectores y escritores (Courtois y colaboradores, 1971), que modela el acceso a una base de datos.
Por ejemplo, imagine un sistema de reservación de aerolíneas, con muchos procesos en competencia
que desean leer y escribir en él. Es aceptable tener varios procesos que lean la base de datos
al mismo tiempo, pero si un proceso está actualizando (escribiendo) la base de datos, ningún otro
proceso puede tener acceso a la base de datos, ni siquiera los lectores. La pregunta es, ¿cómo se programan
los lectores y escritores?
Una solución se muestra en la figura.
En esta solución, el primer lector en obtener acceso a la base de datos realiza una operación
down en el semáforo bd. Los siguientes lectores simplemente incrementan un contador llamado cl.
A medida que los lectores van saliendo, decrementan el contador y el último realiza una operación
up en el semáforo, para permitir que un escritor bloqueado (si lo hay) entre.
La solución que se presenta aquí contiene en forma implícita una decisión sutil que vale la pena
observar. Suponga que mientras un lector utiliza la base de datos, llega otro lector. Como no es
un problema tener dos lectores al mismo tiempo, el segundo lector es admitido. También se pueden
admitir más lectores, si es que llegan.
Ahora suponga que aparece un escritor. Tal vez éste no sea admitido a la base de datos, ya que
los escritores deben tener acceso exclusivo y por ende, el escritor se suspende. Más adelante aparecen
lectores adicionales.
Mientras que haya un lector activo, se admitirán los siguientes lectores.
Como consecuencia de esta estrategia, mientras que haya un suministro continuo de lectores, todos
entrarán tan pronto lleguen. El escritor estará suspendido hasta que no haya un lector presente. Si
llega un nuevo lector, por decir cada 2 segundos y cada lector requiere 5 segundos para hacer su trabajo,
el escritor nunca entrará.
Para evitar esta situación, el programa se podría escribir de una manera ligeramente distinta:
cuando llega un lector y hay un escritor en espera, el lector se suspende detrás del escritor, en vez
de ser admitido de inmediato. De esta forma, un escritor tiene que esperar a que terminen los lectores
que estaban activos cuando llegó, pero no tiene que esperar a los lectores que llegaron después
de él. La desventaja de esta solución es que logra una menor concurrencia y por ende, un
menor rendimiento. Courtois y sus colaboradores presentan una solución que da prioridad a los escritores
. Una solución al problema de los lectores y escritores.
Muy buen aporte, gracias!!!
ResponderBorrargracias profe !
ResponderBorrar