際際滷

際際滷Share a Scribd company logo
Concurrency Summit 2008


    Comparing
implementations of
  the Actor Model
       Jim Roepcke
       <jr@uvic.ca>

                            1
Actor models?



                2
This kind?
             3
No, not that kind...



                       4
The kind in Joe
Armstrongs Erlang,
                      5
The kind in Joe
Armstrongs Erlang,
                      6
Evan Phoenixs
  Rubinius,
                 7
Martin Oderskys
     Scala,
                   8
and Steve Dekortes
        Io.
                      9
What is the
Actor Model?



               10
Its a trendy
  model for
 concurrent
programming



                11
Massively parallel future
 The future has begun!
 We had lots of time to
  鍖gure this out

 Programmers are still
  using threads and
  mutexes in high
  level code

 Bad programmer!
 ABSTRACTION FTW!


                            12
Whats old is new again

 Actors de鍖ned by Hewitt in 1973
 More work by his PhD students in the
  80s, Clinger, Agha
 Adopted by Erlang in the late 80s for
  the telecom industry
 Picking up steam as concurrency
  becomes a hot issue again


                                          13
Actors win because
 they are simple



                     14
Actors communicate
                     15
Actors spawn
               16
Actors run in parallel
                         17
Actors listen
                18
Actors avoid deadlock
                        19
Actors perform great!
                        20
Now: up close
                21
Comparing
     Actors to Actors


 Implemented a program in Erlang,
  Rubinius, Scala and Io

 My experiences with each




                                     22
OM NOM NOM!


 Implemented the
  burger problem
  from CSC 464
  Assignment 1 in all
  four languages




                        23
spawn!

supervisor




                 24
mmm
                      hungry
                                               Student
            Student              Student
                                                   Burger
                      burger!

            Student              Student

                                              enjoy!

           Order Line           Burger Line

                      ok
k   Cook     Cook                  Burger Burger


                      supervisor                         25
Actors communicate
                     26
Communication

 Asynchronous Message Passing
 Encourages no memory sharing
 Each actor has a mailbox which
  queues messages sent
 send mechanism to deliver a
  message to an actor


                                     27
Sending messages

    Erlang             Rubinius

 pid ! message     actor << message



    Scala                 Io

actor ! message   obj @@method(args)



                                       28
Actors and burgers
                     29
Actors spawn
               30
Creating actors


 To create concurrency, actors create
  more actors and send them messages
 Actors are independently executing
  entities




                                         31
Creating actors

      Erlang                 Rubinius

  pid = spawn(fun)     actor = Actor.spawn ...


       Scala
                                 Io
sa = new SomeActor()
                       sa := SomeActor clone
      sa.start()



                                                 32
Erlang Actors

 Actors are called processes
 Process creation and context
  switching is very fast and lightweight

 Processes cannot share memory
 Typically run a tail-recursive function


                                            33
Rubinius Actors

 Actor class comes with Rubinius VM
 Green Ruby thread per actor
 VM assigns a Mailbox per thread
 Remote Actors new, not perfect yet
 Orders of magnitude worse than
  Erlang: Rubinius developer on IRC


                                       34
Scala Actors
 scala.actors package comes with Scala
 Hybrid execution model, actors run in
  their own thread or via events
 Claim massive scalability using events
  and thread pools
 Remote Actors supported
 act() loops to stay alive

                                           35
Io Actors

 Io uses coroutines for concurrency
 Scheduling is FIFO, no prioritization
 One kernel thread per VM, async I/O
 @@ runs the method on a dedicated
  per-object coroutine for messages

 Remote actors not supported

                                          36
Actors run in parallel
                         37
Parallelism: Erlang

 SMP Erlang automatically puts
  processes on different cores/CPUs

 Messaging actors in remote VMs is
  seamless

 spawn(Node, fun) to spawn an actor
  on a different VM which may be
  remote


                                       38
Parallelism: Rubinius

 One kernel thread per Rubinius VM
 Processor af鍖nity for multi-core?
 Use VMActor to create an actor on a
  remote VM
 Messaging actors in remote VMs is
  seamless thanks to duck typing


                                        39
