SlideShare a Scribd company logo
1 of 21
Download to read offline
Kilim-Clojure integration




              Message Passing Concurrency in Clojure using
                                Kilim

                              Antonio Garrote

                                  Forward


                             November 7, 2011
Kilim-Clojure integration




Clojure’s Concurrency Model




               JVM thread basic autonomous work unit
               Java shared memory explicit communication primitives
               Immutable data structures + implicit coordination
               mechanisms (STM, Refs)
Kilim-Clojure integration




Message Passing Communication

  1    % T e r m i t e Scheme b e n c h m a r k s r i n g . e r l
  2    m a k e r e l a y ( Next ) − >
  3           receive
  4                  K when K > 0 −          >
  5                         Next ! K − 1 ,
  6                         m a k e r e l a y ( Next ) ;
  7                  K−   >
  8                         Next ! K
  9          end .
 10
 11    l o o p (K , C u r r e n t , N) when N > 1 −          >
 12            l o o p (K , spawn ( r i n g , m a k e r e l a y , [ C u r r e n t ] ) ,N − 1 ) ;
 13
 14    l o o p (K , C u r r e n t , ) −>
 15            s e l f ( ) ! K,
 16            make relay ( Current ) .
 17
 18    % N = number p r o c e s s e s
 19    % K = number o f m e s s a g e e x c h a n g e s
 20    r i n g (N, K) −     >
 21            l o o p (K , s e l f ( ) , N ) .
Kilim-Clojure integration




Message Passing Communication


                            1
         2                      N
                                        N = 100K , K = 0
                                        518ms, 5µs process creation
   3                                K
                                        N = 100K , K = 1M
                                        759ms, 0.76µs local msg . send.
         4                      6
                            5
Kilim-Clojure integration




Message Passing Communication


       How does Erlang do it?


               User level processes executing recursive functions
               VM preemptive scheduling
               One heap/stack per process, no global heap
               Tail call optimisation
               More predictable GC behaviour
Kilim-Clojure integration




       Efficient implementation of message passing concurrency in the
       Java Virtual Machine?
Kilim-Clojure integration




Kilim


       “Kilim is a message-passing framework for Java that provides
       ultra-lightweight threads and facilities for fast, safe, zero-copy
       messaging between these threads”


               https://github.com/kilim/kilim
               2006 Sriram Srinivasan, Opera Group Cambridge University
               Current version 0.72
Kilim-Clojure integration




Kilim Tasks


                                                                                     Task

 1     p u b l i c c l a s s ExampleTask e x t e n d s Task {
 2                                                                                       execute
 3          p u b l i c void execute () throws Pausable {
 4                  doStuff ( ) ;
 5                  p u s a b l e S t u f f ( ) ; // t h r o w s P a u s a b l e    Worker
 6                  moreStuff ( ) ;                                                 Thread
 7          }
 8
 9    }                                                                                  notify

                                                                                   Scheduler
Kilim-Clojure integration




Kilim Weaving: Bytecode Transformation



               Additional step after compilation
               Transforms pausable methods
               Creates a custom class to store the task state
               Associates a Fiber object, tracks task’s stack
               Transformed code returns immediately if the task is paused
               Worker threads can resume the execution of paused stacks
               unwinding the associated fiber stack
Kilim-Clojure integration




Kilim Weaving: Bytecode Transformation
                 1    p u b l i c void execute ( Fiber f i b e r ) throws Pausable {
                 2            s w i t c h ( f i b e r . pc ) {
                 3               c a s e 0 : g o t o START ;
                 4               c a s e 1 : g o t o PAUSABLE CALL ;
                 5           }
                 6           START :
                 7               doStuff ( ) ;
                 8           PAUSABLE CALL :
                 9               f i b e r . down ( ) ;
                10               p u s a b l e S t u f f ( f i b e r ) ; // t h r o w s P a u s a b l e
                11               f i b e r . up ( ) ;
                12               switch ( f i b e r . status ) {
                13                        c a s e NOT PAUSING NO STATE :
                14                                g o t o RESUME ;
                15                        c a s e NOT PAUSING HAS STATE :
                16                                restoresState ( state );
                17                                g o t o RESUME ;
                18                        c a s e PAUSING NO STATE :
                19                                captureState ( state );
                20                                return ;
                21                        c a s e PAUSING HAS STATE :
                22                                return ;
                23               }
                24           RESUME :
                25               moreStuff ( ) ;
                26    }
