view alice.tex @ 6:ae099fad4c1e

add source
author sugi
date Mon, 01 Apr 2013 21:47:04 +0900
parents 715578f76084
children 653cdc2f74e5
line wrap: on
line source

\section{分散ネットフレームワークAlice}
Alice\cite{kono11g}は、本研究室で開発を行なっている分散管理フレームワークである。Cell用の並列フレームワークCerium\cite{kono09b} \cite{cerium-sourceforge}に似たタスク管理機構を持つ。Data Semgnetの通信ではLinda\cite{linda} を相互接続した分散フレームワークであるFedaradeLinda\cite{kono05b}\cite{kono10d}に似た構造をもつ。

まず、Aliceを使用するに必要なData Segment、Code Segmentについて説明を行う。
\subsection{Data Segment API}
Data Segmentは数値や文字列などのデータ構造体的に保持する。AliceはData Segmentをデータベース的に扱う。しかし、Data Base的に扱うがAliceではData Baseとは異なりKey毎にキューがある。キューにData Segmentをput した順番に取得することができる。これはLindaに準じた設計となっている。

Data Segmentを管理するのがData Segment Manager(以下DSM)である。ノード毎にキーを持ち他のノードにはRemote DSM経由でアクセスすることができる。つまり、Remote DSMは他のノードのLocal DSMのproxyである。(図 \ref{fig:proxy})他のノードに対するアクセスはキューによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread poolにより並列実行される。
\begin{figure}[tb]
\begin{center}
\scalebox{1.0}{\includegraphics{images/remote_datasegment.pdf}}
\end{center}
\caption{Remote DSMは他のノードの Local DSMのproxy}
\label{fig:proxy}
\end{figure}
以下が用意されているData Segment APIである。これらを用いてData Segmentの送受信を行う。
\begin{itemize}
\item \verb+void put(String key, Value val)+
\item \verb+void update(String key, Value val)+
\item \verb+void peek(Receiver receiver, String key)+
\item \verb+void take(Receiver receiver, String key)+
\end{itemize}

\subsubsection{put}
\verb+put+ はデータを追加するための API である。Key Value Storeのキューに追加される。 (図 \ref{fig:put})

\begin{figure}[htbl]
\begin{center}
\scalebox{1.1}{\includegraphics{images/put.pdf}}
\end{center}
\caption{putはデータを追加する}
\label{fig:put}
\end{figure}


\subsubsection{update}
\verb+update+ はデータを更新するためのAPIである。キューの先頭を置き換える。
(図 \ref{fig:update})


\begin{figure}[htbl]
\begin{center}
\scalebox{1.1}{\includegraphics{images/update.pdf}}
\end{center}
\caption{updateはキューの先頭を書き換える}
\label{fig:update}
\end{figure}

\subsubsection{peek}
peek はデータを取得する。(図 \ref{fig:peek})
\begin{figure}[html]
\begin{center}
\scalebox{1.0}{\includegraphics{images/peek.pdf}}
\end{center}
\caption{peekはデータを取得する}
\label{fig:peek}
\end{figure}


Data Segmentが無ければCode Segmentの待ち合わせが起きる。(図 \ref{fig:no_peek})

\begin{figure}[htbl]
\begin{center}
\scalebox{1.1}{\includegraphics{images/peek1.pdf}}
\end{center}
\caption{希望のデータが無いときは保留する}
\label{fig:no_peek}
\end{figure}

put、updateによりData Segmentの更新があれば、peekが直ちに実行され、待ち合わせを行なっていたCode Segmentがactive queue に移される。

\subsubsection{take}
takeもデータを取得するためのAPIである。(図 \ref{fig:take})peekとの違いは取得されたData SegmentはKey Value Storeのキューから取り除かれる。
\begin{figure}[htbl]
\begin{center}
\scalebox{1.1}{\includegraphics{images/take.pdf}}
\end{center}
\caption{take はデータを読み込む}
\label{fig:take}
\end{figure}

\subsection{Code Segment}

Code Segmentはタスクのことである。Code Segmentをユーザーが記述するときにCode Segment内で使用するData Segmentの作成を記述する。Code SegmentにはInput Data SegmentとOutput Data Segmentを作るAPIが存在する。


Input Data Segmentで作成されたData SegmentはRemoteかLocalを指定する必要がある。
実際にはsetKeyのメソッド時に指定するが、その他にどのData Segmentを取ってくるかを指定するキーを指定する。
Code Segmentがactiveになるためには、Input Data Segmentが全て揃う必要がある。


Output Data Segmentで作成されたData Segmentにも、RemoteかLocalを指定する。
実際にはputまたはupdateメソッドを呼んだ時にRemote,Localを指定すると共にキーを指定する。

これらのInput/OutputがCode Segment間の依存関係を自動的に記述することになる。

\subsubsection{Code Segmentの実行方法}
Alice には、Start Code Segment (ソースコード \ref{fig:StartCodeSegment})というC の main に相当するような最初に実行される Code Segment がある。
\begin{table}[html]
\lstinputlisting[label=fig:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
\end{table}

Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。
このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。(ソースコード \ref{fig:TestLocalAlice})

\begin{table}[html]
\lstinputlisting[label=fig:TestLocalAlice, caption=Start Code Segmentを実行させる方法]{source/TestLocalAlice.java}
\end{table}

\subsubsection{Code Segmentの記述方法}
Code Segmentをユーザーが記述する際にはCode Segmentを継承して記述する。(ソースコード \ref{fig:CodeSegment})そのCodeSegmentはInputDataSegmentManagerとOutputDataSegmentManagerを利用することができる。

InputDataSegmentManagerはCode Segmentの{\tt ids}というフィールドを用いてアクセスする。



\begin{table}[html]
\lstinputlisting[label=fig: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 {\ttfamily void setKey(String managerKey, String key)}
\end{itemize}
setKeyメソッドにより、どこのData Segmentのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定することができる。
コマンドの結果がレスポンスとして届き次第Code Segmentは実行される。

OutputDataSegmentManagerはCode Segmentの{\tt ods}というフィールドを用いてアクセスする。
OutPutDataSegmentManagerは{\tt put}または{\tt update}を実行することができる。
\begin{itemize}
\item {\ttfamily void put(String managerKey, String key, \\ Value val)}
\item {\ttfamily void update(String managerKey, String key, Value val)}
\end{itemize}



\section{Message Pack }
Data Segmentのデータの表現にはMessage Packを利用している。Message Packに関してJavaにおけるデータ表現は以下の3つある。
\begin{itemize}
\item {\ttfamily 一般的なJavaのクラスオブジェクト}
\item {\ttfamily MessagePack for JavaのValueオブジェクト}
\item {\ttfamily byte[]で表現されたバイナリ}
\end{itemize}

Data Segmentは、MessagePack for JavaのValueオブジェクトを用いてデータが表現されている。
MessagePackはJavaのように静的に型付けされたオブジェクトではなく、自己記述なデータ形式である。
MessagePack for JavaのValueオブジェクトはMessagePackのバイナリにシリアライズできる型のみで構成されたJavaのオブジェクトである。
そのため、Valueも自己記述式のデータ形式になっている。

Valueオブジェクトは通信に関わるときには、シリアライズ・デシリアライズを高速に行うことができる。
ユーザーはメソッドを用いてオブジェクト内部のデータを閲覧、編集することができる。

ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。
ただし、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。