Parallelism: Scala

 When using event-based actors, Scala
  creates multple threads to balance
  load across cores
 Use RemoteActor class to 鍖nd an actor
  on a different VM
 Messaging actors in remote VMs is
  seamless


                                          40
Parallelism: Io

 Nope :-(
 One kernel
 thread per VM

 No support for
 remote actors
 built-in



                          41
Actors listen
                42
Receiving messages


 Take a message off the mailbox queue
 Decide if you want to deal with it
 Messages are data
 Timeouts



                                         43
Receiving messages
                     Erlang

loop(State) -> % a tail-recursive function
  receive
    {hello, From} ->
      greet(From), loop(State)
    ping ->
      doPingThing(), loop(State)
    {goodbye, From} ->
      From ! {kthxbye, self(), State} % no loop
  after 100
    loop(State+1) % inc # of timeouts
  end.

                                                  44
Receiving messages
                      Rubinius

def actor_process()
  looping = true
  while looping
    Actor.receive do |鍖lter|
    鍖lter.when Hello do |message|
       greet(message.from)
    end
    鍖lter.when Goodbye do |message|
       message.from << KThxBye[self]
       looping = false
    end
  end
end

                                       45
Receiving messages
                        Scala

def act()
  loop {
    receive {
       case Hello(from) => greet(from)
       case Ping() => doPingThing()
       case Goodbye(from) => {
         from ! KThxBye(self)
         exit()
       }
    }
  }
}

                                         46
Receiving messages
                        Io

MyActor := Object clone
MyActor hello := method(from, greet(from))
MyActor ping := method(doPingThing)
MyActor goodbye := method(from,
  from @@kthxbye(self)
)

anActor := MyActor clone // create actor instance
anActor @@hello(self)
anActor @@ping
anActor @@goodbye(self) // look ma, no loops!

                                                    47
Actors avoid deadlock
                        48
No locks, no dead

 Agha(1985) says the semantics of the
  Actor model mean that deadlock
  doesnt exist in a syntactic sense

 Semantic deadlock can be detected
  and removed easily using wait-for
  graphs



                                         49
Actors perform great!
                        50
Fine grained, hot CPU

 Lightweight context switching
 Actors dont suffer from locking
  granularity issues because there are
  no locks

 Actors can run full out on as many
  CPUs/machines as the underlying
  language can make available


                                         51
Conclusion

 Light, fast processes needed to see
  huge scalability

 Erlangs the fastest and most mature
  (see OTP)

 You cant sneeze in the JVM without
  declaring its chemical composition

 Io is a beautiful little language

                                         52
erlang is nice,
    because
  everything
  just works
    Paul Jenkins
    April 11, 2008


                     53
What next?

 Iolang... Io with:
   Support for multiple cores
   Easy way: one VM per core?
   Selective receive
   Support for remote actors


                                 54
No cows were hurt...
                       55
Thanks for listening
                                Picture credits
                  Billie Joe: http://鍖ickr.com/photos/15034493@N00/112357008/sizes/l/
                 Joe Armstrong: http://鍖ickr.com/photos/mbiddulph/2037845171/sizes/l/
                    Evan Phoenix: http://鍖ickr.com/photos/scoop/1403258349/sizes/o/
                     Steve Dekorte: http://鍖ickr.com/photos/x180/276960722/sizes/o/
Martin Odersky: http://picasaweb.google.com/JavaPolis.com/JavaPolis2007/photo#5144254997958003122
          Bruno: http://www.smh.com.au/ffximage/2006/10/31/bruno_wideweb__470x329,0.jpg
                Coady: http://鍖ickr.com/photos/sebastian_bergmann/116486823/sizes/o/
                           Ships: http://鍖ickr.com/photos/lesec/361956524/sizes/o/
                          Jim: http://鍖ickr.com/photos/kteague/278136366/sizes/o/
                       LOLcode: http://鍖ickr.com/photos/i-marco/534996407/sizes/o/
                      Triplets: http://鍖ickr.com/photos/origamijoel/217238954/sizes/l/
                         Spawn: http://鍖ickr.com/photos/austenhaines/399622840/
                 Parallel runners: http://鍖ickr.com/photos/moodeous/205711924/sizes/o/
                    Microscopic: http://鍖ickr.com/photos/braid44/2232461763/sizes/o/
                            Emoburger: http://鍖ickr.com/photos/gx9/269025682/
                    Cow: http://鍖ickr.com/photos/66164549@N00/542696674/sizes/o/
         icanhascheezburger: http://icanhascheezburger.com/2007/01/11/i-can-has-cheezburger/


                                                                                                    56
