# HG changeset patch # User sugi # Date 1422358705 -32400 # Node ID d2eeb833c75e1a6ca3a46edef91c58099ec03196 # Parent 675939a7f983f4cc95c2ed36a71d2598cbe67fca modify chapter2 diff -r 675939a7f983 -r d2eeb833c75e paper/chapter1.tex --- a/paper/chapter1.tex Fri Jan 23 16:43:48 2015 +0900 +++ b/paper/chapter1.tex Tue Jan 27 20:38:25 2015 +0900 @@ -1,20 +1,133 @@ \chapter{分散フレームワーク Alice の概要} \label{chapter:chapter1} \section{Aliceの計算モデル} -\subsection{Data SegmentとCode Segment} -\subsection{computationとmeta computation} +\subsection{Data SegmentとCode Segment}\label{subsection:computation} +AliceはデータをData Segment、タスクをCode Segmentという単位に分割してプログラミングを行なう。 +Code SegmentはInput Data SegmentとOutput Data Segmentを持つ(図 \ref{fig:dsandcs})。Input Data SegmentはそのCode Segmentを実行するために必要なデータ群であり、Output Data SegmentはCode Segmentが計算を行った結果を格納するデータ群である。 + + +Data SegmentはAliceが内部にもつデータベースによって管理されている。 +Input Data Segmentを取得する際とOutput Data Segmentを保存する際にデータベースに通信を行う。 +取得するData SegmentはData Segmentに対して一意であるKEYを用いて指定する。 +Input Data Segmentの取得に失敗した場合、Code SegmentはDatabaseでData Segmentの待ち合わせを行う。 +Input Data Segmentが揃った場合にCode Segmentは実行される。 + + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=100mm]{images/dsandcs.pdf} +\end{center} +\caption{Code SegmentはInput Data Segment とOutput Data Segmentが存在する} +\label{fig:dsandcs} +\end{figure} + +Code Segmentに依存するデータ群であると出力されるデータ群を記述することにより、Code Segmentが実行される順番が決定される(図 \ref{fig:dsandcs2})。データの依存関係にないCode Segmentは並列実行が可能であるため、並列度を上げるためにはCode Segmentの処理内容を細かく分割して依存するデータを少なくするのが望ましい。 + + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=110mm]{images/dsandcs2.pdf} +\end{center} +\caption{Input Data Segment とOut put Data SegmentがCode Segment間の依存関係を自動的に記述する} +\label{fig:dsandcs2} +\end{figure} + +\subsection{ComputationとMeta Computation} +Aliceのcomputationは\ref{subsection:computation}で示したように、keyで指し示されるData Segmentを待ち合わせてCode Segmentを実行させるというものである。アプリケーションを作成するためにはアルゴリズムをAliceのComputationで表現する必要がある。しかし、アプリケーションを作成するためにはAliceのComputationで表現するだけでは足りない。 + +例えば、AliceはData SegmentをDatabaseにMemory上に書き出してるが、書き出す際にMemoryが不足していた場合どうするのかといったメモリ管理の問題がある。これはアプリケーションに直接関係しているわけではないが、Aliceを動作させるために必要なcomputationである。このcomputationを設定することのできるcomputationがmeta computationである。 +今回Aliceにmeta computationを追加した。Aliceでmeta computationを表現するので、当然Code SegmentとData Segmentで表現される + + +\section{Aliceの実装} +\subsection{Data Segment} +Data Segmentは数値や文字列などのデータを構造的に保持する。AliceはData Segmentをデータベースとして扱っている。Data Segmentには必ず対になるKeyが存在する。つまりKey Value Storeとして考える事ができる。 + +Aliceのデータベースは通常のKVSとは異なっている点がある。通常のKVSはプログラミング言語の連想配列やMapと同様に 「Key(キー)」と「Value(値)」がペアとなっている。そのため1つのKeyに対して値は1つである。しかし、Aliceの場合は「Key」と「Queue」がペアとなっているため、Keyに対して複数回putできる。従って取得できるValueも複数存在する。 + +Data SegmentはData Segment Manager(以下DSM)によって管理されている。ノード毎にLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のKVSとなっている。従ってRemote DSMを指定するKeyはノード内部でuniqueなものである。Remote DSMは他のノードのLocal DSMのproxyと考えられる。つまりRemote DSMは複数存在し、それぞれに対応するノードは異なる。 + +\begin{figure}[htbp] +\begin{center} +\includegraphics{images/remote_datasegment.pdf} +\end{center} +\caption{Remote DSMは他のノードのLocal DSMのproxy } +\label{fig:RemoteDSM} +\end{figure} + +KVSへのアクセスはqueueによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread Poolにより並列実行される。 +\subsubsection{Data Segment の表現} +Data Segmentの表現にはMessage Packを利用している。Message Packに関してJavaにおけるデータ表現は以下の3種類があり、制限を伴うが互いに変換可能である。 +\begin{itemize} +\item {\ttfamily 一般的なJavaのクラスオブジェクト} +\item {\ttfamily MessagePack for JavaのValueオブジェクト} +\item {\ttfamily byte[]で表現されたbinary} +\end{itemize} + +Data Segment APIの内部においてデータは、一般的なJavaのクラスオブジェクトまたはbyteArrayで表現されたbinaryで表現されている。 +Localからデータがputされた場合は一般的なJavaのクラスオブジェクトの状態でenqueueされる。RemoteからデータがputされるとbyteArrayで表現されたbinaryの状態でenqueueされる。 + +ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。 +この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。もちろん、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。 + +Remoteに対してputできるデータは、@MessageをもつクラスオブジェクトかMessage Packで扱える型に限られる。 \subsection{Data Segment API} +\subsection{Code Segment} +Code SegmentとはAlice上で実行されるタスクの単位である。ユーザーはCode Segmentを組み合わせることでプログラミングを行う。Code Segmentをユーザーが記述する際に、内部で使用するData Segmentの作成を記述する。 -\subsection{Data Segment の表現} +Input Data Segment と Output Data SegmentはCode Segmentに用意されているAPIを用いて作成する。 +Input Data Segmentは、LocalかRemoteか、またkeyを指定する必要がある。Code Segmentは、記述したInput Data Segmentが全て揃うとThread poolに送られ、実行される。 + +Output Data SegmentもLocalかRemoteか、またkeyを指定する必要がある。 +Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。 +しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。 + + + +\subsubsection{Code Segmentの実行方法} +Alice には、Start Code Segment (ソースコード \ref{src:StartCodeSegment})というC の main に相当するような最初に実行される Code Segment がある。 +\begin{table}[html] +\lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} +\end{table} + +Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。 +このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。 + + +\subsubsection{Code Segmentの記述方法} +Code Segmentをユーザーが記述する際にはCode Segmentを継承して記述する(ソースコード \ref{src:CodeSegment})。 +Code SegmentはInput/Output Data Segment Managerを利用することができる。 -\section{Aliceの実装} -\subsection{Code Segment} -\subsubsection{Code Segmentの実行方法} -\subsubsection{Code Segmentの記述方法} +Input DSM はCode Segmentの{\tt ids}というフィールドを用いてアクセスする。 + +\begin{table}[html] +\lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java} +\end{table} + +\begin{itemize} +\item {\ttfamily Receiver create(CommandType type)} +\end{itemize} +createでコマンドが実行された際に取得されるData Segmentが格納される受け皿を作る。引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。 +\begin{itemize} +\item \verb+void setKey(String managerKey, String key)+ +\end{itemize} +setKeyメソッドにより、どこのData Segmentのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定することができる。 +コマンドの結果がレスポンスとして届き次第Code Segmentは実行される。 + +Output DSMはCode Segmentの{\tt ods}というフィールドを用いてアクセスする。 +Output DSMは{\tt put}または{\tt update}を実行することができる。 +\begin{itemize} +\item \verb+void put(String managerKey, String key, Object val)+ +\item \verb+void update(String managerKey, String key, Object val)+ +\end{itemize} + +% \subsection{Meta Data Segment} +% \subsection{Meta Code Segment} + \subsection{Topology Manager} Aliceは複数のノードで構成され、相互に接続される。通信するノードはURLにより直接指定するのではなくTopology Managerで管理する。 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきTopology NodeのIPアドレス、ポート番号、接続名を送りトポロジーファイルに記述されたとおりにトポロジーを作成する。(図\ref{fig:topologymanager}) @@ -47,6 +160,6 @@ \end{figure} -\subsection{Aliceによるプログラミング手法} +\section{Aliceによるプログラミング手法} AliceはCode SegmentとData Segmentによってプログラミングを行なう。Code Segmentから別にCode SegmentへData Segmentを引き渡す際、コンストラクタは使わない。Code SegmentがLocal / Remote Data Segmentに対してputを行い、別のCode SegmentがLocal / Remote Data Segmentに対してpeekを行うことで引き渡される。つまり、Code Segmentは実行前後にData Segmentへ通信が行われるのである。この通信の順序がCode Segmentの実行順序を決定している。 すなわち、Aliceによるプログラミングとは通信の管理を行うことであり、プロトコルを設計することと捉える事ができる。 diff -r 675939a7f983 -r d2eeb833c75e paper/chapter2.tex --- a/paper/chapter2.tex Fri Jan 23 16:43:48 2015 +0900 +++ b/paper/chapter2.tex Tue Jan 27 20:38:25 2015 +0900 @@ -28,7 +28,6 @@ さらに、TighVNCのアップデートに対応する必要がある。だが、アップデートによってはパッケージ構成が変更され、元のコードが残っていないことも考えられる。この場合、新しいTightVNCに作成した機能を1つずつ移行するしなければならないためコストが高い。 -%分散アプリケーションは、デバックが行い難くエラーを再現することですら難しい。 これらの問題は、分散フレームワークAliceを使うことで解決することができる。ノードの管理は全てAliceが行なうため、プログラマーは画面共有の処理のみ記述すれば良い。プロトコルはAlice上で構築することでTightVNCのプロトコルと干渉することがないため、エラーが起こった場合はAliceで記述したコードのみを確認すればよい。 アップデートの問題に関しては、TightVNCに必要なデータをputする処理さえ追加すれば良いため、問題なく対応できるはずである。 @@ -68,7 +67,13 @@ アプリケーションを起動すると参加したノード1台ごとに1つウインドウが表示される。表示されたウインドウの中にユーザが操作可能な魚が1匹表示されている。魚は画面端まで移動すると自分の画面上からは消え、隣のプレイヤーの画面端に表示される。 -%画像挿入 +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=160mm]{images/aquarium-after.pdf} +\end{center} +\caption{JavaFx 水族館ゲーム} +\label{fig:aquarium} +\end{figure} \subsection{処理の流れ} 図\ref{fig:NodeToClient}はデータの伝搬の様子をコラボレーションダイアグラムで示したものである。 diff -r 675939a7f983 -r d2eeb833c75e paper/images/aquarium-after.pdf Binary file paper/images/aquarium-after.pdf has changed diff -r 675939a7f983 -r d2eeb833c75e paper/images/aquarium-before.pdf Binary file paper/images/aquarium-before.pdf has changed diff -r 675939a7f983 -r d2eeb833c75e paper/introduciton.tex --- a/paper/introduciton.tex Fri Jan 23 16:43:48 2015 +0900 +++ b/paper/introduciton.tex Tue Jan 27 20:38:25 2015 +0900 @@ -8,5 +8,6 @@ そこで本研究室ではデータをData Segment、タスクをCode Segmentという単位で分割して記述する並列分散フレームワークAliceの開発を行っている。AliceはJavaで実装され、ノード間の通信のためのAPIが提供されている。また、オーバーレイネットワークを自動的に構成するTopology Managerという機能を持つため、分散プログラムのシュミレーションを行うことができる。 -本研究では、Aliceの実行速度の問題の解決、および実用的な分散プログラムの記述に必要な機能の洗い出し実装を行う。また、実行速度の改善効果および、TreeVNCとTreeVNCをAliceを用いて実装したAliceVNCの比較をコードの観点から評価を行う。 +本研究では、Aliceに実用的なアプリケーションを開発するために必要なmeta 機能を実 +Aliceの実行速度の問題の解決、および実用的な分散プログラムの記述に必要な機能の洗い出し実装を行う。また、実行速度の改善効果および、TreeVNCとTreeVNCをAliceを用いて実装したAliceVNCの比較をコードの観点から評価を行う。 \section{論文の構成}