Nuevos lenguajes de programación para antiguas preguntas - MuyComputerPRO

¿Por qué es necesario usar un semáforo para que un barbero atienda bien a sus clientes? Y, ¿Cómo pueden unos filósofos sentados frente a unos platos de fideos morirse de hambre? Estas preguntas a primera vista pueden parecer sin sentido, pero ocuparon las mentes de los primeros computer scientist en la segunda mitad del siglo XX.

Uno de ellos en particular (el holandés Edsger Wybe Dijkstra) formuló una serie de problemas en forma de ejercicios prácticos para ilustrar las cuestiones ligadas a la sincronización de múltiples procesos activos al mismo tiempo y a la comunicación entre ellos. Así nacieron el problema del barbero durmiente y el problema de la cena de los filósofos.

En el primer problema, hay que gestionar la cola de clientes que esperan sentarse en el sillón para ser afeitados por un barbero, que se duerme cuando no tiene clientes. En el segundo problema, el recurso compartido son los palillos chinos que cada filósofo sentado a una mesa tiene a su derecha y a izquierda y que comparte con los demás filósofos para poder comer su plato de fideos.

Ambas situaciones se ven afectadas por los problemas críticos de la programación concurrente y de los modernos sistemas operativos multitasking:

  • Race condition: situación en la cual múltiples procesos se encuentran en condición de competición para la utilización de un mismo recurso. Por ejemplo, cuando todos nuestros filósofos intentan a tomar el mismo palillo a la vez. O cuando dos clientes de nuestro barbero intentan ocupar la misma silla de la sala de espera.
  • Deadlock: situación de bloqueo permanente que surge cuando dos o más procesos necesitan de recursos ocupados por los demás para avanzar. Por ejemplo, cuando nuestros filósofos toman al mismo tiempo los palillos a sus derechas y se quedan esperando eternamente a que alguien libere los a sus izquierdas. O cuando nuestro barbero acaba con un cliente y al mismo tiempo llega el cliente siguiente: el barbero se duerme eternamente creyendo que no hay más clientes y el cliente se queda esperando eternamente a que el barbero acabe con un cliente que no existe.
  • Starvation: situación similar al deadlock, pero en la cual uno o más procesos están esperando recursos ocupados por otros procesos que no se encuentran necesariamente parados. Por ejemplo, cuando no se distribuyen de forma homogénea los turnos entre los filósofos o los clientes del barbero, de forma que antes o después algún proceso se “muera de hambre” (o le crezca una barba muy larga).



Para solucionar estas situaciones anómalas, se han ideado a diferentes técnicas:
  • Mutex, o algoritmos de exclusión mutua, que se usan en programación concurrente para evitar que más de un proceso a la vez ingreses en secciones críticas.
  • Semáforos, variables especiales utilizadas para restringir o permitir el acceso de un proceso a recursos compartidos. Según el valor que asumen permiten a más o menos procesos utilizar el recurso de forma simultánea.
  • Aging, una técnica de scheduling que gradualmente incrementa la prioridad de un proceso basándose en cantidad de tiempo que lleva esperando en la cola.



Aunque los problemas de la programación concurrente y las técnicas para solucionarlos puedan parecer antiguos, recientemente han vuelto de actualidad debido a la necesidad de la nueva era de la computación, como la escalabilidad en el procesamiento de importantes cantidades de datos.

Para ello, han surgido nuevos lenguajes de programación, como y GO. Scala, acrónimo de scalable language, fue introducido en 2003 y permite manejar programas pequeños o aplicaciones a muy gran escala, optimizando el código para trabajar con la concurrencia. Go, lenguaje de programación inicialmente desarrollado por Google en 2007, es un lenguaje diseñado de forma particular para el cloud y la concurrencia.