$30 off During Our Annual Pro Sale. View Details »

アクターモデル

ytakano
February 02, 2018

 アクターモデル

ytakano

February 02, 2018
Tweet

More Decks by ytakano

Other Decks in Programming

Transcript

  1. アクターモデル 情報通信研究機構 サイバーセキュリティ研究室 ⾼野 祐輝

  2. アクターモデルとは • 並⾏計算モデルの⼀つ • 1973年にCarl Hewittが発明 • アクターと呼ばれるプロセス同⼠が通信をしあって計算を⾏う • 計算能⼒はラムダ計算と等価(チューリング完全)

    • プログラミング⾔語 • Erlang, Scala/Akka 2 アクターA アクターB メッセージ
  3. π計算との違い 3 通信の同期⽅法 通信⼿法 メモリモデル π計算 同期通信 チャネルベース通信 共有メモリ アクターモデル

    ⾮同期通信 直接通信 分散メモリ
  4. ラムダ計算を拡張したアクター⾔語 • アクターモデルの操作的意味論を記述 • ラムダ計算に、並⾏の概念を導⼊して実現 4

  5. 構⽂ 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. 糖⾐構⽂ 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コンビネータ(不動点コンビネータ)
  7. 束縛変数と⾃由変数 • ラムダ抽象と、letrec式のみが束縛 • その他の変数は⾃由変数 7 x.E ͸ E ͸

    E தͷࣗ༝ม਺ x Λଋറ letrec x = E1 in E2 ͸ E1, E2 தͷม਺Λଋറ
  8. 操作的意味論 • アクターコンフィグレーション • 各アクターの状態と、メッセージの集合 • アクターモデルの操作的意味論 • アクターコンフィグレーションからアクターコンフィグレーションへの 遷移について規定したもの

    • ラベル付き状態遷移 8
  9. アクターコンフィグレーション 9 ΞΫλʔίϯϑΟάϨʔγϣϯ ͸ҎԼͷΑ͏ʹදه͞ΕΔɻ || µ ͨͩ͠ɺ ͸໊લ෇͖ΞΫλʔͷू߹Ͱ͋Γɺ µ͸ૹ৴தͷϝοηʔδͷू߹Ͱ͋Δɻ ͸ΞΫλʔ໊͔ΒΞΫλʔࣜ΁ͷࣸ૾Ͱ΋͋Δɻ

    ͋ΔΞΫλʔ a ΁ͷϝοηʔδ͸ a v ͱදه͞ΕΔɻ ͜͜Ͱ v ͸ϝοηʔδதʹؚ·ΕΔ஋Ͱ͋Δɻ
  10. アクターコンフィグレーションの例 10 a b 1 (メッセージ) 2つのアクターaとbが存在しており、 アクターaへ1というメッセージが配送中 [ࣜ1 ]a

    , [ࣜ2 ]b || a 1
  11. 簡約コンテキスト 11 ͋ΔΞΫλʔࣜ e ͸ҎԼͷΑ͏ʹදݱ͞ΕΔɻ e = R ӈลͷදݱΛ؆໿ίϯςΩετͱ͍͍ɺ͸ࣜ e

    ͷ࣍ʹධՁ͞ΕΔࣜͰ͋Γɺ R ͸ࣜ e தͷ ʹ૬౰͢Δ෦෼Λ Ͱஔ͖׵͑ͨ΋ͷͰ͋Δɻ ྫ send(new(e), 10) = send( , 10) new(e)
  12. 簡約可能な式と簡約コンテキストの構⽂ 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. 拡張ラムダ計算の簡約規則 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. 操作的意味論 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. 簡約の例 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の箇所は⼀部省略)
  16. 計算⽊ (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. 公平性 17 ͋ΔભҠϥϕϧ l ͕༗ޮͰ͋ΔͨΊͷඞཁे෼৚݅͸ɺ l ͱͳΔ ͕ଘࡏ͢Δ͜ͱͰ͋Δɻ ͜͜Ͱɺ͋ΔભҠϥϕϧ [rcv

    : a, v] ͕ӬଓతʹແޮԽ͞ΕΔͷ͸ɺ ΞΫλʔ a ͕ೋ౓ͱϝοηʔδͷड৴ঢ়ଶʹͳΒͳ͍ͱ͖Ͱ͋Δɻ ͋Δܭࢉ໦ ( ) தͷɺ͋Δܭࢉ࿏ = [ i li+1 i+1 |i < ] ͕ެฏͰ͋Δͱ͸ɺ ͦΕͧΕͷ༗ޮͳભҠϥϕϧ͕࠷ऴతʹى͖Δɺ΋͘͠͸ӬଓతʹແޮԽ͞ΕΔͱ͖Ͱ͋Δɻ ( ) தͷશͯͷެฏͳܭࢉ࿏ͷू߹Λ F( ) ͱදهɻ
  18. 公平性の例 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. 例:排他実⾏ 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))
  20. EOF 20