annotate paper/chapter1.org.tex @ 19:6b470aab9a41

modify chapter1
author sugi
date Thu, 29 Jan 2015 14:56:54 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
1 \chapter{分散フレームワーク Alice の概要} \label{chapter:chapter1}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
2 Aliceは、本研究室で開発を行っている分散タスク管理フレームワークである。Cell用のOpen CLに似たTask管理フレームワークCeriumとLindaを相互に接続した分散フレームワークであるFederated Lindaの開発を通して得られた知見が生かされている。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
3
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
4 Ceriumでは、Taskを小さく分割して並列実行し、データ転送はパイプライン実行により隠される。Task間に依存関係があるが、実際にはデータの依存関係がそのままTaskの依存関係になることが多い。繰り返し使われるデータ構造の管理が重要であり、実行時にわかるデータ構造間の依存関係がTaskを複雑にしている。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
5
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
6 Federated Lindaでは、Lindaサーバ内部にMeta Engineと呼ばれるLindaのタプル(データ構造)をやり取りする部分を作成した。Meta Engineでは、タプルのやり取りによって起動するcall backを使うが、call backによる記述が分散してしまい、可読性を落としてしまう。また、複数のタプルの待ち合わせが重要だが、その待ち合わせはsingle threadedなMeta Engine内部の状態に依存する。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
7
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
8 これらが示しているのは、並列分散実行はコードの並列実行だけでなく、データの単位が重要だということである。そこで、AliceはData SegmentとCode Segmentという単位でデータと処理を細かく分割し、それぞれの依存関係を記述して分散プログラムを作成する。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
9
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
10 Data SegmentはCode Segmentと分離されたデータ構造であり、オブジェクトではない。オブジェクト指向プログラミングが状態を複雑に持ち、並列実行や分散実行に向かないことは徐々に理解されてきている。一方で、状態自体は有限状態遷移機械(Finite State Machine/FSM)で記述するのが自然である。Code Segmentは状態遷移記述そのものであり、その状態遷移はData Segmentの到着によってトリガーされる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
11
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
12 カプセル化されたデータをプロセスがやり取りするのは、DFD(Data Flow Diagram)の古典的な手法であり、それ自体は新しくはない。むしろ、メインフレーム上でのソフトウェア開発に良く使われてきた手法である。Alice では、それを再実装する。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
13
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
14 AliceはCode SegmentとData SegmentをJavaとMessage Packで実装したフレームワークである。Topology Managerを持ち、Blade上での
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
15 分散プログラムの実験を容易に行うことができる。また、SEDA Architectureを採用しており、マルチコア上でのスループットの向上を期待している。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
16
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
17 \section{Data Segment}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
18 Data Segmentはデータを細かく分割したものであり、数値や文字列などのデータを構造的に保持する。AliceはData Segmentをデータベースとして扱っている。Data Segmentには必ず対になるKeyが存在する。つまりKey Value Storeとして考える事ができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
19
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
20 Aliceのデータベースは通常のKVSとは異なっている点がある。通常のKVSはプログラミング言語の連想配列やMapと同様に 「Key(キー)」と「Value(値)」がペアとなっている。そのため1つのKeyに対して値は1つである。しかし、Aliceの場合は「Key」と「Queue」がペアとなっているため、Keyに対して複数回putできる。従って取得できるValueも複数存在できる。Key毎の追加と取得はLindaに準じた設計になっている。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
21
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
22 Data SegmentはData Segment Manager(以下DSM)によって管理されている。ノード毎にLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のKVSとなっている。従ってRemote DSMを指定するKeyはノード内部でuniqueなものである。Remote DSMは他のノードのLocal DSMのproxyと考えられる。つまりRemote DSMは複数存在し、それぞれに対応するノードは異なる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
23
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
24 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
25 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
26 \includegraphics{images/remote_datasegment.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
27 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
28 \caption{Remote DSMは他のノードのLocal DSMのproxy }
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
29 \label{fig:RemoteDSM}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
30 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
31
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
32 KVSへのアクセスはqueueによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread Poolにより並列実行される。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
33 \subsection{Data Segment API}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
34 以下が用意されているData Segment APIである。これらを用いてデータの送受信を行う。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
35 \begin{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
36 \item \verb+void put(String key, Value val)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
37 \item \verb+void update(String key, Value val)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
38 \item \verb+void peek(Receiver receiver, String key)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
39 \item \verb+void take(Receiver receiver, String key)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
40 \end{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
41 \subsubsection{put}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
42 putはデータをQueueに追加するためのAPIである。Lindaのout()に相当する。(図 \ref{fig:put})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
43 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
44 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
45 \includegraphics[width=100mm]{images/put.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
46 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
47 \caption{queueにデータを追加する}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
48 \label{fig:put}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
49 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
50
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
51 \subsubsection{update}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
52 updateはデータを置き換える特急メッセージのように動作する。Lindaのupdate()に相当する。(図 \ref{fig:update})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
53 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
54 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
55 \includegraphics[width=100mm]{images/update.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
56 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
57 \caption{update"は先頭データを取り除き、queueにデータを追加する}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
58 \label{fig:update}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
59 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
60
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
61 \subsubsection{peek}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
62 peekはデータを読み込むAPIである。読み込まれたデータはQueueに残る。要求したデータが存在しなければ、Code Segmentの待ち合わせ (Blocking)が起こる。putやupdateによりデータに更新があった場合、peekが直ちに実行される。Lindaのread()に相当する。(図 \ref{fig:peek})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
63
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
64 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
65 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
66 \includegraphics[width=90mm]{images/peek.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
67 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
68 \caption{peekはデータをreceiverに読み込む。希望のデータがない場合は保留する}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
69 \label{fig:peek}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
70 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
71
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
72 \subsubsection{take}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
73 takeもデータを読み込むためのAPIである。peekとの違いは読み込まれたデータはQueueから削除される。Lindaのin()に相当する。(図 \ref{fig:take})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
74 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
75 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
76 \includegraphics[width=70mm]{images/take.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
77 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
78 \caption{"take" はデータを receiver に読み込む。その際、読み込んだデータは削除される}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
79 \label{fig:take}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
80 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
81
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
82 \subsection{Data Segment の表現}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
83 Data Segmentの表現にはMessage Packを利用している。Message Packに関してJavaにおけるデータ表現は以下の3種類があり、制限を伴うが互いに変換可能である。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
84 \begin{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
85 \item {\ttfamily 一般的なJavaのクラスオブジェクト}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
86 \item {\ttfamily MessagePack for JavaのValueオブジェクト}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
87 \item {\ttfamily byte[]で表現されたbinary}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
88 \end{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
89
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
90 Data Segment APIの内部においてデータは、一般的なJavaのクラスオブジェクトまたはbyteArrayで表現されたbinaryで表現されている。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
91 Localからデータがputされた場合は一般的なJavaのクラスオブジェクトの状態でenqueueされる。RemoteからデータがputされるとbyteArrayで表現されたbinaryの状態でenqueueされる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
92
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
93 ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
94 この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。もちろん、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
95
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
96 Remoteに対してputできるデータは、@MessageをもつクラスオブジェクトかMessage Packで扱える型に限られる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
97
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
98 \section{Code Segment}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
99 Code SegmentとはAlice上で実行されるタスクの単位である。ユーザーはCode Segmentを組み合わせることでプログラミングを行う。Code Segmentをユーザーが記述する際に、内部で使用するData Segmentの作成を記述する。入力時のData SegmentをInput Data Segment、出力時をOutput Data Segmentと呼ぶ。(図 \ref{fig:dsandcs})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
100
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
101 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
102 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
103 \includegraphics[width=100mm]{images/dsandcs.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
104 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
105 \caption{Code SegmentはInput Data Segment とOutput Data Segmentが存在する}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
106 \label{fig:dsandcs}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
107 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
108
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
109 Input Data Segment と Output Data SegmentはCode Segmentに用意されているAPIを用いて作成する。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
110 Input Data Segmentは、LocalかRemoteか、またkeyを指定する必要がある。Code Segmentは、記述したInput Data Segmentが全て揃うとThread poolに送られ、実行される。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
111
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
112 Out Data SegmentもLocalかRemoteか、またkeyを指定する必要がある。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
113
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
114 Input Data SegmentとOutput Data SegmentによってCode Segmentの間の依存関係が自動的に記述される。(図 \ref{fig:dsandcs2})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
115
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
116 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
117 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
118 \includegraphics[width=110mm]{images/dsandcs2.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
119 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
120 \caption{Input Data Segment とOut put Data SegmentがCode Segment間の依存関係を自動的に記述する}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
121 \label{fig:dsandcs2}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
122 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
123 現在、Inputの場合はsetKeyを呼ぶ際、Outputはput(またはupdate)の際にノードとkeyの指定を行っている。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
124 しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
125
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
126 \subsection{Code Segmentの実行方法}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
127 Alice には、Start Code Segment (ソースコード \ref{src:StartCodeSegment})というC の main に相当するような最初に実行される Code Segment がある。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
128 \begin{table}[html]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
129 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
130 \end{table}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
131
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
132 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
133 このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
134
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
135 \subsection{Code Segmentの記述方法}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
136 Code Segmentをユーザーが記述する際にはCode Segmentを継承して記述する(ソースコード \ref{src:CodeSegment})。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
137 Code SegmentはInput/Output Data Segment Managerを利用することができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
138
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
139 Input DSM はCode Segmentの{\tt ids}というフィールドを用いてアクセスする。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
140
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
141 \begin{table}[html]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
142 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
143 \end{table}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
144
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
145 \begin{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
146 \item {\ttfamily Receiver create(CommandType type)}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
147 \end{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
148 createでコマンドが実行された際に取得されるData Segmentが格納される受け皿を作る。引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
149 \begin{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
150 \item \verb+void setKey(String managerKey, String key)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
151 \end{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
152 setKeyメソッドにより、どこのData Segmentのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定することができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
153 コマンドの結果がレスポンスとして届き次第Code Segmentは実行される。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
154
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
155 Output DSMはCode Segmentの{\tt ods}というフィールドを用いてアクセスする。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
156 Output DSMは{\tt put}または{\tt update}を実行することができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
157 \begin{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
158 \item \verb+void put(String managerKey, String key, Object val)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
159 \item \verb+void update(String managerKey, String key, Object val)+
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
160 \end{itemize}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
161
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
162
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
163 \section{Meta Data Segment}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
164 Meta Data SegmentはData Segmentの一種である。Data Segmentは、ユーザーがput(またはupdate)したデータを管理するData Baseであるのに対して、Meta Data Segmentは、分散フレームワークAliceがputしたデータを管理するData Baseである。管理されているデータは、主にTopology Nodeの状態を表すメタデータである。ユーザーがメタデータを扱うこともできる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
165
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
166 例えば、"start"というkeyにはTopology NodeがStart Code Segmentを実行することができる状態を表す。他にも"\_CLIST"というkeyでは、利用可能なRemote Data Segmentの名前のリストが保存されている。ユーザーはリストをpeekし、putする際にリストにある名前を指定することで、動的にデータの伝搬などを行うことができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
167
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
168 また、Input Data Segmentに付随しているものもある。Input Data SegmentはCode Segment内部でReceiverという入れ物に格納される。ユーザーは、Receiverに対して操作することでData Segmentを入手できる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
169 このReceiverには、fromというフィールドがあり、このデータを誰がputしたという情報が入っている。この情報をデータの伝搬する際に利用することで、データをputしたノードに送り返すことを防ぐことができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
170
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
171 現在のAliceでは、メタデータはデータと同じ領域にputされているため、データと同じAPIを用いて取得できる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
172
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
173 \section{Meta Code Segment}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
174 Meta Code SegmentはAliceを構成するCode Segmentである。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
175
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
176
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
177
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
178 Alice自身が全てCode Segmentで記述されているため、AliceをMeta Code Segmentのかたまりと考える事ができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
179
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
180
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
181 \section{Topology Manager}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
182 Aliceは複数のノードで構成され、相互に接続される。通信するノードはURLにより直接指定するのではなくTopology Managerで管理する。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
183 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきTopology NodeのIPアドレス、ポート番号、接続名を送りトポロジーファイルに記述されたとおりにトポロジーを作成する。(図\ref{fig:topologymanager})
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
184
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
185 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
186 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
187 \includegraphics[width=70mm]{images/topologymanager.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
188 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
189 \caption{Topology Manager はトポロジーファイルの記述に従ってトポロジーを生成する}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
190 \label{fig:topologymanager}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
191 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
192
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
193 Code Segment内部でRemote DSMにアクセスする場合はToplogyManagerによって指定されたノード内部だけで有効なlabel(文字列)を使う。これにより特定のURLがCode Segment内部に記述されることを防いでいる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
194
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
195 トポロジーファイルはグラフ構造を表現するデータ記述する言語の一種であるDOT Languageと呼ばれる言語で記述する。また、dotコマンドを用いてトポロジーファイルを可視化することができる。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
196
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
197 \subsection{Topology Managerの参加表明処理}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
198 Topology Managerへの参加表明は、Topology Node起動時にコマンドライン引数からTopology ManagerのIPアドレスとポート番号を指定すればよい。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
199 指定されたTopology Managerに接続を行うと、Topology Manager側のキー"hosts"に、自分自身のIPアドレスとポート番号をputする。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
200
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
201 参加表明を受け取ったTopology Managerは、抽象名を参加表明したTopology Nodeのキー"host"にputする。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
202 その後、Topology Manager上のTopology Node名のキーに、接続すべきTopology Nodeの情報(IP アドレス、ポート番号等)を全てputする。Topology Nodeは、その情報を1つずつTakeし接続処理を行う。全ての接続処理が終わるとTopology ManagerからTopology Nodeに対してStart Code Segmentの実行命令が出され、アプリケーションが開始される。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
203
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
204 \begin{figure}[htbp]
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
205 \begin{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
206 \includegraphics[width=120mm]{images/topologymanagerandnode.pdf}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
207 \end{center}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
208 \caption{Topology ManagerとTopology Node間の通信}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
209 \label{fig:topologymanagerandnode}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
210 \end{figure}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
211
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
212 \section{Aliceによるプログラミング手法}
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
213 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の実行順序を決定している。
6b470aab9a41 modify chapter1
sugi
parents:
diff changeset
214 すなわち、Aliceによるプログラミングとは通信の管理を行うことであり、プロトコルを設計することと捉える事ができる。