アクターモデルの実装

コンピュータ サイエンスにおいて、アクター モデルの実装は、アクター モデルの実装に関する問題に関係します。

コズミックキューブ

Caltech Cosmic Cubeは、CaltechのChuck Seitzによって開発され、アクターシステムのアーキテクチャサポートを提供しました。Cosmic Cubeと他の多くの並列プロセッサとの大きな違いは、このMIMD(Multiple Instruction, Multiple Data)マシンが、同時実行プロセス間の通信に共有変数ではなくメッセージパッシングを使用していることです。この計算モデルはハードウェア構造とオペレーティングシステムに反映されており、プログラマーにとって明示的なメッセージパッシング通信でもあります。Seitz [1985]によると、以下の通りです。

Cosmic Cube実験では、ノード間通信が非常に多数のノードに拡張可能であることが前提でした。ハイパーキューブのような直接ネットワークは、多数の同時通信チャネルで実現される総帯域幅と実装の実現可能性の両方において、この要件を満たします。ハイパーキューブは、実際にはオメガネットワークやバンヤンネットワークのような間接対数スイッチングネットワークの分散型です。共有ストレージ構成では、通常、均一な通信パスが使用されます。しかし、ハイパーキューブアーキテクチャでは、通信パスが通過するチャネル数が変化するため、レイテンシが異なります。これにより、通信の局所性に基づいてノードにプロセスを配置することで、パフォーマンスを最適化することができます。

Jマシン

J -Machineは、MITのBill Dallyによって開発され、アクターに適したアーキテクチャサポートを提供します。これには以下のものが含まれます。

  • 非同期メッセージング
  • 受信側アクターがローカルか非ローカルかに関係なく、同時にメッセージを送信できるアクターアドレスの均一な空間
  • アクターパイプラインの形式(アクターモデルを参照)

並行Smalltalk (アクターを使用してモデル化可能) は、J マシンをプログラムするために開発されました。

プロトタイプアクタープログラミング言語

Hewitt [2006]は、アクターの行動の重要な側面を直接表現するという意味において、 プロトタイプのアクタープログラミング言語を提示した。メッセージはXMLで以下の記法を用いて表現される。:<tag>[<element>1 ... <element>] for

“<”<tag>“>” <element>1 ... <element>n “<”/<tag>“>”

プログラミング言語のセマンティクスは、各プログラム構成要素を独自の動作を持つアクターとして表現することで定義されます。実行は、実行時にこれらの構成要素間でEvalメッセージを渡すことでモデル化されます。

環境アクター

Evalメッセージには、プログラム識別子のバインディングを持つ環境として機能するアクターのアドレスがあります。環境アクターは不変、つまり変化しません。Request[Bind[identifier value] customer]アクター環境が を受信すると、新しい環境アクターが作成されます。新しい環境アクターが を受信すると、 が と同じであればを送信し、そうでない場合は を送信しますRequest[Lookup[identifier’] customer’]。上記は、を受信すると を送信するアクターに基づいています。リクエストを受信すると、上記 と同様に動作します。identifieridentifier’customer’Returned[value]Environment Request[Lookup[identifier’] customer’]EmptyEnvironmentRequest[Lookup[identifier] customer]customerThrown[NotFound[identifier]]BindEmptyEnvironmentEnvironment

表現

プロトタイプ プログラミング言語には、次の種類の式があります。

