Mercurial > hg > Papers > 2022 > riono-master
annotate Paper/chapter/1-Christie.tex @ 62:74fb935dc5b5 default tip
update
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 02 Mar 2022 13:15:50 +0900 |
parents | 7142a147b9ab |
children |
rev | line source |
---|---|
8 | 1 \chapter{Christie} |
2 | |
51 | 3 Christie\cite{christie}とはJavaで記述された並列分散通信フレームワークである。Alice\cite{alice}という前身のプロジェクトが開発されていたが、以下のような問題があった。 |
8 | 4 データを送受信するAPIはインスタンスを生成して関数を呼び出す様に設計されているが、外部Classからも関数が実行できてしまうため、 |
5 受信する際どのkeyに紐づいたデータを受け取るのか、直感的にわからない。 | |
6 データを管理しているlocalDataSegmentがシングルトンで設計されており、Localで接続を行う際に複数のアプリケーションで立ち上げる必要がある。 | |
7 データを受け取る際にObject型で受け取っているため、送信元を辿らない限り何の型が送信されているか不明瞭である。 | |
8 | |
9 | |
13 | 10 それらの問題点を解消するためにAliceを再設計し、作成されたものがChristieである。 |
53 | 11 ChristieではAliceの機能や概念を維持しつつ、Aliceで発生していた問題点やプログラムの煩雑さなどを解消している。 |
8 | 12 |
13 | |
14 \section{Christieの基礎概念} | |
52 | 15 Christieはタスクとデータを細かい単位に分割してそれぞれの依存関係を記述し、 |
8 | 16 タスク実行に必要な入力が揃った順から並列実行するというプログラミング手法を用いている。 |
17 | |
51 | 18 将来的に当研究室で開発しているGearsOS\cite{gears}のファイルシステムに組み込まれる予定があるため、GearsOSを構成する言語 Continuation based C\cite{cbc}と |
8 | 19 似た概念を持っている。Christieに存在する概念として以下の様なものがある。 |
20 | |
21 \begin{itemize} | |
22 \item CodeGear | |
23 \item DataGear | |
24 \item CodeGearManager (以下CGM) | |
25 \item DataGearManager (以下DGM) | |
26 \end{itemize} | |
27 | |
10 | 28 \begin{figure}[htb] |
29 \begin{center} | |
30 \includegraphics[width=150mm]{images/GearsRelationships.pdf} | |
31 \end{center} | |
32 \caption{各Gearの関係性} | |
33 \label{fig:GearRelationships} | |
34 \end{figure} | |
35 | |
36 図\ref{fig:GearRelationships}はそれぞれのGearの関係性を図示したものである。 | |
8 | 37 CodeGearはクラスやスレッドに相当する。 |
10 | 38 DataGearは変数データに相当し、CodeGear内でJavaのannotationの機能を用いてkeyに紐づいた変数データを取得できる。 |
8 | 39 CodeGear内に記述した全てのDataGearにデータが格納された際に、初めてそのCodeGearが実行されるという仕組みになっている。 |
40 | |
41 CGMはノードに相当し、CodeGear、DataGear、DGMを管理している。 | |
42 DGMはDataGearを管理しており、putという操作によって変数データ、つまりDataGearをDGMに格納できる。 | |
43 DGMのput操作を行う際にはLocalとRemoteのどちらかを選び、変数のkeyとデータを引数として渡す。 | |
44 LocalであればLocalのCGMが管理しているDGMに対してDataGearを格納していく。 | |
45 Remoteであれば、接続したRemote先のCGMが管理しているDGMにDataGearを格納する。 | |
46 | |
47 \begin{figure}[htb] | |
48 \begin{center} | |
49 \includegraphics[width=150mm]{images/ChristieClass.pdf} | |
50 \end{center} | |
51 \caption{同一プロセスでのChristieの複数インスタンス立ち上げ} | |
52 \label{fig:MultiInstance} | |
53 \end{figure} | |
54 | |
55 図\ref{fig:MultiInstance}は、Christieを同一プロセスで複数のインスタンスを生成した際のDGMやCGMの接続構造を示している。 | |
56 全てのCGMはThreadPoolと他のCGMをListとして共有している。 | |
57 ThreadPoolとはCPUに合わせた並列度でqueueに入ったThreadを順次実行していく実行機構である。 | |
58 ThreadPoolが増えると、CPUコア数に合わない量のThreadを管理することになり並列度が下がるため、1つのThreadPoolで全てのCGMを管理している。 | |
59 またCGMのListを共有することでメタレベルで全てのCodeGear/DataGearにアクセス可能となっている。 | |
9 | 60 CGを記述する際はCodeGear.classを継承する。 |
61 CodeGearはRunnableインターフェースを持っており、runメソッド内に処理を記述することでマルチスレッドで処理が行われる。 | |
62 CGに記述したkeyと一致するDGが全て揃った時、runに記述された処理が実行される。 | |
63 runメソッドの引数にCGMを指定しており、そのCGMを経由してChristieのAPIにアクセスする。 | |
64 GearsOSではCG間でContextを受け渡すことによってCGはDGにアクセスを行なっているため、Christieでもそのアクセス方法が採用されている。 | |
65 | |
66 通常のRunnableクラスでは引数を受け取ることができないが、 | |
67 CodeGearExecutorというRunnableのMeta Computationを挟んだことでCGMを受け渡しながらの記述を可能にしている。 | |
68 | |
69 DGMに対してput操作を行うことでDGM内のqueueにDGを保管できる。 | |
70 DGを取り出す際には、CG内で宣言した変数データにannotationを付ける。 | |
13 | 71 |
47 | 72 \section{Christieにおける継続} |
73 プログラムにおける継続とは、計算の途中を前後に分割し、分割した後の部分をfirst class objectとして扱うものである。 | |
74 つまり、計算途中などのどのような状況でもそのobjectを取り出すことが可能であると言うことである。 | |
75 しかし継続を扱うためにはStackを含めた実行環境全体をheapにコピーする必要がある。 | |
76 | |
77 継続の一種に軽量継続がある。 | |
78 軽量継続は、Stackや環境のコピーを持っていないが、全ての必要な情報を関数の引数として持っている。 | |
79 必要な情報とは、計算に必要なデータや関数を実行した後にJumpするべき関数である。 | |
80 | |
81 Christieでは、CodeGearとDataGearでプログラムを行っているが、 | |
82 内部ではannotationでkeyを待ち、DataGearManagerにkeyをつけてDataGearを渡している。 | |
83 keyでつながったCodeGearに計算は接続されている。実行されたCodeGearはdataをputし、次のCodeGearをSetupしてプログラムの処理が行われていく。 | |
84 これにより簡易的な継続が行われているといえる。 | |
85 | |
86 また、keyでデータを渡すデータ構造にTreeMapを使用することがある。 | |
53 | 87 TreeMapはStackのような働きをするが、TreeMap自体を分散環境で通信する場合に巨大なデータ構造を渡してしまうことになる。 |
88 この方法では分散通信のパフォーマンスが低下してしまうと考えられるため、TreeMapのkeyを使用してPut/Takeすることで対応可能であると考える。 | |
47 | 89 その際、2nd keyとして接続先のhostname:portを指定する。 |
90 こうするとで、データはproxyとしてアクセスすることが可能となる。 | |
91 これよりChristieは、名前付き継続と呼ぶことが可能な継続の一つを使用していると言える。 | |
92 | |
13 | 93 \section{annotationを使用したデータの記述} |
94 | |
95 ChristieではDGの指定にannotationを使用する。 annotationとはクラスやメソッド、パッケージに対して付加情報を記述できる | |
96 Java のMeta Computationである。先頭に@を付けることで記述でき、オリジナルのannotationを定義することもできる。 | |
97 Christieのannotationには以下の4種類がある。 | |
9 | 98 |
10 | 99 \begin{description} |
100 \item[Take] 先頭のDGを読み込み、そのDGを削除する。 | |
101 \item[Peek] 先頭のDGを読み込むが、DGは削除されない。そのため、特に操作をしない場合には同じDGを参照し続ける。 | |
102 \item[TakeFrom(Remote DGM name)] Takeと処理動作は同じであるが、Remote DGM nameを指定することで、その接続先(Remote)のDGMからTake操作を行うことができる。 | |
103 \item[PeekFrom(Remote DGM name)] Peekと処理動作は同じであるが、 Remote DGM nameを指定することで、その接続先(Remote)のDGMからPeek操作を行うことができる。 | |
104 \end{description} | |
9 | 105 |
8 | 106 |
11 | 107 DGの宣言には型と変数を直接宣言し、変数名としてkeyを記述する。 そして、その宣言の上にannotationでTakeまたはPeekを指定する(ソースコード\ref{src:TakeExample})。 |
8 | 108 |
109 | |
20 | 110 \lstinputlisting[label=src:TakeExample, caption=Takeの例]{src/java/TakeExample.java} |
8 | 111 |
11 | 112 annotationで指定したDGはCGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 |
113 これにはJavaのreflectionAPIを利用しており、annotationと同時に変数名も取得できるため、面数名によるkeyの指定が可能になっている。 | |
8 | 114 |
11 | 115 Christieのannotationはフィールドに対してのみ記述可能であるため、keyの指定とTake/Peekの指定を必ず一箇所で書くことが明確に決まっている。 |
116 これより、Aliceの様に外のCGからkeyやデータへの干渉をされることがない。 | |
117 さらにkeyを変数名にしたことで、動的なkeyの指定やkeyと変数名の不一致による可読性の低下を防ぐことが可能となった。 | |
8 | 118 |
11 | 119 リモートノードに対してTake/Peekをする際には、TakeFrom/PeekFrom annotationを用いる(ソースコード\ref{src:TakeFromExample})。 |
8 | 120 |
20 | 121 \lstinputlisting[label=src:TakeFromExample, caption=TakeFromの例]{src/java/TakeFromExample.java} |
12 | 122 |
123 | |
13 | 124 \section{データの型整合性} |
125 Aliceでは送受信するデータはReceive型という専用の型を使用していた。 | |
126 内部のデータ自体はobject型だったため、元データの型を知るためには送信元を確認する必要があった。 | |
127 ChristieではannotationでDGの宣言を行っているため、直接変数の型を宣言することが可能となっている。 | |
128 ソースコード\ref{src:InputDGExample}はDGのデータを扱う例である。 | |
129 | |
20 | 130 \lstinputlisting[label=src:InputDGExample, caption=DGのデータを扱う例]{src/java/InputDG.java} |
13 | 131 |
132 DGとして宣言した変数の型は、JavaのreflectionAPIを用いてCGMで保存され、LocalやRemoteノードと通信する際に適切な変換が行われれる。 | |
133 この様にプログラマが指定せずとも正しい型でデータを取得できるため、プログラマの負担を減らし信頼性を保証することができる。 | |
134 | |
135 | |
136 \section{CodeGearの記述方法} | |
137 以下のソースコード\ref{src:StartCGExample}、\ref{src:CGExample}、\ref{src:CounteObj}はLocalDGMにputしたDGを取り出して表示し、 | |
138 インクリメントして10回繰り返す例題である。 | |
139 | |
30
2a9f335e45bd
add source code and update Unity chapter
riono <e165729@ie.u-ryukyu.ac.jp>
parents:
25
diff
changeset
|
140 \lstinputlisting[label=src:StartCGExample, caption=StartCodeGearの記述例]{src/java/StartCountUp.java} |
2a9f335e45bd
add source code and update Unity chapter
riono <e165729@ie.u-ryukyu.ac.jp>
parents:
25
diff
changeset
|
141 \lstinputlisting[label=src:CGExample, caption=CodeGearの記述例]{src/java/CountUpper.java} |
20 | 142 \lstinputlisting[label=src:CounteObj, caption=DGとして送信されるオブジェクトのクラス]{src/java/CountObject.java} |
13 | 143 |
52 | 144 Christieでは、StartCodeGear(以下StartCG)から処理を開始する。 |
13 | 145 StartCGはStartCodeGear.javaを継承することで記述可能である。 |
146 | |
147 StartCGを記述する際には、createCGMメソッドによりCGMを生成する必要がある(ソースコード\ref{src:StartCGExample} 5行目)。 | |
148 createCGMの引数にはremoteノードとソケット通信をする際に使用するポート番号を指定する。 | |
149 CGMを生成した際にLocalDGMやremoteと通信を行うためのDaemonも生成される。 | |
150 | |
151 | |
152 CGに対してannotationから待ち合わせを実行する処理はsetupメソッドが行う。 | |
53 | 153 そのためソースコード\ref{src:StartCGExample}の10行目、ソースコード\ref{src:CGExample}の10行目のように、 |
13 | 154 CGのインスタンスをCGMのsetupメソッドに渡す必要がある。 |
155 そのためどこでもCGの待ち合わせを行うことができず、必ずCGMの生成を行う必要がある。 | |
156 その制約により、複雑になりがちな分散プログラミングのコードの可読性を高めている。 | |
157 実行されたCGを再度実行する場合にも、CGのインスタンスを生成してsetupメソッドに渡す。 | |
158 | |
36 | 159 |
13 | 160 |
161 \section{DataGearManagerの複数立ち上げ} | |
162 AliceではLocalDGMと同じ機能のLocalDataSegmentManagaer(以下LocalDSM)がstaticで実装されていたため、複数のLocalDSMを立ち上げることができなかった。 | |
163 しかしChristieではCGMの生成に伴いLocalDGMも生成されるため、複数作成が可能である。 | |
164 複数のLocalDGM同士のやり取りも、Remoteへの接続と同じ様に相手をRemoteDGMとしてproxyとして立ち上げることでアクセス可能である(図\ref{fig:LocalRemoteCommunication})。 | |
165 | |
36 | 166 \begin{figure}[tb] |
13 | 167 \begin{center} |
16 | 168 \includegraphics[width=120mm]{images/LocalRemoteCommunication.pdf} |
13 | 169 \end{center} |
170 \caption{RemoteDGMを介したCGM間の通信} | |
171 \label{fig:LocalRemoteCommunication} | |
172 \end{figure} | |
173 | |
174 | |
175 ソースコード\ref{src:2LocalDGM}はLocalDGMを2つ立ち上げ、お互いをremoteに見立てて通信する例である。 | |
176 6行目にあるように、RemoteDGMを立ち上げるにはCGMが持つcreateRemoteDGMメソッドを用いる。 | |
177 引数にはRemoteDGM名と接続するremoteノードhost名、ポート番号を指定している。 | |
178 | |
36 | 179 \newpage |
180 | |
20 | 181 \lstinputlisting[label=src:2LocalDGM, caption=LocalDGMを2つ作る例]{src/java/RemoteDGMCommunication.java} |
13 | 182 |
183 remoteへの接続と同じ様にアクセスが可能になっており、コードを変更せずに同一マシン上の1つのアプリケーション内で分散アプリケーションのテストが可能となっている。 | |
184 | |
185 | |
186 また、CGMは内部に同一プロセス全てのCGMリストをstaticで持っており、複数生成したCGMを全て管理している。 | |
187 つまり、メタレベルではRemoteDGMを介さずに各LocalDGMに相互アクセス可能である。 | |
12 | 188 |
15 | 189 \newpage |
12 | 190 |
13 | 191 \section{通信フロー} |
14 | 192 本章で説明したChristieの設計をいくつか例を挙げてChristieの通信のフローをシーケンス図を用いて解説する。 |
193 図\ref{fig:LocalTakeSequence}はLocalDGMにTakeを行い、LocalDGM内にDGがあったときの処理の流れである。 | |
194 | |
195 | |
196 \begin{figure}[htb] | |
197 \begin{center} | |
15 | 198 \includegraphics[width=160mm]{images/LocalSequence.pdf} |
14 | 199 \end{center} |
200 \caption{LocalDGMにTakeした際のフロー} | |
201 \label{fig:LocalTakeSequence} | |
202 \end{figure} | |
203 | |
204 | |
205 プログラマはmainでCGMを生成する。CGMと同時にLocalDGMが作成される。 | |
206 続いてStartCG内でCGのインスタンスを作成し、setupメソッドが呼ばれると、DGに付与されたannotationからTakeコマンドが作られ実行される。 | |
207 CGは生成したコマンドの総数を初期値としたカウンタを持っており、コマンドが解決される(DGが揃う)度にカウンタは減少する。 | |
208 カウンタが0になると待ち合わせが完了したとなり、run内の処理がThreadPoolへ送られる。 | |
209 | |
210 | |
211 図\ref{fig:RemotePutSequence}は、LocalDGMにTakeを行うが、LocalDGM内にDGがなかったためにPutの待ち合わせを行うときの処理の流れである。 | |
212 mainなどの最初の処理は図\ref{fig:LocalTakeSequence}と同様のため省略する。 | |
13 | 213 |
214 | |
14 | 215 \begin{figure}[htb] |
216 \begin{center} | |
15 | 217 \includegraphics[width=160mm]{images/RemotePutSequence.pdf} |
14 | 218 \end{center} |
219 \caption{RemoteDGMからPutされた際のフロー} | |
220 \label{fig:RemotePutSequence} | |
221 \end{figure} | |
222 | |
223 | |
224 LocalまたはRemoteノードからPutコマンドが実行された際にwaitListを確認し、 | |
225 PutされたDGを待っているコマンドが存在すれば、そのコマンドは実行される。 | |
226 | |
227 | |
228 図\ref{fig:RemoteTakeSequence}はRemoteDGMにTakeを行った際の処理の流れである。 | |
229 | |
230 | |
231 \begin{figure}[htb] | |
232 \begin{center} | |
15 | 233 \includegraphics[width=160mm]{images/RemoteTakeSequence.pdf} |
14 | 234 \end{center} |
235 \caption{RemoteDGMにTakeした際のフロー} | |
236 \label{fig:RemoteTakeSequence} | |
237 \end{figure} | |
238 | |
239 プログラマはStartCGで事前にRemoteDGMを生成しておく。 | |
240 続いて、TakeFrom annotationからRemoteDGMに対するTakeコマンドが生成され実行される。 | |
241 TakeFromの様にRemoteからの応答を待つコマンドはLocalDGMではなく、RemoteDGMのwaitListに格納される。 | |
242 RemoteDGMに対するTakeコマンドはMessagePack形式に変換され、RemoteDGMが参照している別ノードのLocalDGMに送信される。 | |
243 | |
244 送信されたTakeコマンドを受け取ったLocalDGMは、要求されたDGがあればReplyコマンドを生成して送り返す。 | |
245 もしDGがなければ、Remoteから来たコマンドもLocalの場合と同様にLocalDGMのwaitListに格納される。 | |
246 | |
53 | 247 Replyコマンドを受け取るとRemoteDGMはwaitListに入っていたコマンドを解決し、待ち合わせが完了する。 |
39 | 248 |
249 | |
41 | 250 \section{Topology Manager} |
51 | 251 Topology Manager\cite{topology}とは、Christie上でのNetwork Topologyを自動的に形成する機能である。 |
41 | 252 Topologyを形成するために参加を表明したnode、TopologyNodeに名前を与え、必要があればnode同士の接続も自動で行う。 |
253 Topology ManagerのTopologyの形成方法として、静的Topologyと動的Topologyの2つがある。 | |
254 | |
255 静的Topologyはソースコード \ref{src:ringdot}のようなdot形式のファイルを与えることでnodeの関係を図\ref{fig:ringdot}のように構築できる。 | |
256 静的Topologyはdotファイルのnode数と同等のTopologyNodeがあって初めて、CGが実行される。 | |
257 | |
258 | |
259 \begin{figure}[htb] | |
260 \begin{center} | |
261 \includegraphics[width=120mm]{images/ring.pdf} | |
262 \end{center} | |
53 | 263 \caption{ソースコード \ref{src:ringdot}によるring状の接続} |
41 | 264 \label{fig:ringdot} |
265 \end{figure} | |
266 | |
267 \newpage | |
268 | |
269 \lstinputlisting[label=src:ringdot, caption=dot形式によるnode間接続の記述]{src/java/ring.dot} | |
270 | |
271 | |
272 動的Topologyは図\ref{fig:dynamicTopology}のような手順で自動的に接続が行われる。 | |
42 | 273 nodeが参加表明を行うと、Topologyを管理しているManagerからHost messageがnodeへ送信され、nodeは接続すべき親に接続を行う。 |
274 親はHostから送信されるnode infoより子nodeとの接続を行う。 | |
41 | 275 |
276 \begin{figure}[htb] | |
277 \begin{center} | |
278 \includegraphics[width=140mm]{images/DynamicTopology.pdf} | |
279 \end{center} | |
280 \caption{動的Topologyの接続手順} | |
281 \label{fig:dynamicTopology} | |
282 \end{figure} | |
283 | |
284 | |
47 | 285 現在はTree型にのみ対応しているが、Star型への対応も可能である。 |