3. The Free Lunch Is Over. A Fundamental Turn Toward
Concurrency in Software
Herb Sutter (Marzo 2005)
4. "Applications will increasingly need to be concurrent if they
want to fully exploit continuing exponential CPU throughput
gains"
- Herb Sutter
5.
6. ¿Qué es?
• Paralelismo: Ejecución simultánea de tareas.
• Concurrencia: Cuando dos o más tareas se
ejecutan de forma independiente en periodos de
tiempo traslapados.
8. 1. Procesos
• Tarea que utiliza el recurso de una computadora.
• Memoria, CPU, red, disco.
• Aislados
• Fork
9. 1. Procesos
• Context - switching
• Multitasking
• Se comunican por RPC
• Costosos: ulimit -u > 709
10.
11.
12.
13. 2. Threads
• Componente de un proceso
• Múltiples threads por proceso
• Memoria compartida
• 2 mb en Linux
14. 2. Threads
• La programación es compleja: semáforos, waits,
etc.
• Context switching más rápido que los procesos
• Más ligeros que los procesos
• Técnica común: Pool de threads
25. 5. Erlang / OTP
Basado en el Actores:
1973: Carl Hewitt, Peter Bishop y Richard Steiger
• Procesos ligeros y aislados
• Share-nothing para evitar efectos colaterales
(Programación Funcional)
• Comunicación basada en paso de mensajes
• Location transparency
26. 5. Erlang / OTP
• Un SO para gestionar procesos ligeros
• ~1.8k de heap inicial
• Una máquina virtual (BEAM)
• Un lenguaje: Erlang
• Un framework para sistemas concurrentes y
tolerantes a fallas: OTP
27. 5. Erlang / OTP
• Procesos aislados (seguridad)
• Ligeros (puedes tener millones)
• Tolerante a fallos
• Monitores y alarmas
30. 5. Erlang - Elixir
• Creado por José Valim
• 1.0 liberada en septiembre
• Sintaxis más clara y familiar
• Macros!
• Protocolos
• Herramientas para automatizar builds y despliegues
31. 5. Erlang - Elixir
parent = self()
# Spawns an Elixir process (not an operating system one!)
spawn_link(fn ->
send parent, {:msg, "hello world"}
end)
# Block until the message is received
receive do
{:msg, contents} -> IO.puts contents
end
37. 6. Promises / Futures
• Implementados en la mayoría de lenguajes: Java,
javascript, .NET, Scala, Clojure, Elixir, Ruby, Obj-c,
Swift.
• Dependen del modelo de concurrencia de la
plataforma.
40. Scala / Elixir
• Scala: modelo polling. Se crea un thread y
periodicamente se le pregunta si ya terminó
• Elixir: modelo push. Se crea un proceso
independiente que nos notifica cuando termina.
• Fuente: Peter Hamilton http://
undiscoveredfeatures.com/elixir-tasks-vs-scala-
futures/