Questions
Make it quick, Pauls next




                             57
Dedicated to
 Cheryl, Cyan,
  Xavier, and
    Justin



                 58

More Related Content

Comparing implementations of the actor model

  • 1. Concurrency Summit 2008 Comparing implementations of the Actor Model Jim Roepcke <jr@uvic.ca> 1
  • 4. No, not that kind... 4
  • 5. The kind in Joe Armstrongs Erlang, 5
  • 6. The kind in Joe Armstrongs Erlang, 6
  • 7. Evan Phoenixs Rubinius, 7
  • 8. Martin Oderskys Scala, 8
  • 10. What is the Actor Model? 10
  • 11. Its a trendy model for concurrent programming 11
  • 12. Massively parallel future The future has begun! We had lots of time to 鍖gure this out Programmers are still using threads and mutexes in high level code Bad programmer! ABSTRACTION FTW! 12
  • 13. Whats old is new again Actors de鍖ned by Hewitt in 1973 More work by his PhD students in the 80s, Clinger, Agha Adopted by Erlang in the late 80s for the telecom industry Picking up steam as concurrency becomes a hot issue again 13
  • 14. Actors win because they are simple 14
  • 17. Actors run in parallel 17
  • 22. Comparing Actors to Actors Implemented a program in Erlang, Rubinius, Scala and Io My experiences with each 22
  • 23. OM NOM NOM! Implemented the burger problem from CSC 464 Assignment 1 in all four languages 23
  • 25. mmm hungry Student Student Student Burger burger! Student Student enjoy! Order Line Burger Line ok k Cook Cook Burger Burger supervisor 25
  • 27. Communication Asynchronous Message Passing Encourages no memory sharing Each actor has a mailbox which queues messages sent send mechanism to deliver a message to an actor 27
  • 28. Sending messages Erlang Rubinius pid ! message actor << message Scala Io actor ! message obj @@method(args) 28
  • 31. Creating actors To create concurrency, actors create more actors and send them messages Actors are independently executing entities 31
  • 32. Creating actors Erlang Rubinius pid = spawn(fun) actor = Actor.spawn ... Scala Io sa = new SomeActor() sa := SomeActor clone sa.start() 32
  • 33. Erlang Actors Actors are called processes Process creation and context switching is very fast and lightweight Processes cannot share memory Typically run a tail-recursive function 33
  • 34. Rubinius Actors Actor class comes with Rubinius VM Green Ruby thread per actor VM assigns a Mailbox per thread Remote Actors new, not perfect yet Orders of magnitude worse than Erlang: Rubinius developer on IRC 34
  • 35. Scala Actors scala.actors package comes with Scala Hybrid execution model, actors run in their own thread or via events Claim massive scalability using events and thread pools Remote Actors supported act() loops to stay alive 35
  • 36. Io Actors Io uses coroutines for concurrency Scheduling is FIFO, no prioritization One kernel thread per VM, async I/O @@ runs the method on a dedicated per-object coroutine for messages Remote actors not supported 36
  • 37. Actors run in parallel 37
  • 38. Parallelism: Erlang SMP Erlang automatically puts processes on different cores/CPUs Messaging actors in remote VMs is seamless spawn(Node, fun) to spawn an actor on a different VM which may be remote 38
  • 39. Parallelism: Rubinius One kernel thread per Rubinius VM Processor af鍖nity for multi-core? Use VMActor to create an actor on a remote VM Messaging actors in remote VMs is seamless thanks to duck typing 39
  • 40. Parallelism: Scala When using event-based actors, Scala creates multple threads to balance load across cores Use RemoteActor class to 鍖nd an actor on a different VM Messaging actors in remote VMs is seamless 40
  • 41. Parallelism: Io Nope :-( One kernel thread per VM No support for remote actors built-in 41
  • 43. Receiving messages Take a message off the mailbox queue Decide if you want to deal with it Messages are data Timeouts 43
  • 44. Receiving messages Erlang loop(State) -> % a tail-recursive function receive {hello, From} -> greet(From), loop(State) ping -> doPingThing(), loop(State) {goodbye, From} -> From ! {kthxbye, self(), State} % no loop after 100 loop(State+1) % inc # of timeouts end. 44
  • 45. Receiving messages Rubinius def actor_process() looping = true while looping Actor.receive do |鍖lter| 鍖lter.when Hello do |message| greet(message.from) end 鍖lter.when Goodbye do |message| message.from << KThxBye[self] looping = false end end end 45
  • 46. Receiving messages Scala def act() loop { receive { case Hello(from) => greet(from) case Ping() => doPingThing() case Goodbye(from) => { from ! KThxBye(self) exit() } } } } 46
  • 47. Receiving messages Io MyActor := Object clone MyActor hello := method(from, greet(from)) MyActor ping := method(doPingThing) MyActor goodbye := method(from, from @@kthxbye(self) ) anActor := MyActor clone // create actor instance anActor @@hello(self) anActor @@ping anActor @@goodbye(self) // look ma, no loops! 47
  • 49. No locks, no dead Agha(1985) says the semantics of the Actor model mean that deadlock doesnt exist in a syntactic sense Semantic deadlock can be detected and removed easily using wait-for graphs 49
  • 51. Fine grained, hot CPU Lightweight context switching Actors dont suffer from locking granularity issues because there are no locks Actors can run full out on as many CPUs/machines as the underlying language can make available 51
  • 52. Conclusion Light, fast processes needed to see huge scalability Erlangs the fastest and most mature (see OTP) You cant sneeze in the JVM without declaring its chemical composition Io is a beautiful little language 52
  • 53. erlang is nice, because everything just works Paul Jenkins April 11, 2008 53
  • 54. What next? Iolang... Io with: Support for multiple cores Easy way: one VM per core? Selective receive Support for remote actors 54
  • 55. No cows were hurt... 55
  • 56. Thanks for listening Picture credits Billie Joe: http://鍖ickr.com/photos/15034493@N00/112357008/sizes/l/ Joe Armstrong: http://鍖ickr.com/photos/mbiddulph/2037845171/sizes/l/ Evan Phoenix: http://鍖ickr.com/photos/scoop/1403258349/sizes/o/ Steve Dekorte: http://鍖ickr.com/photos/x180/276960722/sizes/o/ Martin Odersky: http://picasaweb.google.com/JavaPolis.com/JavaPolis2007/photo#5144254997958003122 Bruno: http://www.smh.com.au/ffximage/2006/10/31/bruno_wideweb__470x329,0.jpg Coady: http://鍖ickr.com/photos/sebastian_bergmann/116486823/sizes/o/ Ships: http://鍖ickr.com/photos/lesec/361956524/sizes/o/ Jim: http://鍖ickr.com/photos/kteague/278136366/sizes/o/ LOLcode: http://鍖ickr.com/photos/i-marco/534996407/sizes/o/ Triplets: http://鍖ickr.com/photos/origamijoel/217238954/sizes/l/ Spawn: http://鍖ickr.com/photos/austenhaines/399622840/ Parallel runners: http://鍖ickr.com/photos/moodeous/205711924/sizes/o/ Microscopic: http://鍖ickr.com/photos/braid44/2232461763/sizes/o/ Emoburger: http://鍖ickr.com/photos/gx9/269025682/ Cow: http://鍖ickr.com/photos/66164549@N00/542696674/sizes/o/ icanhascheezburger: http://icanhascheezburger.com/2007/01/11/i-can-has-cheezburger/ 56
  • 57. Questions Make it quick, Pauls next 57
  • 58. Dedicated to Cheryl, Cyan, Xavier, and Justin 58