Kilim-Clojure integration




Kilim Tasks: Execution

                                                                           Fiber.stack

                                           currentState                    StateObj.(1)
                            Pausable()
                                                                           StateObj.(2)
                                              currentState
                                  down()
                                                                           StateObj.(3)

                              Fiber         Pausable()

                                                                                  currentState
                                                       down()

                                               Fiber                 Pausable()



                                                                        up()


                                                             Pause             Normal Return
Kilim-Clojure integration




Kilim Messages




               Buffered mailboxes
               Allows asynchronous communication between tasks
               Blocking / not blocking interface
               Polling interface
Kilim-Clojure integration




Kilim-Clojure Integration (first attempt)




               Modified version of Clojure’s compiler
               Clojure’s functions executed as Kilim’s tasks
               Weaving performed at run-time


       https://github.com/antoniogarrote/clojure/tree/kilim
Kilim-Clojure integration




Kilim-Clojure Integration (second attempt)




               Clojure library
               [clj-kilim ”0.2.0-SNAPSHOT”]
               Doc: http://antoniogarrote.github.com/clojure kilim/
               Source: https://github.com/antoniogarrote/clojure kilim
Kilim-Clojure integration




Introduction

                Clojure
               Compiler


                      Compiles bytecode


              Java Class


                      Java instrumentation


                                               Kilim             Weaved Java
                clj-kilim
                                              Weaver                Class

                    Bytecode Transformation   Bytecode Transformation


                                                                     Class
                                                                    Loader
Kilim-Clojure integration




Kilim-Clojure Integration: API


  1    ( d e f − p a u s a b l e y i e l d i n g − f n [ mbox ]
  2          ( mbox−get−pausable mbox ) )
  3
  4
  5    ( def−pausable task−fn1 [ ]
  6       ...
  7       ( c a l l − p a u s a b l e y i e l d i n g − f n ambox )
  8       ...)
  9
 10    ( d e f task−fn2 ( p a u s a b l e        []    ...))
 11
 12
 13    ( t a s k − s t a r t task−fn1 )
 14    ( t a s k − s t a r t task−fn2 )
Kilim-Clojure integration




Kilim-Clojure Integration




       Demo
Kilim-Clojure integration




       Performance
Kilim-Clojure integration




Ring example again
  1    ( d e f n ˆ { : p a u s a b l e t r u e } make−relay [ ˆ k i l i m . M a i l b o x s e l f
  2                                                           ˆ k i l i m . Mailbox next
  3                                                           ˆ k i l i m . Mailbox f i n a l ]
  4        ( loop [ k ( r e c e i v e s e l f ) ]
  5            ( i f (> k 0 )
  6                ( do
  7                   ( ! next ( dec k ) )
  8                   ( recur ( . get s e l f )))
  9                ( do
 10                   ( ! next ( dec k ) )
 11                   ( when ( n o t ( n i l ? f i n a l ) )
 12                      (! f i n a l true ))))))
 13
 14
 15    ( d e f n make−loop [ n k ]
 16        ( l e t [ˆ k i l i m . Mailbox f i r s t − m a i l b o x ( k i l i m . Mailbox . )
 17                   ˆ k i l i m . Mailbox final−mailbox ( k i l i m . Mailbox . ) ]
 18            ( loop [ current           first−mailbox
 19                         n n]
 20               ( i f (> n 1 )
 21                   ( recur
 22                     ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x s e l f ]
 23                                               ( make−relay s e l f c u r r e n t n i l ) ) )
 24                     ( dec n ) )
 25                   ( do ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x      ]
 26                                                    ( make−relay f i r s t − m a i l b o x c u r r e n t f i n a l − m a i l b o x ) ) )
 27                             (! first−mailbox k)
 28                             ( . getb final−mailbox ) ) ) ) ) )
Kilim-Clojure integration




Performance




       N = 100K , K = 0
       1264ms, 12µs process creation

       N = 100K , K = 1M
       3276ms, 3µs local msg . send.
Kilim-Clojure integration




Conclusions


               Efficient message passing possible in the JVM thanks to Kilim
               Clojure can be a nice match for Kilim (immutable messages,
               run-time weaving)
               Benefits of asynchronous evented code with a nicer interface
               Limitations: non-preemptive
               Way to go?
                        Improve performance
                        Add distribution

More Related Content

Similar to Message Passing Concurrency in Clojure using Kilim

Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Igalia
 
