Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アクターモデル
Search
ytakano
February 02, 2018
Programming
630
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
アクターモデル
ytakano
February 02, 2018
More Decks by ytakano
See All by ytakano
論理構造入門
ytakano
0
240
π計算
ytakano
0
85
FARIS: Fast and Memory-efficient URL Filter by Domain Specific Machine
ytakano
0
190
リアクティブプログラミング
ytakano
0
670
MindYourPrivacy: Design and Implementation of a Visualization System for Third-Party Web Tracking - IEEE PST 2014
ytakano
0
540
SF-TAP: Scalable and Flexible Traffic Analysis Platform running on Commodity Hardware
ytakano
0
730
SF-TAP Tutorial Flow Abstractor ver.
ytakano
0
760
Survey of Transactional Memory
ytakano
0
890
CUDA Memo
ytakano
0
710
Other Decks in Programming
See All in Programming
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
950
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
4.5k
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
130
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
530
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
660
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
230
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
870
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
Featured
See All Featured
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
310
エンジニアに許された特別な時間の終わり
watany
108
250k
Into the Great Unknown - MozCon
thekraken
41
2.6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
190
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
600
How to Talk to Developers About Accessibility
jct
2
410
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Everyday Curiosity
cassininazir
0
260
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
Transcript
アクターモデル 情報通信研究機構 サイバーセキュリティ研究室 ⾼野 祐輝
アクターモデルとは • 並⾏計算モデルの⼀つ • 1973年にCarl Hewittが発明 • アクターと呼ばれるプロセス同⼠が通信をしあって計算を⾏う • 計算能⼒はラムダ計算と等価(チューリング完全)
• プログラミング⾔語 • Erlang, Scala/Akka 2 アクターA アクターB メッセージ
π計算との違い 3 通信の同期⽅法 通信⼿法 メモリモデル π計算 同期通信 チャネルベース通信 共有メモリ アクターモデル
⾮同期通信 直接通信 分散メモリ
ラムダ計算を拡張したアクター⾔語 • アクターモデルの操作的意味論を記述 • ラムダ計算に、並⾏の概念を導⼊して実現 4
構⽂ 5 w ऍ w ΞτϜͱEFpOFఆͷΑ͏ͳͷ w ϖΞͷQS
ɺλϓϧͷ ͷΑ͏ͳͷ w JTQS ϖΞ͔Ͳ͏͔Λݕࠪ͢Δؔ w TU OEɺϖΞͷ൪ɺ൪ͷཁૉΛऔಘ͢ Δؔ A = {true, false, nil, . . . } ΞτϜ N = {0, 1, 2, . . . } ࣗવ X = {x, y, z, . . . } ม F = {+, , =, ispr?, 1st, 2nd, . . . } ϓϦϛςΟϒԋࢉࢠ V ::= A | N | X | X.E ϥϜμந | pr(V, V) ϖΞίϯετϥΫλ E ::= ࣜ V | pr(E, E) ϖΞίϯετϥΫλ | E(E) ؔద༻ | F(E, . . . , E) ϓϦϛςΟϒؔద༻ | br(E, E, E) ݅ذ | letrec X = E in E ࠶ؼఆٛ | send(E, E) ϝοηʔδૹ৴ | new(E) ΞΫλʔੜ | ready(E) ৼΔ͍มߋ
糖⾐構⽂ 6 let x = e1 in e2 x.e2(e1) seq(e1,
e2) let z = e1 in e2 ͨͩ͠ z ৽ن seq(e1, . . . , en) seq(e1, seq(e2, . . . , seq(en 1, en)) . . . ) ͨͩ͠ n 3 if(e1, e2, e3) br(e1, z.e2, z.e3)(nil) ͨͩ͠ z ৽ن rec(f) x.f( y.x(x)(y))( x.f( y.x(x)(y))) • 注釈 • let x = 1, y = 2 in e というように、複数定義も可能 • この場合は、λy.λx.e(2)(1) と等価 • rec(f)はZコンビネータ(不動点コンビネータ)
束縛変数と⾃由変数 • ラムダ抽象と、letrec式のみが束縛 • その他の変数は⾃由変数 7 x.E E
E தͷࣗ༝ม x Λଋറ letrec x = E1 in E2 E1, E2 தͷมΛଋറ
操作的意味論 • アクターコンフィグレーション • 各アクターの状態と、メッセージの集合 • アクターモデルの操作的意味論 • アクターコンフィグレーションからアクターコンフィグレーションへの 遷移について規定したもの
• ラベル付き状態遷移 8
アクターコンフィグレーション 9 ΞΫλʔίϯϑΟάϨʔγϣϯ ҎԼͷΑ͏ʹදه͞ΕΔɻ || µ ͨͩ͠ɺ ໊લ͖ΞΫλʔͷू߹Ͱ͋Γɺ µૹ৴தͷϝοηʔδͷू߹Ͱ͋Δɻ ΞΫλʔ໊͔ΒΞΫλʔࣜͷࣸ૾Ͱ͋Δɻ
͋ΔΞΫλʔ a ͷϝοηʔδ a v ͱදه͞ΕΔɻ ͜͜Ͱ v ϝοηʔδதʹؚ·ΕΔͰ͋Δɻ
アクターコンフィグレーションの例 10 a b 1 (メッセージ) 2つのアクターaとbが存在しており、 アクターaへ1というメッセージが配送中 [ࣜ1 ]a
, [ࣜ2 ]b || a 1
簡約コンテキスト 11 ͋ΔΞΫλʔࣜ e ҎԼͷΑ͏ʹදݱ͞ΕΔɻ e = R ӈลͷදݱΛ؆ίϯςΩετͱ͍͍ɺࣜ e
ͷ࣍ʹධՁ͞ΕΔࣜͰ͋Γɺ R ࣜ e தͷ ʹ૬͢Δ෦Λ Ͱஔ͖͑ͨͷͰ͋Δɻ ྫ send(new(e), 10) = send( , 10) new(e)
簡約可能な式と簡約コンテキストの構⽂ 12 Er ::= ؆Մೳͳࣜ V(V) ϥϜμద༻ | F(V, .
. . , V) ؔద༻ | br(V, E, E) ࣮݅ߦ | letrec X = V in E ࠶ؼఆٛ | send(V, V) ϝοηʔδૹ৴ | new(V) ΞΫλʔੜ | ready(V) ৼΔ͍มߋ R ::= ؆ίϯςΩετ Hole | pr(V, R) ϖΞίϯετϥΫλ | pr(R, E) ϖΞίϯετϥΫλ | V(R) ϥϜμద༻ | R(E) ϥϜμద༻ | F(V, . . . , V, R, E, . . . , E) ؔద༻ | br(R, E, E) ࣮݅ߦ | letrec X = R in E | send(V, R) ϝοηʔδૹ৴ | send(R, E) ϝοηʔδૹ৴ | new(R) ΞΫλʔੜ | ready(R) ৼΔ͍มߋ
拡張ラムダ計算の簡約規則 13 x.e(v) e{x/v} f(v1, . . . , vn)
v ͨͩ͠ɺ f F, v = [[f]](v1, . . . , v2) br(true, e, ) e br(false, , e) e 1st(pr(v, )) v 2nd(pr( , v)) v letrec x = v in e e{x/v{x/(letrec x = v in v)}}
操作的意味論 14 e e , [R e ]a || µ
[fun:a] , [R e ]a || µ , [R new(b) ]a || µ [new:a,a ] , [R a ]a, [ready(b)]a || µ ͨͩ͠ɺ a ৽ن , [R send(a , v) ] || µ [snd:a] , [R nil ]a || µ { a v } , [R ready(b) ]a || { a v } µ [rcv:a,v] , [b(v)]a || µ
簡約の例 15 a b 10 [ ready(e1) ]a, [seq( ,
ready(e2)) send(a, 10)) ]b || [snd:a] [ ready(e1) ]a, [seq( , ready(e2)) nil) ]b || a 10 [ ready(e1) ]a, [ ready(e2) ]b || a 10 [rcv:a,10] [ e1(10) ]a, [ ready(e2) ]b || (seqの箇所は⼀部省略)
計算⽊ (computation tree) 16 κ0 κ1 κ1ʼ κ2 κ2ʼ κ2ʼʼ
κ3 計算⽊の例 l1 ΛΞΫλʔίϯϑΟάϨʔγϣϯͱ͢Δͱ͖ɺܭࢉ ( ) ɺز͔ͭͷ n N ʹର͢Δɺશͯͷ ༗ݶϥϕϧ͖ભҠྻ [ i li+1 i+1 |i < n] ͷू߹Ͱ͋Δɻ͜͜Ͱɺ = 0 Ͱ͋Γɺ N ॱংू߹Ͱ͋Δɻ l1ʼ l2 l2ʼ l2ʼʼ l3 N = {0, 1, 1 , 2, 2 , 2 , 3} 0 < 1, 0 < 1 , 1 < 2, 1 < 2 , 1 < 2 , 2 < 3 ॱংू߹ͷԼʹఆٛ͞ΕΔྻΛܭࢉྻ (computation sequence ) ͱݺͼɺ શॱংू߹ͱʹఆٛ͞ΕΔྻΛܭࢉ࿏ (computation path) ͱݺͿɻ 計算列 計算路 ( ) ΛɺΞΫλʔίϯϑΟάϨʔγϣϯ ͔Β ౸ୡՄೳͳύεͷશू߹ͱදهɻ
公平性 17 ͋ΔભҠϥϕϧ l ͕༗ޮͰ͋ΔͨΊͷඞཁे݅ɺ l ͱͳΔ ͕ଘࡏ͢Δ͜ͱͰ͋Δɻ ͜͜Ͱɺ͋ΔભҠϥϕϧ [rcv
: a, v] ͕ӬଓతʹແޮԽ͞ΕΔͷɺ ΞΫλʔ a ͕ೋͱϝοηʔδͷड৴ঢ়ଶʹͳΒͳ͍ͱ͖Ͱ͋Δɻ ͋Δܭࢉ ( ) தͷɺ͋Δܭࢉ࿏ = [ i li+1 i+1 |i < ] ͕ެฏͰ͋Δͱɺ ͦΕͧΕͷ༗ޮͳભҠϥϕϧ͕࠷ऴతʹى͖Δɺ͘͠ӬଓతʹແޮԽ͞ΕΔͱ͖Ͱ͋Δɻ ( ) தͷશͯͷެฏͳܭࢉ࿏ͷू߹Λ F( ) ͱදهɻ
公平性の例 18 A セマフォ B acquire acquire A ok A
計算 セマフォ release A セマフォ acquire A ok time ・ ・ ・ Aしか実⾏できない公平でない計算路 (飢餓状態) A S B acquire acquire A ok 終了 計算 Aしか実⾏できないが公平な計算路 Sは永続的にメッセージを⾮受信状態に移⾏
例:排他実⾏ 19 sem = rec(λb.λh.λm. if(get?(m), if(h = nil, seq(send(cust(m),
true), ready(b(cust(m)))), seq(send(cust(m), false), ready(b(h))), if(release?(m), ready(b(nil)), ready(b(h))))) customer = rec(λb.λself.λs.λm. seq(if(m, seq(/* critical section */, send(s, mkrelease(self))), send(s, mkget(self))), ready(b(self)(s)))) // 補助関数 mkget = λh.pr(true, h) mkrelease = pr(false, nil) get? = λm.if(ispr?(m), 1st(m), false) release? = λm.if(ispr?(m), not(1st(m)), false) cust = λm.2nd(m) // 消費者が2⼈で実⾏する例 letrec s = new(sem(nil)), a = new(customer(a)(s)), b = new(customer(b)(s)) in seq(send(a, false), send(b, false))
EOF 20