Mercurial > hg > Papers > 2013 > sugi-sigos
view alice.tex @ 2:ddd5a624bb7a
add image flies
author | sugi |
---|---|
date | Mon, 01 Apr 2013 01:52:11 +0900 |
parents | 484bf45ca3ee |
children | 715578f76084 |
line wrap: on
line source
\section{分散ネットフレームワークAlice} Aliceは、本研究室で開発を行なっている分散管理フレームワークである。Cell用ののOpen CLに似たTask管理フレームワークCerium\cite{kono09b} \cite{cerium-sourceforge}とLinda\cite{linda} を相互接続した分散フレームワークであるFederated Lindaの開発を通して得られた知見が生かされている。 まず、Aliceを使用するに必要なData Segment、Code Segmentについて説明を行う。 \subsection{Data Segment API} Data Segmentは数値や文字列などのデータ構造体的に保持するが、Data Segmentの相互参照が問題になる。AliceはData Segmentをデータベース的に扱い、またData Segmentは必ずuniqueなKeyをもつ。つまりKey Value Storeとして考えることができる。Key毎にキューがあり、Key毎に順に実行される。Key毎の追加と取得は、Lindaに準じた設計となっている。 Data Segmentを管理するのがData Segment Manager(以下DSM)である。ノード毎にLocal DSMとRemote DSMが存在する。Local DSMはノード固有のKey Value Storeと考えることができる。Remote DSMは他のノードのLocal DSMのproxyである。(図 \ref{fig:proxy})AliceのトポロジーマネージャーがRemote DSMを自動的に構成する。 Key Value Storeへのアクセスはキューによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread poolにより並列実行される。 \begin{figure}[tb] \begin{center} \scalebox{1.2}{\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}[tb] \begin{center} \scalebox{1.2}{\includegraphics{images/put.pdf}} \end{center} \caption{putはデータを追加する} \label{fig:put} \end{figure} \subsubsection{update} \verb+update+ はデータを更新するためのAPIである。キューの先頭を置き換える。 (図 \ref{fig:update}) \begin{figure}[tb] \begin{center} \scalebox{1.2}{\includegraphics{images/update.pdf}} \end{center} \caption{updateはキューの先頭を書き換える} \label{fig:update} \end{figure} \subsubsection{peek} peek はデータを取得する。(図 \ref{fig:peek})Data Segmentが無ければCode Segmentの待ち合わせが起きる。(図 \ref{fig:no_peek}) put、updateによりData Segmentの更新があれば、peekが直ちに実行され、待ち合わせを行なっていたCode Segmentがactive queue に移される。 \begin{figure}[tb] \begin{center} \scalebox{1.2}{\includegraphics{images/peek.pdf}} \end{center} \caption{peekはデータを取得する} \label{fig:peek} \end{figure} \begin{figure}[tb] \begin{center} \scalebox{1.2}{\includegraphics{images/peek1.pdf}} \end{center} \caption{希望のデータが無いときは保留する} \label{fig:no_peek} \end{figure} \subsubsection{take} takeもデータを取得するためのAPIである。(図 \ref{fig:take})peekとの違いは取得されたData SegmentはKey Value Storeのキューから取り除かれる。 \begin{figure}[tp] \begin{center} \scalebox{1.2}{\includegraphics{images/take.pdf}} \end{center} \caption{take はデータを読み込む} \label{fig:take} \end{figure} \subsection{Data Segment } 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で扱うことのできるデータのみをフィールドに入れなければならない。 \begin{table}[htbp] \lstinputlisting[label=fig:MessagePackTest, caption=一般的なクラスをIDLのように使用]{source/MessagePackTest.java} \end{table} \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 がある。 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。 このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。(ソースコード \ref{fig:TestLocalAlice}) \begin{table}[tb] \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}[tb] \lstinputlisting[label=fig:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} \end{table} \begin{table}[tb] \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}