Advanced Topics Sorting
Advanced Topics SortingAdvanced Topics Sorting
Advanced Topics Sorting
Sri Prasanna
 
Learning LWF Chain Graphs: A Markov Blanket Discovery Approach
Learning LWF Chain Graphs: A Markov Blanket Discovery ApproachLearning LWF Chain Graphs: A Markov Blanket Discovery Approach
Learning LWF Chain Graphs: A Markov Blanket Discovery Approach
Pooyan Jamshidi
 

Similar to Message Passing Concurrency in Clojure using Kilim (20)

Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
Channels, Concurrency, and Cores: A new Concurrent ML implementation (Curry O...
 
Ast2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada Programs
Ast2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada ProgramsAst2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada Programs
Ast2Cfg - A Framework for CFG-Based Analysis and Visualisation of Ada Programs
 
Range Extended Second Order Digital Phase Locked Loop
Range Extended Second Order Digital Phase Locked LoopRange Extended Second Order Digital Phase Locked Loop
Range Extended Second Order Digital Phase Locked Loop
 
The State of Lightweight Threads for the JVM
The State of Lightweight Threads for the JVMThe State of Lightweight Threads for the JVM
The State of Lightweight Threads for the JVM
 
Advanced Topics Sorting
Advanced Topics SortingAdvanced Topics Sorting
Advanced Topics Sorting
 
Fork Join (BeJUG 2012)
Fork Join (BeJUG 2012)Fork Join (BeJUG 2012)
Fork Join (BeJUG 2012)
 
Kamil witecki asynchronous, yet readable, code
Kamil witecki asynchronous, yet readable, codeKamil witecki asynchronous, yet readable, code
Kamil witecki asynchronous, yet readable, code
 
MSc_thesis
MSc_thesisMSc_thesis
MSc_thesis
 
Nondeterministic Finite Automata AFN.pdf
Nondeterministic Finite Automata AFN.pdfNondeterministic Finite Automata AFN.pdf
Nondeterministic Finite Automata AFN.pdf
 
Introduction to Verilog & code coverage
Introduction to Verilog & code coverageIntroduction to Verilog & code coverage
Introduction to Verilog & code coverage
 
Lecture 23 loop transfer function
Lecture 23 loop transfer functionLecture 23 loop transfer function
Lecture 23 loop transfer function
 
Fork/Join for Fun and Profit!
Fork/Join for Fun and Profit!Fork/Join for Fun and Profit!
Fork/Join for Fun and Profit!
 
Errors errors, everywhere! - JSession
Errors errors, everywhere! - JSessionErrors errors, everywhere! - JSession
Errors errors, everywhere! - JSession
 
Mit cilk
Mit cilkMit cilk
Mit cilk
 
DHow2 - L6 VHDL
DHow2 - L6 VHDLDHow2 - L6 VHDL
DHow2 - L6 VHDL
 
2706264.ppt
2706264.ppt2706264.ppt
2706264.ppt
 
Nondeterministic testing of Sequential Quantum Logic Propositions on a Quant...
Nondeterministic testing of Sequential Quantum Logic  Propositions on a Quant...Nondeterministic testing of Sequential Quantum Logic  Propositions on a Quant...
Nondeterministic testing of Sequential Quantum Logic Propositions on a Quant...
 
NLP@ICLR2019
NLP@ICLR2019NLP@ICLR2019
NLP@ICLR2019
 
Goblin Plonk.pdf
Goblin Plonk.pdfGoblin Plonk.pdf
Goblin Plonk.pdf
 
Learning LWF Chain Graphs: A Markov Blanket Discovery Approach
Learning LWF Chain Graphs: A Markov Blanket Discovery ApproachLearning LWF Chain Graphs: A Markov Blanket Discovery Approach
Learning LWF Chain Graphs: A Markov Blanket Discovery Approach
 

More from Antonio Garrote Hernández (7)

API Modeling Framework: a toolbox ofr API specs. Gluecon 2017
API Modeling Framework: a toolbox ofr API specs. Gluecon 2017API Modeling Framework: a toolbox ofr API specs. Gluecon 2017
API Modeling Framework: a toolbox ofr API specs. Gluecon 2017
 
Linked Data APIs (Funding Circle May 2015)
Linked Data APIs (Funding Circle May 2015)Linked Data APIs (Funding Circle May 2015)
Linked Data APIs (Funding Circle May 2015)
 
4th European Lisp Symposium: Jobim: an Actors Library for the Clojure Program...
4th European Lisp Symposium: Jobim: an Actors Library for the Clojure Program...4th European Lisp Symposium: Jobim: an Actors Library for the Clojure Program...
4th European Lisp Symposium: Jobim: an Actors Library for the Clojure Program...
 
RESTful writable APIs for the web of Linked Data using relational storage sol...
RESTful writable APIs for the web of Linked Data using relational storage sol...RESTful writable APIs for the web of Linked Data using relational storage sol...
RESTful writable APIs for the web of Linked Data using relational storage sol...
 
lisp (vs ruby) metaprogramming
lisp (vs ruby) metaprogramminglisp (vs ruby) metaprogramming
lisp (vs ruby) metaprogramming
 
Developing Distributed Semantic Systems
Developing Distributed Semantic SystemsDeveloping Distributed Semantic Systems
Developing Distributed Semantic Systems
 
Egearmand: an Erlang Gearman daemon
Egearmand: an Erlang Gearman daemonEgearmand: an Erlang Gearman daemon
Egearmand: an Erlang Gearman daemon
 

Recently uploaded

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 

Message Passing Concurrency in Clojure using Kilim

  • 1. Kilim-Clojure integration Message Passing Concurrency in Clojure using Kilim Antonio Garrote Forward November 7, 2011
  • 2. Kilim-Clojure integration Clojure’s Concurrency Model JVM thread basic autonomous work unit Java shared memory explicit communication primitives Immutable data structures + implicit coordination mechanisms (STM, Refs)
  • 3. Kilim-Clojure integration Message Passing Communication 1 % T e r m i t e Scheme b e n c h m a r k s r i n g . e r l 2 m a k e r e l a y ( Next ) − > 3 receive 4 K when K > 0 − > 5 Next ! K − 1 , 6 m a k e r e l a y ( Next ) ; 7 K− > 8 Next ! K 9 end . 10 11 l o o p (K , C u r r e n t , N) when N > 1 − > 12 l o o p (K , spawn ( r i n g , m a k e r e l a y , [ C u r r e n t ] ) ,N − 1 ) ; 13 14 l o o p (K , C u r r e n t , ) −> 15 s e l f ( ) ! K, 16 make relay ( Current ) . 17 18 % N = number p r o c e s s e s 19 % K = number o f m e s s a g e e x c h a n g e s 20 r i n g (N, K) − > 21 l o o p (K , s e l f ( ) , N ) .
  • 4. Kilim-Clojure integration Message Passing Communication 1 2 N N = 100K , K = 0 518ms, 5µs process creation 3 K N = 100K , K = 1M 759ms, 0.76µs local msg . send. 4 6 5
  • 5. Kilim-Clojure integration Message Passing Communication How does Erlang do it? User level processes executing recursive functions VM preemptive scheduling One heap/stack per process, no global heap Tail call optimisation More predictable GC behaviour
  • 6. Kilim-Clojure integration Efficient implementation of message passing concurrency in the Java Virtual Machine?
  • 7. Kilim-Clojure integration Kilim “Kilim is a message-passing framework for Java that provides ultra-lightweight threads and facilities for fast, safe, zero-copy messaging between these threads” https://github.com/kilim/kilim 2006 Sriram Srinivasan, Opera Group Cambridge University Current version 0.72
  • 8. Kilim-Clojure integration Kilim Tasks Task 1 p u b l i c c l a s s ExampleTask e x t e n d s Task { 2 execute 3 p u b l i c void execute () throws Pausable { 4 doStuff ( ) ; 5 p u s a b l e S t u f f ( ) ; // t h r o w s P a u s a b l e Worker 6 moreStuff ( ) ; Thread 7 } 8 9 } notify Scheduler
  • 9. Kilim-Clojure integration Kilim Weaving: Bytecode Transformation Additional step after compilation Transforms pausable methods Creates a custom class to store the task state Associates a Fiber object, tracks task’s stack Transformed code returns immediately if the task is paused Worker threads can resume the execution of paused stacks unwinding the associated fiber stack
  • 10. Kilim-Clojure integration Kilim Weaving: Bytecode Transformation 1 p u b l i c void execute ( Fiber f i b e r ) throws Pausable { 2 s w i t c h ( f i b e r . pc ) { 3 c a s e 0 : g o t o START ; 4 c a s e 1 : g o t o PAUSABLE CALL ; 5 } 6 START : 7 doStuff ( ) ; 8 PAUSABLE CALL : 9 f i b e r . down ( ) ; 10 p u s a b l e S t u f f ( f i b e r ) ; // t h r o w s P a u s a b l e 11 f i b e r . up ( ) ; 12 switch ( f i b e r . status ) { 13 c a s e NOT PAUSING NO STATE : 14 g o t o RESUME ; 15 c a s e NOT PAUSING HAS STATE : 16 restoresState ( state ); 17 g o t o RESUME ; 18 c a s e PAUSING NO STATE : 19 captureState ( state ); 20 return ; 21 c a s e PAUSING HAS STATE : 22 return ; 23 } 24 RESUME : 25 moreStuff ( ) ; 26 }
  • 11. Kilim-Clojure integration Kilim Tasks: Execution Fiber.stack currentState StateObj.(1) Pausable() StateObj.(2) currentState down() StateObj.(3) Fiber Pausable() currentState down() Fiber Pausable() up() Pause Normal Return
  • 12. Kilim-Clojure integration Kilim Messages Buffered mailboxes Allows asynchronous communication between tasks Blocking / not blocking interface Polling interface
  • 13. Kilim-Clojure integration Kilim-Clojure Integration (first attempt) Modified version of Clojure’s compiler Clojure’s functions executed as Kilim’s tasks Weaving performed at run-time https://github.com/antoniogarrote/clojure/tree/kilim
  • 14. Kilim-Clojure integration Kilim-Clojure Integration (second attempt) Clojure library [clj-kilim ”0.2.0-SNAPSHOT”] Doc: http://antoniogarrote.github.com/clojure kilim/ Source: https://github.com/antoniogarrote/clojure kilim
  • 15. Kilim-Clojure integration Introduction Clojure Compiler Compiles bytecode Java Class Java instrumentation Kilim Weaved Java clj-kilim Weaver Class Bytecode Transformation Bytecode Transformation Class Loader
  • 16. Kilim-Clojure integration Kilim-Clojure Integration: API 1 ( d e f − p a u s a b l e y i e l d i n g − f n [ mbox ] 2 ( mbox−get−pausable mbox ) ) 3 4 5 ( def−pausable task−fn1 [ ] 6 ... 7 ( c a l l − p a u s a b l e y i e l d i n g − f n ambox ) 8 ...) 9 10 ( d e f task−fn2 ( p a u s a b l e [] ...)) 11 12 13 ( t a s k − s t a r t task−fn1 ) 14 ( t a s k − s t a r t task−fn2 )
  • 19. Kilim-Clojure integration Ring example again 1 ( d e f n ˆ { : p a u s a b l e t r u e } make−relay [ ˆ k i l i m . M a i l b o x s e l f 2 ˆ k i l i m . Mailbox next 3 ˆ k i l i m . Mailbox f i n a l ] 4 ( loop [ k ( r e c e i v e s e l f ) ] 5 ( i f (> k 0 ) 6 ( do 7 ( ! next ( dec k ) ) 8 ( recur ( . get s e l f ))) 9 ( do 10 ( ! next ( dec k ) ) 11 ( when ( n o t ( n i l ? f i n a l ) ) 12 (! f i n a l true )))))) 13 14 15 ( d e f n make−loop [ n k ] 16 ( l e t [ˆ k i l i m . Mailbox f i r s t − m a i l b o x ( k i l i m . Mailbox . ) 17 ˆ k i l i m . Mailbox final−mailbox ( k i l i m . Mailbox . ) ] 18 ( loop [ current first−mailbox 19 n n] 20 ( i f (> n 1 ) 21 ( recur 22 ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x s e l f ] 23 ( make−relay s e l f c u r r e n t n i l ) ) ) 24 ( dec n ) ) 25 ( do ( spawn ( p a u s a b l e [ ˆ k i l i m . M a i l b o x ] 26 ( make−relay f i r s t − m a i l b o x c u r r e n t f i n a l − m a i l b o x ) ) ) 27 (! first−mailbox k) 28 ( . getb final−mailbox ) ) ) ) ) )
  • 20. Kilim-Clojure integration Performance N = 100K , K = 0 1264ms, 12µs process creation N = 100K , K = 1M 3276ms, 3µs local msg . send.
  • 21. Kilim-Clojure integration Conclusions Efficient message passing possible in the JVM thanks to Kilim Clojure can be a nice match for Kilim (immutable messages, run-time weaving) Benefits of asynchronous evented code with a nicer interface Limitations: non-preemptive Way to go? Improve performance Add distribution