Desde 1970 hasta aproximadamente 2002, los procesadores duplicaron su velocidad aproximadamente cada 18 meses. Como programador, todo lo que tenía que hacer era esperar y su programa iría más rápido. El problema es que alrededor de 2002 las reglas cambiaron. Ahora no están haciendo procesadores rápidos más grandes, están haciendo procesadores más pequeños y lentos, sino que los ponen en grupos. La computadora en la que estoy trabajando ahora tiene 4 núcleos, y existen chips con hasta 8 núcleos (y 4 hilos por núcleo). Muy pronto tendremos chips con muchos más núcleos.
Entonces, si escribe un programa que no es del todo concurrente, encontrará que está usando 1 núcleo o hilo, pero el resto de la CPU está allí sin hacer nada. Entonces, si tiene 16 núcleos, 1 ejecutará su programa y los otros 15 estarán allí.
El problema con la concurrencia es que no es determinista. Es decir que no sabes exactamente en qué orden los diferentes hilos harán las cosas. Tradicionalmente, los programadores han intentado resolver esto usando bloqueos y similares. Esto ha llevado a MUCHO dolor. ¡Tener alguna forma de estado mutable al que más de un hilo puede acceder libremente es a menudo una fórmula para el dolor y las heinsebugs!
Últimamente, la tendencia ha sido pasar a lenguajes funcionales que controlen estrictamente el estado mutable. Hay dos formas básicas en que los lenguajes funcionales manejan la concurrencia. El primero es mediante el paso de mensajes. Esto es mejor demostrado por Erlang. En Erlang, en general, no hay estado compartido entre procesos. Se comunican no compartiendo memoria sino mis mensajes que pasan. Esto debería tener sentido para usted, ya que lo estamos haciendo en este momento. ¡Te envío esta información enviándote un mensaje, no recordando que se lo saqué de mi cerebro! Al cambiar al mensaje que pasa, la mayoría de los errores de bloqueo simplemente desaparecen. Además, los mensajes se pueden pasar a través de la red y dentro de un nodo.
El otro método es STM, que significa memoria transcripcional de software, presente en clojure y Haskell (y otros). En la memoria STM se comparte, pero los cambios solo se pueden realizar a través de una transacción. Como la gente de la base de datos descubrió todo esto en la década de 1970, es bastante fácil asegurarse de que lo hagamos bien.
En realidad, simplifiqué un poco, Clojure y Haskell pueden pasar mensajes, y Erlang puede hacer STM.
Descargo de responsabilidad Soy el autor de la programación de servicios web con Erlang , que saldrá a la venta en las próximas semanas.