Mercurial > hg > Papers > 2015 > nozomi-prosym
diff paper-last/prosym.tex @ 7:7cb463761b4e
fora parusu check
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 30 Nov 2015 16:43:47 +0900 |
parents | a04f0d8b19a1 |
children | c3c01167cff9 |
line wrap: on
line diff
--- a/paper-last/prosym.tex Mon Nov 30 05:40:06 2015 +0900 +++ b/paper-last/prosym.tex Mon Nov 30 16:43:47 2015 +0900 @@ -60,7 +60,8 @@ プログラマはコアな仕様の変更を抑えつつプログラムの挙動変更ができるため、信頼性の高い分散アプリケーションの記述が可能となる。 先行研究 \cite{senkokenkyu} の水族館の例題等において、Aliceが分散プログラムを記述する能力を有することは確認された。 -しかし、実用的な分散アプリケーションを作成するためには、動的トポロジーを管理・構成する機能や通信時にData Segmentを圧縮形式で扱う機能が必要な場合がある。 +しかし、実用的な分散アプリケーションを作成するためには、Data Segmentをそのまま転送する機能や通信時にData Segmentを圧縮形式で扱う機能が必要な場合がある。 + 本研究では、Alice上に実用的な分散アプリケーションの例題である画面共有システムTreeVNC \cite{treeVNC} を構築する。 構築するにあたり必要となった圧縮などの機能を、AliceのMeta Computationとして実装する。 そして Alice を使用していないTreeVNCとの比較を行うことでMeta Computationの役割と有効性を示す。 @@ -80,7 +81,7 @@ \label{fig:CS} \end{figure} -実際にはAliceはJavaで実装されており、DSはJavaObjectでCSはRunnableThreadである。プログラマーがCSを記述する際は、CodeSegmentクラスを継承し、DSを操作するAPIを使用する。 +実際にはAliceはJavaで実装されており、DSはJavaObjectでCSはRunnableThreadである。プログラマがCSを記述する際は、CodeSegmentクラスを継承し、DSを操作するAPIを使用する。 \subsection{DataSegmentManager} DSは数値や文字列などの基本的なデータの集まりを指し、Aliceが内部にもつデータベースによって管理されている。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。 @@ -91,8 +92,9 @@ DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:RemoteDSM} )。 他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 -Remote DSMを立ち上げるには、DataSegment.classが提供するconnectメソッドを用いる。 -接続したいノードのipアドレスとport番号、そして任意のManager名を指定することで立ちあげられる。その後はManager名を指定してData Segment APIを用いてDSのやり取りを行う。 +Remote DSMを立ち上げるには、DataSegmentクラスが提供するconnectメソッドを用いる。 +接続したいノードのipアドレスとport番号、そして任意のManager名を指定することで立ちあげられる。その後はManager名を指定してData Segment APIを用いてDSのやり取りを行うため、プログラマはManager名さえ意識すればLocalへの操作もRemoteへの操作も同じ様に扱える。 + \begin{figure}[h] \begin{center} \includegraphics[width=70mm]{images/remote_datasegment.pdf} @@ -126,19 +128,9 @@ \end{itemize} peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。 -\subsection{Data Segmentの表現} - -DSの表現にはMessagePack for Java \cite{MessagePack} を利用している。 -\begin{itemize} -\item {\ttfamily DSは一般的なJavaのクラスオブジェクト} -\item {\ttfamily MessagePackを用いて変換したbyte[]で表現されたバイナリオブジェクト} -\end{itemize} -の2種類があり、LocalDSMにputされた場合は一般的なJavaのクラスオブジェクトとして追加される。 -RemoteDSMにputされた場合は通信時にbyteArrayに変換されたバイナリオブジェクトが追加される。 - \subsection{Code Segmentの記述方法} -CSをユーザーが記述する際にはCodeSegment.classを継承して記述する(ソースコード \ref{src:StartCodeSegment} , \ref{src:CodeSegment})。 +CSをユーザーが記述する際にはCodeSegmentクラスを継承して記述する(ソースコード \ref{src:StartCodeSegment} , \ref{src:CodeSegment})。 継承することによりCode Segmentで使用するData Segment APIを利用する事ができる。 \begin{table}[html] @@ -196,9 +188,9 @@ それに対して、AliceのMeta Computation は、Remoteノードとの通信時のトポロジーの構成や切断・再接続の処理と言える。 つまりトポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。 -Aliceの機能を追加するということはプログラマー側が使うMeta Computationを追加すると言い換えられる。 -AliceではMeta Computationとして分散環境の構築等の機能を提供するため、プログラマーはCSを記述する際にトポロジー構成や切断、再接続という状況を予め想定した処理にする必要はない。 -プログラマーは目的の処理だけ記述し、切断や再接続が起こった場合の処理をMeta Computationとして指定する。 +Aliceの機能を追加するということはプログラマ側が使うMeta Computationを追加すると言い換えられる。 +AliceではMeta Computationとして分散環境の構築等の機能を提供するため、プログラマはCSを記述する際にトポロジー構成や切断、再接続という状況を予め想定した処理にする必要はない。 +プログラマは目的の処理だけ記述し、切断や再接続が起こった場合の処理をMeta Computationとして指定する。 このようにプログラムすることで、通常処理と例外処理を分離することができるため、仕様の変更を抑えたシンプルなプログラムを記述できる。 現在Aliceには、動的・静的トポロジーの管理構成機能、ノードとの接続状態確認機能、切断・再接続時の処理を指定できる機能など、分散環境の実現に必要なさまざまなMeta Computationが用意されている。 @@ -206,7 +198,7 @@ \textbf{Topology Manager} Aliceでは、ノード間の接続管理やトポロジーの構成管理を、Topology ManagerというMetaComputationが提供している。このTopology ManagerもCS/DSを用いて実装されている。 -プログラマーはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。 +プログラマはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。 トポロジーファイルはDOT Language\cite{dot}という言語で記述される。 DOT Languageとは、プレーンテキストを用いてデータ構造としてのグラフを表現するためのデータ記述言語の一つである。 ソースコード\ref{src:topologyfile}は3台のノードでリングトポロジーを組むときのトポロジーファイルの例である。 @@ -275,7 +267,7 @@ MMORPGでは、試合の最中にサーバーからユーザーが切断された場合、自動的にユーザーが操作するキャラクターをゲームの開始時の位置に戻すという処理が実行される。 同様に、Aliceを用いたアプリケーションでもノードの切断時に対する処理を用意したい場合がある。 -そこで、Aliceが切断を検知した際に任意のCSを実行できる機能(ClosedEventManager)を追加した。プログラマーは切断の際に実行したいCSを書き、ClosedEventManagerに登録しておけば良い(ソースコード\ref{src:closedEvent})。 +そこで、Aliceが切断を検知した際に任意のCSを実行できる機能(ClosedEventManager)を追加した。プログラマは切断の際に実行したいCSを書き、ClosedEventManagerに登録しておけば良い(ソースコード\ref{src:closedEvent})。 \begin{table}[html] \lstinputlisting[label=src:closedEvent, caption=切断時に実行されるCSの登録方法]{source/RegisterEvent.java} \end{table} @@ -308,7 +300,7 @@ \section{Aliceの新機能} 実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要なMeta Computationを洗い出した。 \subsection{転送機能} -Input DSをRecieverに取得したあと、プログラマーはRecieverから値を任意の型で取り出し、値を操作した後putメソッドで再度別クラスに変換されOutput DSとして出力する。 +Input DSをRecieverに取得したあと、プログラマはRecieverから値を任意の型で取り出し、値を操作した後putメソッドで再度別クラスに変換されOutput DSとして出力する。 しかし、Input DSとして取得したデータ形式のまま子ノードにOutput DSとして出力する場合、一度Recieverから取り出し再変換する操作は無駄である。 そこで、Input DSとして受け取ったDSをそのままOutput DSとして転送する機能をput/updateとは別にflipメソッドをData Segment APIに実装した。 @@ -325,17 +317,23 @@ しかし、受け取ったデータを自分の子ノードに対して送信する際には、解凍する必要はない。 圧縮状態のまま子ノードに送信ができれば、解凍・再圧縮するオーバーヘッドを無くすことができる。 -そこで、1つのData Segmentに対し複数の表現を持たせることで、必要に応じた形式でDSを扱うことを可能にした。 -DSを扱うReceiveData.classに、次の3種類の表現を同時に持つことができるようにしたことで、データの多態性を実現した。 +そこで、1つのData Segmentに対し複数の表現を持たせ、必要に応じた形式でDSを扱うことを可能にした。 +DSのMeta Computationに相当するReceiveDataクラスに、次の3種類の表現を同時に持つことができるようにしたことで、データの多態性を実現した。 \begin{enumerate} \item 一般的なJavaのクラスオブジェクト - \item MessagePack for Javaでシリアライズ化されたバイナリオブジェクト + \item MessagePack for Java\cite{MessagePack}でシリアライズ化されたバイナリオブジェクト \item 2を圧縮したバイナリオブジェクト \end{enumerate} -ソースコード \ref{src:ReceiveData} はReceiveData.classが持つ表現であり、{\tt val}に(1) 一般的なJavaのクラスオブジェクト の表現でデータ本体が保存される。 -{\tt messagePack}には(2) シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。 +LocalDSMにputされた場合は、(1)の一般的なJavaクラスオブジェクトとして追加される。 +RemoteDSMにputされた場合は、通信時に(2)のbyteArrayに変換されたバイナリオブジェクトに変換されたDSが追加される。 +この2つの形式は従来のAliceが持っていた表現である。 +今回、RemoteDSMに圧縮形式での通信を行いたいため、(3)の圧縮表現を追加した。 + +ソースコード \ref{src:ReceiveData} はReceiveData.classが持つ表現である。 +{\tt val}に(1) 一般的なJavaのクラスオブジェクト の表現でデータ本体が保存される。 +{\tt messagePack}には(2) シリアライズ化されたバイナリオブジェクトが保存される。 そして、{\tt zMessagePack}には(3) 圧縮されたバイナリオブジェクトが保存される。 \begin{table}[html] @@ -360,11 +358,11 @@ ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipメソッドで転送すれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。 -画面表示の際はReceiveData.class内の{\tt asClass()}(ソースコード\ref {src:asClass} )を使うことで適切な形式でデータを取得できる。 -{\tt asClass()}はDSを目的の型にcastするメソッドである。 +画面表示の際はReceiveData.class内のasClassメソッド(ソースコード\ref {src:asClass} )を使うことで適切な形式でデータを取得できる。 +asClassメソッドはDSを目的の型にcastするためのメソッドである。 AliceVNCで圧縮形式を指定してDSを送信すると、それを受け取るDSMは圧縮形式のみを持ったDSとして保存する。 -そして{\tt asClass()}が呼ばれて初めて、メソッド内で解凍してcastが行われDSが複数の表現を同時に持つようになる。 -これによりDSの表現を必要になったときに作成できるため、プログラマーはどんな形式でDSを受け取ってもこのメソッドを使うことによりDSを編集可能な形式として扱うことができる。 +そしてasClassメソッドが呼ばれて初めて、メソッド内で解凍してcastが行われDSが複数の表現を同時に持つようになる。 +これによりDSの表現を必要になったときに作成できるため、プログラマはどんな形式でDSを受け取ってもDSを編集可能な形式として扱うことができる。 また、複数表現は必要なときにしか作成されないため、メモリ使用量も必要最低限に抑えることができる。 @@ -373,11 +371,10 @@ \end{table} \subsection{Aliceの通信プロトコルの変更} -2.4 Data Segmentの表現で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。 -しかし、TreeVNCのようにもとからbyteArrayの画像データをputする場合、MessagePackでシリアライズされたものかの判別が付かない。 -また、データの表現に圧縮したbyteArrayを追加したため、RemoteからputされたbyteArrayが圧縮されているのかそうでないのかを判断する必要がある。 +5.2で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。 +しかし、データの表現に圧縮したbyteArrayを追加したため、RemoteからputされたbyteArrayが圧縮されているのかそうでないのかを判別がつかなくなった。 -そこで、Aliceの通信におけるヘッダにあたるCommandMessage.classにシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。 +そこで、Aliceの通信におけるヘッダにあたるCommandMessage.classに圧縮状態を表すフラグを追加した。 これによってputされたDSMはフラグに応じた適切な形式でReceiveData.class内にDSを格納できる。 また、CommandMessage.classに圧縮前のデータサイズも追加したことで、適切な解凍が可能になった。 @@ -525,8 +522,8 @@ プロジェクト全体でのクラスの複雑度の平均値と最高値をとった。 平均値・最高値ともにAliceVNCのほうが複雑度が低いことから、Aliceではシンプルな記述が可能だということがわかる。 -TreeVNCで最高値を出したTreeRFBProto.classは全てプログラマーが記述したコードであり、データの待ち合わせのためのタイマー処理や通信処理、画面データの圧縮処理などの複数のスレッド処理が集中した複雑なコードになっている。 -これをAliceで記述した場合、データの待ち合わせはCSが行うためプログラマーがデータの不整合を気にする必要はなく、また通信処理や圧縮処理もMeta Computationが提供するためコードが複雑になることはない。 +TreeVNCで最高値を出したTreeRFBProto.classは全てプログラマが記述したコードであり、データの待ち合わせのためのタイマー処理や通信処理、画面データの圧縮処理などの複数のスレッド処理が集中した複雑なコードになっている。 +これをAliceで記述した場合、データの待ち合わせはCSが行うためプログラマがデータの不整合を気にする必要はなく、また通信処理や圧縮処理もMeta Computationが提供するためコードが複雑になることはない。 AliceVNCで複雑度の最高値を出したSwingViewerWindow.classはTightVNCで最高値を出したクラスと同じであり、コード量の比較でも示したようにAliceVNCで変更を加えた点がほとんどない。つまりこの複雑度は元来TightVNCが持っている複雑度と言える。 @@ -560,7 +557,7 @@ タスクをプロセスという細かい単位に分割して並列に動かす点や、メモリロックの仕組みを必要としない点はAliceと同様である。 しかしErlangでは分散環境の構築等はすべてプログラマ自身が記述しなければならない。 -Aliceでは分散環境の構築はTopology ManagerなどのMeta Computationが行うためプログラマーはトポロジーを指定するだけで良い。 +Aliceでは分散環境の構築はTopology ManagerなどのMeta Computationが行うためプログラマはトポロジーを指定するだけで良い。 また、Erlangでは複数のデータの待ち合わせのための再帰処理も自分で書かないといけない。 一方、Aliceのプログラミング手法はCSが必要なデータが全て揃うまで待ち合わせを行うためその必要はない。 @@ -611,7 +608,7 @@ この機能も実現できれば、AliceのMeta Computationが拡張性の高い環境を提供できると言える。 また、現在のAliceはネットワーク通信においてセキュリティをサポートしていない。 -しかし、圧縮機能と同様に、暗号化形式を扱うMeta Computationを追加すれば、プログラマーが記述するComputation部分を大きく変えずに自由度の高い通信を行うことができる。 +しかし、圧縮機能と同様に、暗号化形式を扱うMeta Computationを追加すれば、プログラマが記述するComputation部分を大きく変えずに自由度の高い通信を行うことができる。