Top Banner
Comparing implementations of the Actor Model Jim Roepcke <[email protected] > Concurrency Summit 2008 1
58

Comparing implementations of the actor model

May 19, 2015

Download

Technology

Jim Roepcke

Presentation for term paper for CSC 464 Concurrency, in Victoria, in April 2008.

Slideshare removed the photos, here's a PDF version https://dl.dropboxusercontent.com/u/169716/csc464-project/Comparing%20Implementations%20of%20the%20Actor%20Model.pdf
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Comparing implementations of the actor model

Comparing implementations of

the Actor ModelJim Roepcke<[email protected]>

Concurrency Summit 2008

1

Page 2: Comparing implementations of the actor model

Actor models?

2

Page 3: Comparing implementations of the actor model

This kind?3

Page 4: Comparing implementations of the actor model

No, not that kind...

4

Page 5: Comparing implementations of the actor model

The kind in Joe Armstrong’s Erlang,

5

Page 6: Comparing implementations of the actor model

The kind in Joe Armstrong’s Erlang,

6

Page 7: Comparing implementations of the actor model

Evan Phoenix’s Rubinius,

7

Page 8: Comparing implementations of the actor model

Martin Odersky’s Scala,

8

Page 9: Comparing implementations of the actor model

and Steve Dekorte’sIo.

9

Page 10: Comparing implementations of the actor model

What is theActor Model?

10

Page 11: Comparing implementations of the actor model

It’s a trendy model for

concurrent programming

11

Page 12: Comparing implementations of the actor model

Massively parallel future

• The future has begun!

• We had lots of time to figure this out

• Programmers are still using threads and mutexes in “high level” code

• Bad programmer!

• ABSTRACTION FTW!

12

Page 13: Comparing implementations of the actor model

What’s old is new again

• Actors defined 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

Page 14: Comparing implementations of the actor model

Actors win because they are simple

14

Page 15: Comparing implementations of the actor model

Actors communicate15

Page 16: Comparing implementations of the actor model

Actors spawn16

Page 17: Comparing implementations of the actor model

Actors run in parallel17

Page 18: Comparing implementations of the actor model

Actors listen18

Page 19: Comparing implementations of the actor model

Actors avoid deadlock19

Page 20: Comparing implementations of the actor model

Actors perform great!20

Page 21: Comparing implementations of the actor model

Now: up close21

Page 22: Comparing implementations of the actor model

ComparingActors to Actors

• Implemented a program in Erlang, Rubinius, Scala and Io

• My experiences with each

22

Page 23: Comparing implementations of the actor model

OM NOM NOM!

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

23

Page 24: Comparing implementations of the actor model

supervisor

spawn!

24

Page 25: Comparing implementations of the actor model

Student

Cook

Student

Student

Order Line

CookCook

Burger Line

Student

StudentStudent

Burger Burger

Burger

hungry

burger!

enjoy!

ok

mmm

supervisor 25

Page 26: Comparing implementations of the actor model

Actors communicate26

Page 27: Comparing implementations of the actor model

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

Page 28: Comparing implementations of the actor model

Sending messages

Erlang

pid ! message

Rubinius

actor << message

Scala

actor ! message

Io

obj @@method(args)

28

Page 29: Comparing implementations of the actor model

Actors and burgers29

Page 30: Comparing implementations of the actor model

Actors spawn30

Page 31: Comparing implementations of the actor model

Creating actors

• To create concurrency, actors create more actors and send them messages

• Actors are independently executing entities

31

Page 32: Comparing implementations of the actor model

Creating actors

Erlang

pid = spawn(fun)

Rubinius

actor = Actor.spawn ...

Scala

sa = new SomeActor()sa.start()

Io

sa := SomeActor clone

32

Page 33: Comparing implementations of the actor model

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

Page 34: Comparing implementations of the actor model

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

Page 35: Comparing implementations of the actor model

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

Page 36: Comparing implementations of the actor model

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

Page 37: Comparing implementations of the actor model

Actors run in parallel37

Page 38: Comparing implementations of the actor model

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

