Quasar: Actor Model and Light Weight Threads on Java

  • 1,599 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,599
On Slideshare
0
From Embeds
0
Number of Embeds
7

Actions

Shares
Downloads
2
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Quasar: Java のアクター/軽量スレッド 宮川 拓 / @miyakawa_taku 2014-08-22 JJUG LT大会
  • 2. 自己紹介 •宮川拓です •Kink という JVM 言語を作ってます –https://bitbucket.org/kink/kink •大相撲秋場所に向けて準備中です 1
  • 3. Quasar? •Erlang 的なアクターモデルを実現する Java ライブラリ 2
  • 4. アクターモデル •アクター(スレッド的なもの)同士がメッセージ を互いに投げ合って協調動作する計算モデル •オブジェクトを作る感覚でアクターを作る •つまり湯水のごとくスレッドを作る 3
  • 5. Scala のアクターと何が違うの? •Scala のアクター –ネイティブスレッドで実現されている •Quasar のアクター –軽量スレッドで実現されている 4
  • 6. 軽量スレッド? •軽量スレッド ::= –ユーザランド(カーネル外)で実現するスレッド –Go の goroutine, Erlang の「プロセス」など –Quasar では「Fiber」と呼ぶ •利点 –100万とか1,000万とかの数が作れる –ブロックが多発する状況では性能で有利 5
  • 7. 実現方法 •バイトコード操作でコンテキストスイッチ用の コードを仕込む –クラスロード時(-javaagent) or コンパイル時 6
  • 8. 実行時の動作 1.実行している命令の位置 2.ローカル変数のセット を自前のスタックに保存しながら実行する (ようにバイトコードを改変する) 7 class SenderFiber extends Fiber { public Void run() throws ... { int num = 42; channel.send(num); num = 24; channel.send(num); bye(); } } data=24
  • 9. 制御が離れる時の動作 •ブロック/yieldするメソッドが SuspendExecution例外を投げる •呼び出し元がキャッチして他の軽量スレッドに 制御を渡す 8 class SenderFiber extends Fiber { public Void run() throws ... { int num = 42; channel.send(num); num = 24; channel.send(num); bye(); } } SuspendExecution
  • 10. 制御が戻ってくる時の動作 •もう一度同じメソッドを呼び出す •メソッドの先頭で自前スタックから実行位置と ローカル変数を回復 •switch & ジャンプ 9 class SenderFiber extends Fiber { public Void run() throws ... { int num = 42; channel.send(num); num = 24; channel.send(num); bye(); } } ローカル変数回復 switch & ジャンプ