<識別子>
Request[Eval[environment] customer]受信したら送信environmentRequest[Lookup[<identifier>] customer]
送信<受信者> <通信>
を受け取ったらRequest[Eval[environment] customer]、 新しいアクターを次の場所に送ります。<recipient>Request[Eval[environment] evalCustomer1]evalCustomer1
通信を受信したら送信するevalCustomer1Returned[theRecipient]<communication>
Request[Eval[environment] evalCustomer2]新たなアクターはどこにいるのかevalCustomer2
通信を受信したら、 を送信します。evalCustomer2Returned[theCommunication]theRecipienttheCommunication
<受信者>.<メッセージ>
受信したらRequest[Eval[environment] customer]、次のように送信します<recipient>Request[Eval[environment] evalCustomer1]
通信を受信したら、次のように送信します。evalCustomer1Returned[theRecipient]<message>Request[Eval[environment] evalCustomer2]
通信を受信したら送信するevalCustomer2Returned[theMessage]theRecipient
Request[theMessage customer]
受信者... <パターン> i <式> i ...
を受け取ったらRequest[Eval[environment] customer]customer新しいアクターを送信しtheReceiver
theReceiver通信を受信したらcom、新しいbindingCustomer環境を作成して送信する
Request[Bind[<pattern>i com] bindingCustomer]そして
bindingCustomer受信した場合Returned[environment’]、送信<expression>i
Request[Eval[environment’]]
bindingCustomerそれ以外の場合はThrown[...]<pattern>i+1
動作... <パターン> i <式> i ...
を受け取ったらRequest[Eval[environment] customer]、顧客に新しいアクターを送信しtheReceiver
theReceiverを受け取ったらRequest[message customer’]、新しいものを作成しbindingCustomerて送信しますenvironment
Request[bind[<pattern>i message] customer’]そして
  1. bindingCustomer受信した場合Returned[environment’]、送信<expression>i
    Request[Eval[environment’] customer’]
  2. bindingCustomerそれ以外の場合はThrown[...]<pattern>i+1
{<式> 1 , <式> 2 }
を受信したらRequest[Eval[environment] customer]、 を送信し、同時に を送信します。<expression>1Request[Eval[environment]]<expression>2Request[Eval[environment]] customer]
let <識別子> = <式> value in <式> body
受信したらmessage[Eval[environment] customer]、新しいものを作成しevalCustomerて送信します<expression>value
Request[Eval[environment] evalCustomer1
evalCustomerを受け取ったらReturned[theValue]、新しいものを作成しbindingCustomerて送信しますenvironment
Request[bind[<identifier> theValue] bindingCustomer]
bindingCustomer受信したらReturned[environment’]送信<expression>bodyRequest[Eval[environment’] customer]
シリアライザー<式>
が受信されたらRequest[Eval[environment] customer]、新しいアクターを送信し、送信された通信は、customerReturned[theSerializer]最初は動作アクターでFIFO順に処理されます。theSerializertheSerializer<expression>.Eval[environment]
通信comが によって受信されると、 は新しいアクターであり、次のような動作theSerializerアクターを送信します。Request[com customer’]customer’
customer’が を受信するとReturned[theNextBehavior]、 はtheNextBehaviorが受信する次の通信の動作アクターとして使用されますtheSerializer

サンプルプログラム

任意のアクターのアドレスを格納できる単純なストレージ セルのプログラム例は次のとおりです。

セル ≡
受信機
リクエスト[[初期]顧客の作成]
顧客に返信[シリアライザーReadWrite(初期)]を送信

ストレージ セルを作成する上記のプログラムは、次のように定義される ReadWrite 動作を利用します。

読み取り書き込み(コンテンツ) ≡
行動
リクエスト[読み取り[]顧客]
{顧客にReturned[contents]、ReadWrite(contents)を送信します}
リクエスト[write[x] customer]
{顧客を送信Returned[], ReadWrite(x)}

上記の動作はパイプライン化されています。つまり、動作は、後続の読み取りまたは書き込みメッセージを処理している間も、前の読み取りまたは書き込みメッセージを処理している可能性があります。たとえば、次の式は、初期内容が 5 のセル x を作成し、次に同時に値 7 と 9 を書き込みます。

x = Cell.Create[5]を{x.write[7], x.write[9], x.read[]}記述する

上記の式の値は 5、7、または 9 です。

参照

参考文献

  • ヘンリー・ベイカーとカール・ヒューイット「プロセスの増分ガベージコレクション」人工知能プログラミング言語シンポジウム議事録。SIGPLAN通知12、1977年8月。
  • Peter Bishop著「Very Large Address Space Modularly Extensible Computer Systems」 MIT EECS博士論文。1977年6月。
  • ヘンリー・ベイカー.リアルタイムコンピューティングのためのアクターシステムMIT EECS 博士論文. 1978年1月.
  • Carl Hewitt、Russ Atkinson著 「シリアライザの仕様と証明技術」 IEEE Journal on Software Engineering、1979年1月。
  • ケン・カーン.アニメーションの計算理論MIT EECS 博士論文. 1979年8月.
  • カール・ヒューイット、ベッペ・アッタルディ、ヘンリー・リーバーマン。 メッセージパッシングにおける代表団、第1回国際分散システム会議議事録、アラバマ州ハンツビル。1979年10月。
  • ビル・コーンフェルドとカール・ヒューイット。 「科学コミュニティのメタファー」 IEEE Transactions on Systems, Man, and Cyber​​netics. 1981年1月。
  • ヘンリー・リーバーマン.混乱せずに一度にたくさんのことを考える:第1幕における並列性MIT AIメモ626. 1981年5月.
  • ヘンリー・リーバーマン。MIT AIメモ625、第1幕のプレビュー。1981年6月。
  • ビル・コーンフェルド. 問題解決における並列性MIT EECS 博士論文. 1981年8月.
  • ダニエル・テリオー. Act-1言語入門 MIT AIメモ672. 1982年4月.
  • ヘンリー・リーバーマン、カール・ヒューイット著 『オブジェクトの寿命に基づくリアルタイム・ガベージコレクタ』 CACM、1983年6月。
  • ダニエル・テリオー. Act 2の設計と実装における問題点. MIT AI技術報告書728. 1983年6月.
  • ヘンリー・リーバーマン。 アメリカ人工知能学会養蜂会議のためのオブジェクト指向シミュレータ、ワシントンD.C.、1983年8月。
  • カール・ヒューイット、ヘンリー・リーバーマン著「 人工知能のための並列アーキテクチャの設計上の課題」 MIT AIメモ750、1983年11月。
  • チャールズ・ザイツ著『コズミック・キューブ』 CACM. 1985年1月
  • カール・マニング著『トラベラー:俳優の観測所』ECOOP 1987年。『Lecture Notes in Computer Science』第276巻にも掲載。
  • カール・マニング. Acore: コアアクター言語とそのコンパイルの設計. 修士論文. MIT EECS. 1987年5月.
  • William Athas と Charles Seitz 「マルチコンピュータ: メッセージ パッシング同時実行コンピュータ」 IEEE Computer 1988 年 8 月。
  • William Athas と Nanette Boden Cantor: 「科学計算のためのアクタープログラミングシステム」、 NSF オブジェクトベース並行プログラミングワークショップの議事録。1988 年。SIGPLAN 通知の特別号。
  • ジャン=ピエール・ブリオ「 オブジェクトからアクターへ:Smalltalkにおける限定的な共生の研究」-80 Rapport de Recherche 88-58, RXF-LITP, パリ, フランス, 1988年9月
  • William Dally および Wills, D.並行処理のための汎用メカニズムPARLE '89。
  • W. Horwat、A. Chien、W. Dally. CSTの経験: PLDIのプログラミングと実装. 1989.
  • 米沢明徳編『ABCL: オブジェクト指向並行システム』 MIT出版、1990年。
  • カール・ヒューイット、グル・アガ 「ガードホーン節言語:演繹的かつ論理的か?」『MITにおける人工知能』第2巻、MIT出版、1991年。
  • カール・ヒューイット、ジェフ・インマン。 「DAIの狭間で:インテリジェントエージェントからオープンシステムサイエンスへ」 IEEE Transactions on Systems, Man, and Cyber​​netics、1991年11/12月号。
  • William Dally「メッセージ駆動型プロセッサ:効率的なメカニズムを備えたマルチコンピュータ処理ノード」 IEEE Micro、1992年4月。
  • Don Box、David Ehnebuske、Gopal Kakivaya、Andrew Layman、Noah Mendelsohn、Henrik Nielsen、Satish Thatte、Dave Winer。Simple Object Access Protocol (SOAP) 1.1 W3C ノート。2000年5月。
  • Edward A. LeeとStephen Neuendorfer (2004年6月). 「アクター指向設計におけるクラスとサブクラス」(博士論文 - 拡張概要). 協調設計のための形式手法とモデルに関する会議 (MEMOCODE).
  • カール・ヒューイット. 論理プログラミングの繰り返される衰退と、なぜ再び復活するのか 何が間違っていたのか、そしてなぜ:AI研究と応用からの教訓. 技術レポート SS-06-08. AAAI Press. 2006年3月.