Page 39: Comparing implementations of the actor model

Parallelism: Rubinius

• One kernel thread per Rubinius VM

• Processor affinity 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

Page 40: Comparing implementations of the actor model

Parallelism: Scala

• When using event-based actors, Scala creates multple threads to balance load across cores

• Use RemoteActor class to find an actor on a different VM

• Messaging actors in remote VMs is seamless

40

Page 41: Comparing implementations of the actor model

Parallelism: Io

•Nope :-(

•One kernel thread per VM

•No support for remote actors built-in

41

Page 42: Comparing implementations of the actor model

Actors listen42

Page 43: Comparing implementations of the actor model

Receiving messages

• Take a message off the mailbox queue

• Decide if you want to deal with it

• Messages are data

• Timeouts

43

Page 44: Comparing implementations of the actor model

Receiving messagesErlang

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

Page 45: Comparing implementations of the actor model

Receiving messagesRubinius

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

45

Page 46: Comparing implementations of the actor model

Receiving messagesScala

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

46

Page 47: Comparing implementations of the actor model

Receiving messagesIo

MyActor := Object cloneMyActor 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 @@pinganActor @@goodbye(self) // look ma, no loops!

47

Page 48: Comparing implementations of the actor model

Actors avoid deadlock48

Page 49: Comparing implementations of the actor model

No locks, no dead

• Agha(1985) says the semantics of the Actor model mean that deadlock doesn’t exist in a syntactic sense

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

49

Page 50: Comparing implementations of the actor model

Actors perform great!50

Page 51: Comparing implementations of the actor model

Fine grained, hot CPU

• Lightweight context switching

• Actors don’t 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

Page 52: Comparing implementations of the actor model

Conclusion

• Light, fast processes needed to see huge scalability

• Erlang’s the fastest and most mature (see OTP)

• You can’t sneeze in the JVM without declaring it’s chemical composition

• Io is a beautiful little language

52

Page 53: Comparing implementations of the actor model

“erlang is nice, because

everything just works”

Paul JenkinsApril 11, 2008

53

Page 54: Comparing implementations of the actor model

What next?

• Iolang... Io with:

• Support for multiple cores

• Easy way: one VM per core?

• Selective receive

• Support for remote actors

54

Page 55: Comparing implementations of the actor model

No cows were hurt...55

Page 56: Comparing implementations of the actor model

Picture creditsBillie Joe: http://flickr.com/photos/15034493@N00/112357008/sizes/l/

Joe Armstrong: http://flickr.com/photos/mbiddulph/2037845171/sizes/l/Evan Phoenix: http://flickr.com/photos/scoop/1403258349/sizes/o/Steve Dekorte: http://flickr.com/photos/x180/276960722/sizes/o/

Martin Odersky: http://picasaweb.google.com/JavaPolis.com/JavaPolis2007/photo#5144254997958003122Bruno: http://www.smh.com.au/ffximage/2006/10/31/bruno_wideweb__470x329,0.jpg

Coady: http://flickr.com/photos/sebastian_bergmann/116486823/sizes/o/Ships: http://flickr.com/photos/lesec/361956524/sizes/o/

Jim: http://flickr.com/photos/kteague/278136366/sizes/o/LOLcode: http://flickr.com/photos/i-marco/534996407/sizes/o/

Triplets: http://flickr.com/photos/origamijoel/217238954/sizes/l/Spawn: http://flickr.com/photos/austenhaines/399622840/

Parallel runners: http://flickr.com/photos/moodeous/205711924/sizes/o/Microscopic: http://flickr.com/photos/braid44/2232461763/sizes/o/

Emoburger: http://flickr.com/photos/gx9/269025682/Cow: http://flickr.com/photos/66164549@N00/542696674/sizes/o/

icanhascheezburger: http://icanhascheezburger.com/2007/01/11/i-can-has-cheezburger/

Thanks for listening

56

Page 57: Comparing implementations of the actor model

QuestionsMake it quick, Paul’s next

57

Page 58: Comparing implementations of the actor model

Dedicated toCheryl, Cyan, Xavier, and

Justin

58