アクターとは?/ ディック
[ 995] アクターモデル - Wikipedia
[引用サイト] http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB
|
アクターモデルはそれ以前の計算モデルとは異なり、物理法則を発想の基本としている。他にも、LISP言語、Simula言語、ケーパビリティ・システム、パケット通信、初期のSmalltalkなどの影響を受けている。アクターモデルは「数百・数千のマイクロプロセッサから構成され、個々にローカルメモリを持ち、高性能通信ネットワークで通信を行う並列コンピュータが近い将来登場するとの予測」から開発された[2]。その後、Webサービスやメニイコアアーキテクチャを活用した超並行性にも範囲を広げてきた。 アクターモデルの基本は「全てのものはアクターである」という哲学である。これはオブジェクト指向プログラミングにおける「全てのものはオブジェクトである」という考え方と似ているが、オブジェクト指向ソフトウェアでは基本的に逐次的に実行するのに対して、アクターモデルでは本質的に並行性を備えている点が異なる。 他のアクターとの通信は非同期に発生する(すなわち、送信側アクターはメッセージが受信されるのを待たずに次の計算に移行する)。 メッセージを送信する相手のアクターはアドレスによって指定される(これをアクターの「メールアドレス」とも呼ぶ)。結果として、アクターはアドレスのあるアクターとのみ通信可能であり、他のアクターのアドレスは以下のような方法で獲得される: アクターモデルは、アクター自体およびアクター間の計算の本質的並行性を特徴とし、メッセージ内にアクターのアドレスを含め、相互のやりとりは到着順が保証されない直接的非同期メッセージパッシングのみである。 アクターモデルのメッセージパッシング機能を完全には形式化していない点でアクターモデルそのものには対応していない形式体系として、以下のようなものがある: アクターモデルは、各種並行システムのモデリングや理解のフレームワークとして利用可能である。以下のような例がある: 電子メールはアクターシステムとしてモデル化可能である。アカウントをアクターとしてモデル化し、メールアドレスをアクターのアドレスとする。 ロックを持つオブジェクト(例えば、JavaやC#のオブジェクト)は、連続的に到着するメッセージを受け取る(例えば内部のキューに蓄える)機能を持った「シリアライザ; Serializer」としてモデル化できる。シリアライザはメッセージを連続的に受信可能なアクターの一種であり、シリアライザ向けに送信されたメッセージは必ず受信されることが保証される。 最初のオブジェクト指向型のメッセージパッシング言語。ただし、真の並行性はなく、コルーチンを使用している。 アクターモデル以前に広く使われていた並行計算用モデル。しかし、ペトリネットは制御フローはモデル化できるが、データフローをモデル化できないという弱点があった。また、ヒューイットが指摘した問題として、動作の同時性がある。ペトリネットでの不可分な計算ステップはトークンが入力箇所から消え、「同時に」出力箇所に出現することになっている。ヒューイットはこのような特徴を前提としたモデルでは実際の並行システムにそぐわないと考えた。もっとも、そのような問題があってもペトリネットは現在も使われており、熱心な研究が行われている。 最初の並行プログラムは割り込みハンドラであった。コンピュータは通常処理の最中に外部(キーボード、ネットワークなど)からの情報を受け取る必要が生じた。そこで、情報が到着すると、コンピュータは割り込まれ、割り込みハンドラと呼ばれる特別なコードが呼び出されて情報をバッファに取り込み、逐次的に処理できるようにする。 初期の計算モデル(チューリングマシン、ラムダ計算など)は数学に基づいており、状態によって計算「ステップ」を表現した。各計算ステップは、ある状態から別の状態への遷移である。このような状態遷移的手法は、非決定性のものを含む有限状態機械などのオートマタ理論へと発展していった。非決定性オートマトンには有限の非決定性があり、マシンが初期状態から動作開始したとき常に停止するなら、停止するときの状態数は有限である。 エドガー・ダイクストラは、この非決定的な状態遷移手法の研究を進めた。ダイクストラのモデルをきっかけとして無制限の非決定性に関する議論が発生した。無制限の非決定性[12]は、並行性の特徴であり、共有リソースの衝突の仲裁の結果として、サービスの遅延が無制限に発生することを意味する(タイムアウトなど、サービスを打ち切る仕様でない場合)。ヒューイットはアクターモデルにはサービスの保証を提供するとした。ダイクストラのモデルでは、逐次命令列の実行に無制限の時間が掛かる可能性があるとしても、状態定義が適切であれば有限の状態数で停止するとされた[Dijkstra 1976]。結果として、ダイクストラのモデルはサービスの保証を提供できなかった。ダイクストラは無制限の非決定性を実装することは不可能であると主張した。 ヒューイットは調停回路と呼ばれる計算回路が安定するのにかかる時間に制限はないと主張した。調停回路はコンピュータが外部からの入力(キーボードからの入力、ディスクアクセス、ネットワークからの受信など)をクロックとは非同期的に処理する状況で使われる。そのため、あるメッセージがコンピュータによって受け取られるまでにかかる時間には際限がなく、その間にコンピュータが遷移する状態数にも制限がない。 アクターモデルではメッセージをバッファに蓄える必要はない。この点はかつての並行計算のモデルとは明確に異なっている。バッファがないという点は当初から誤解されがちで、議論となる問題である。メッセージは「エーテル」や「環境」によってバッファリングされると主張する研究者もいた。しかし、「エーテル」は非常に良いバッファとは言えない。エーテルに置かれたメッセージは、受け取られるまでそこに留まるわけではない。また、アクターモデルでのメッセージは(IPのパケットのように)単に送られる。受信側と同期的なハンドシェイクをする必要はない。 アクターモデルの自然な発展として、メッセージ内のアドレスが含まれるようになった。パケット通信[1961 and 1964]に影響され、ヒューイットは形式が固定されていない通信を使った新たな並行計算のモデルを提案した。例えば、メッセージは空でもよい。もちろん、送信側が受信側に新たなアクセスすべきアドレスを伝えたい場合、通信によってそれが伝えられる。 メッセージにアクターのアドレスを含めることによって、アクター間の関係は可変なトポロジーを形成することができる。それはちょうど Simula のオブジェクトが可変トポロジーの関係を持つのと似ている。 逐次的プロセスの合成に基づく従来の手法とは異なり、アクターモデルは本来的に並行的なモデルとして開発された。アクターモデルでの逐次性はアクターモデル理論で説明されるように並行計算の特殊ケースである。 アクターモデルで送信された順番にメッセージが受信されるべきだという要求にたいしてヒューイットは反論した。出力の順序付けが必要なら、その機能を持つキューの役割をするアクターを導入すればよい。キュー・アクターは到着したメッセージをFIFO順にキューイングする。そのため、アクター X がアクター Y にメッセージ M1 を送り、X がその後に受け取ったメッセージに対応して新たにメッセージ M2 を Y に送った場合、M1 は M2 より先に Y に到着するとは限らない。 この点でアクターモデルはパケット通信システムを反映している。パケット通信ではパケットが送信順に受信されることを保証していない。受信順を保証しないことで、パケット通信はパケットをバッファリングしたり、様々な経路でパケットを送信したり、パケットを再送したりといった最適化を可能としている。 例えば、アクターはメッセージ処理をパイプライン化できる。つまり、メッセージ M1 を処理するにあたって、アクターは次のメッセージの処理に影響を与えることができ、結果として M1 の処理が完了する前に次のメッセージ M2 の処理を開始できる。これはパイプライン化することもできるというだけであって、必ずそうしなければならないということではない。メッセージをパイプライン化するかどうかはエンジニアリング上のトレードオフの問題である。外部から見てアクターがメッセージ処理をパイプライン化しているかどうか分かるだろうか? パイプライン化可能なアクターの定義には曖昧さは全くない。もちろん、パイプライン化を不要なところで行う可能性は存在し、その場合の動作は予期しないものとなる。 局所性とは、メッセージを処理するときにアクターがメッセージを送信できる相手はアドレスを知っているものに限られるということを意味する。 また、複数の位置を同時に変更することがないことも局所性と称する。この点は他の並行性モデルとは異なる。例えばペトリネットモデルではトークンは同時に複数の場所から削除され、別の複数の場所に配置される。 「振る舞い; behavior」の導入により、アクターのメッセージ処理を数学的関数として記述できるようになった。振る舞いは並行性における共有を数学的にモデル化する機構を提供する。 振る舞いによってアクターモデルは(例えば Smalltalk-72 のトークン・ストリーム・インタプリタのような)実装の詳細から解放された。しかし、アクターモデルで記述されたシステムを効率的に実装する際、大規模な最適化が必須となることは重要である。 アクターモデルの開発と数理論理学との関係は興味深い。その開発の主要な動機として、Planner言語の開発で生じた制御構造問題を扱い、理解するという目的があった。アクターモデルが定義されたとき、「計算は推論に内包される」という Kowalski の主張に関連するモデルの能力を理解するという重要な目標があったのである。Kowalski の主張は、アクターモデルによる並行計算では偽であることが判明した(計算の不確定性参照)。Kowalski の主張は逐次計算やラムダ計算などの一部の並列計算では真であることから、この結論には未だに議論がある。 それにも関わらず、論理プログラミングを並行計算に拡張しようという試みがなされた。しかし、ヒューイットと Agha[1991]は、結果として生まれたシステムにおける計算ステップがその前のステップからの推論(演繹)ではないという意味で、演繹的ではないと指摘した。 マイグレーション(Migration)とは、アクターが位置を変更可能であることを意味する。例えば、米澤明憲は学位論文で郵便局をアクターモデルでモデル化した。客をアクターとし、郵便局内で位置を変えながら何らかの処理をして出て行くというものである。マイグレートするアクターは位置アクターを導入することでモデル化できる。位置アクターはアクターのマイグレーションに応じて変化する。しかし、このモデル化は議論を呼び、現在も研究対象となっている。 ムーアの法則が言われ始めてから40年が経ち、ハードウェアは各種並行性を取り入れつつある(マルチコアマイクロプロセッサのような局所的並行性、様々なコンピュータネットワークなどの非局所的並行性)。このような並行性は指数関数的に増大しつつある。 ヒューイット[2006]によれば、アクターモデルはコンピュータ(および通信)アーキテクチャ、並行プログラミング言語、Webサービスに関する以下のような問題に直面している: 非一貫性: 人間の作る情報システムは巨大化するほど一貫性を失う。これは巨大システムの仕様書などの文書にも当てはまる。 アクターモデルの考え方はマルチエージェントシステムにも見られる。エージェントシステムは多くの場合アクターモデルに何らかの制限を課している点が異なり、自発的で自律的であることが要求される。 |