41
Modelos de concurrencia Erick Camacho @ecamacho CTO Nubleer

Modelos de Concurrencia

Embed Size (px)

Citation preview

Page 1: Modelos de Concurrencia

Modelos de concurrencia

Erick Camacho @ecamacho CTO Nubleer

Page 2: Modelos de Concurrencia
Page 3: Modelos de Concurrencia

The Free Lunch Is Over. A Fundamental Turn Toward Concurrency in Software

Herb Sutter (Marzo 2005)

Page 4: Modelos de Concurrencia

"Applications will increasingly need to be concurrent if they want to fully exploit continuing exponential CPU throughput

gains" - Herb Sutter

Page 5: Modelos de Concurrencia
Page 6: Modelos de Concurrencia

¿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.

Page 7: Modelos de Concurrencia

¿Qué es?

• http://concurrencia-go.appspot.com/go_sgce.slide#25

Page 8: Modelos de Concurrencia

1. Procesos

• Tarea que utiliza el recurso de una computadora.

• Memoria, CPU, red, disco.

• Aislados

• Fork

Page 9: Modelos de Concurrencia

1. Procesos

• Context - switching

• Multitasking

• Se comunican por RPC

• Costosos: ulimit -u > 709

Page 10: Modelos de Concurrencia
Page 11: Modelos de Concurrencia
Page 12: Modelos de Concurrencia
Page 13: Modelos de Concurrencia

2. Threads

• Componente de un proceso

• Múltiples threads por proceso

• Memoria compartida

• 2 mb en Linux

Page 14: Modelos de Concurrencia

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

Page 15: Modelos de Concurrencia

2. Threads

“Concurrency Options on the JVM” @jessitron

Page 16: Modelos de Concurrencia

2. Threads

Page 17: Modelos de Concurrencia

2. Threads

Page 18: Modelos de Concurrencia

3. Reactor

• Event-loop

• 1 sólo thread

• Loop de eventos: Reactor va turnando la tarea a ejecutar

• Descrito por Douglas Schmidt en 2000

Page 19: Modelos de Concurrencia

3. Reactor

Page 20: Modelos de Concurrencia

3. Reactor

Node.js event loop

Page 21: Modelos de Concurrencia

3. Reactor

Page 22: Modelos de Concurrencia

3. Reactor

Page 23: Modelos de Concurrencia

3. Reactor

• Si una tarea se tarda mucho, afecta a las otras.

• Memoria compartida

• Fácil de entender

Page 24: Modelos de Concurrencia

4. CSP (GO)

• Presentación

Page 25: Modelos de Concurrencia

5. Erlang / OTPBasado 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

Page 26: Modelos de Concurrencia

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

Page 27: Modelos de Concurrencia

5. Erlang / OTP

• Procesos aislados (seguridad)

• Ligeros (puedes tener millones)

• Tolerante a fallos

• Monitores y alarmas

Page 28: Modelos de Concurrencia

5. Erlang / OTP

Page 29: Modelos de Concurrencia

5. Erlang / OTPSupervisores

Workers

OTP App

Page 30: Modelos de Concurrencia

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

Page 31: Modelos de Concurrencia

5. Erlang - Elixirparent = self()

# Spawns an Elixir process (not an operating system one!)spawn_link(fn -> send parent, {:msg, "hello world"}end)

# Block until the message is receivedreceive do {:msg, contents} -> IO.puts contentsend

Page 32: Modelos de Concurrencia

5. Erlang(o Elixir)/OTP

Page 33: Modelos de Concurrencia
Page 34: Modelos de Concurrencia

6. Promises / Futures

• Promises: 1976 Daniel P. Friedman y David Wise

• Futures: 1977 Henry Baker y Carl Hewitt

Page 35: Modelos de Concurrencia

6. Ejemplo: qstep1(function (value1) {

step2(value1, function(value2) {

step3(value2, function(value3) {

step4(value3, function(value4) {

// Do something with value4

});

});

});

});

Page 36: Modelos de Concurrencia

6. Ejemplo: qQ.fcall(promisedStep1)

.then(promisedStep2)

.then(promisedStep3)

.then(promisedStep4)

.then(function (value4) {

// Do something with value4

})

.catch(function (error) {

// Handle any error from all above steps

})

.done();

Page 37: Modelos de Concurrencia

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.

Page 38: Modelos de Concurrencia

6. Scala

scala> val something = Future { 10 + 6 } something: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@5535cbe scala> Await.result(something, 0 nanos) res1: Int = 16

Page 39: Modelos de Concurrencia

6. Elixir

something = Task.async fn -> ...(1)> 10 + 6 ...(1)> end %Task{pid: #PID<0.44.0>, ref: #Reference<0.0.0.55>} iex(2)> Task.await(something) 16

Page 40: Modelos de Concurrencia

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/

Page 41: Modelos de Concurrencia

Gracias@ecamacho