Mercurial > hg > Papers > 2018 > nozomi-master
annotate paper/nozomi-master.tex @ 175:7e7fe5e28ba4
add presen directory
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 05 Feb 2018 17:54:31 +0900 |
parents | f0e9cc7d13f9 |
children | 055266d62d84 |
rev | line source |
---|---|
146 | 1 \documentclass[a4j,12pt]{jreport} |
2 \usepackage{master_paper} | |
3 \usepackage{ascmac} | |
4 \usepackage{bussproofs} | |
5 \usepackage[dvipdfmx]{graphicx} | |
6 \usepackage{here} | |
7 \usepackage{listings} | |
8 \usepackage{comment} | |
9 \usepackage[deluxe, multi]{otf} | |
10 \usepackage{url} | |
11 \usepackage{cite} | |
12 \usepackage{listings} | |
13 \usepackage{colonequals} | |
14 \usepackage[utf8]{inputenc} | |
15 | |
16 %\input{dummy.tex} %% font | |
17 | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
18 \jtitle{分散フレームワークChristieの設計} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
19 \etitle{Design of Distributed framework Christie} |
146 | 20 \year{2018年 3月} |
21 \eyear{March 2018} | |
22 \author{照屋 のぞみ} | |
23 \eauthor{NOZOMI TERUYA} | |
24 \chife{指導教員:教授 和田 知久} | |
25 \echife{Supervisor: Prof. Tomohisa WADA} | |
26 | |
27 \marklefthead{% 左上に挿入 | |
28 \begin{minipage}[b]{.4\textwidth} | |
29 琉球大学大学院学位論文(修士) | |
30 \end{minipage}} | |
31 | |
32 \markleftfoot{% 左下に挿入 | |
33 \begin{minipage}{.8\textwidth} | |
34 並列分散フレームワークChristieの設計 | |
35 \end{minipage}} | |
36 | |
37 \newcommand\figref[1]{図 \ref{fig:#1}} | |
38 \newcommand\tabref[1]{表 \ref{tab:#1}} | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
39 \newcommand{\tblcaption}[1]{\def\@captype{table}\caption{#1}} |
146 | 40 |
152 | 41 \lstset{% |
42 language={Java},%使用言語 | |
43 basicstyle={\small},%書体 | |
44 commentstyle={\small\itshape},%コメントの書体 | |
45 keywordstyle={\small\bfseries},%キーワードの書体 | |
46 %identifierstyle={\small},% | |
47 %ndkeywordstyle={\small},% | |
48 stringstyle={\small},%文字列の書体 | |
49 frame={trlb},%外枠 | |
50 breaklines=true,%改行 | |
51 columns=[l]{fullflexible},% | |
52 xrightmargin=0zw,% | |
53 xleftmargin=3zw,% | |
54 numbers=left,%行番号の表示 | |
55 numberstyle={\scriptsize},%行番号の書体 | |
56 numbersep=1zw,% | |
57 stepnumber=1, | |
58 lineskip=-0.5ex,% | |
59 captionpos=b,%キャプションの位置 | |
146 | 60 } |
152 | 61 |
166 | 62 \def\lstlistingname{ソースコード} |
63 \def\lstlistlistingname{ソースコード目次} | |
146 | 64 |
65 | |
66 %%% 索引のために以下の2行を追加 | |
67 \usepackage{makeidx,multicol} | |
68 \makeindex | |
69 \begin{document} | |
70 | |
71 %rome | |
72 \frontmatter | |
73 | |
74 \maketitle | |
75 \newpage | |
76 | |
77 \makecommission | |
78 | |
79 %要旨 | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
80 \input{abstract.tex} |
146 | 81 |
82 %目次 | |
83 \tableofcontents | |
84 | |
85 %図目次 | |
86 \listoffigures | |
87 | |
88 %表目次 | |
89 \listoftables | |
90 | |
91 %リスト目次 | |
92 \lstlistoflistings | |
93 | |
94 | |
95 %arabic | |
96 \mainmatter | |
97 | |
98 %chapters | |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
99 |
162 | 100 \chapter{分散フレームワークへの要求事項} |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
101 スマートフォンやタブレット端末の普及率が増加している。 |
166 | 102 それに伴いインターネット利用者数も増加しており、ネットワークサービスにはそれに対する処理能力が求められる。 |
103 サーバの処理能力を増強するアプローチとして、スケールアップとスケールアウトがある。 | |
104 スケールアップはサーバそのものを増強することで処理能力を向上させる手法であり、スケールアウトは複数のサーバを接続することで処理能力を上げる手法である。 | |
105 スケールアウトは安価なサーバで実現でき、サーバが故障しても別のサーバでカバーできるため、システムを安定運用させやすく、現代のネットワークサービスの要求に合っていると言える。 | |
106 | |
107 スケールアウトのように複数のサーバで処理をまたぐ場合、サーバには分散プログラムが必要になる。 | |
108 分散プログラムとは、プログラムの個々の部分が複数のノード上で並列に実行され、各ノードがネットワークを介して互いに通信を行いながら全体の処理を進行する計算手法のことである。 | |
109 安定したネットワークサービスを提供するためには、分散プログラムに信頼性とスケーラビリティが要求される。 | |
162 | 110 |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
111 ここでいう信頼性とは、定められた環境下で安定して仕様に従った動作を行うことを指す。 |
162 | 112 これには仕様を記述しやすさも含まれ、可読性が高いほどバグを抑えた信頼性が高いと言える。 |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
113 またスケーラビリティーとは、分散ソフトウェアに対して単純にノードを追加するだけで性能を線形的に上昇させることができる性質である。 |
162 | 114 |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
115 しかし、これらをもつ分散プログラムをユーザーが一から記述することは容易ではない。 |
162 | 116 なぜなら、並列で動く分散した資源を意識しながら記述するのは容易ではなく、また、どのように分散したノードの選択を行えば良いのか明確ではないからである。 |
117 | |
174 | 118 分散プログラムには以下の3つの要素がある\cite{Framework}。 |
166 | 119 \begin{itemize} |
120 \item {ノード内の計算} | |
121 \end{itemize} | |
122 | |
123 \begin{itemize} | |
124 \item {ノード間通信} | |
125 \end{itemize} | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
126 |
166 | 127 \begin{itemize} |
128 \item {地理的に分散したノード} | |
129 \end{itemize} | |
130 | |
131 ノード内の計算には通信プロトコルやデータベースが含まれる。 | |
132 またノード間通信には、トポロジーの構成や通信の信頼性や速度、データの転送やデータの圧縮などの要素がある。 | |
133 | |
134 これらの要素をサポートするのが分散フレームワークである。 | |
135 すなわち分散フレームワークには、プロトコルの定義、それによってアクセスされるデータベース、トポロジーの決定いった分散アルゴリズムや、信頼性と拡張性の高い通信の提供が求められる。 | |
136 | |
137 本章では、これらの項目別に分けて、分散フレームワークであるAkka\cite{Akka}、Hazelcast\cite{Hazelcast}と当研究室で開発したAlice\cite{Alice1}\cite{Alice2}を比較し、本論文で設計するChristieの設計目標を述べる。 | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
138 |
166 | 139 AkkaはScalaおよびJava向けのオープンソースの並列分散処理フレームワークであり、HazelcastはHazelcast社が開発したJava向けのオープンソースインメモリデータグリッドである。 |
140 | |
169 | 141 \section{従来の分散フレームワーク} |
166 | 142 Akkaではアクターモデルという、アクターと呼ばれるオブジェクト同士が並列で非同期メッセージを送受信するモデルを採用している。 |
143 アクターは固有のアドレス持っており、ローカルのアクターにもリモートのアクターにも同じようにアドレスを指定することでメッセージを送りあえるというプロトコルになっている。 | |
144 アクターはそれぞれメールボックスというキューを持っており、メールボックスに受け取ったメッセージをパターンマッチで順次処理していく。 | |
145 このパターンマッチにはScalaのcase classを用いられる。 | |
169 | 146 case classとは、データ構造とデータ型名を同時に持つことができ、その両方を一括してパターンマッチさせることができるクラスである。 |
147 メッセージをcase classで記述することにより、異なるメッセージをメールボックス上で使用することがきる。 | |
162 | 148 |
166 | 149 Hazelcastは、キーと値の1対1でデータを管理するインメモリ・データグリッドである。 |
150 インメモリ・データグリッドとは、複数のノードに分散させたデータを、アプリケーション側からは仮想的な1つのメモリ空間に置かれているように見せるモデルである。 | |
151 そのため、プログラマがサーバを意識せずに共有のタプルスペースに対してデータをget/putできるプロトコルとなっている。 | |
152 共有のタプルスペースに書き込むとそれに接続しているノードにデータを行き渡らせる、マルチキャストベースの通信を採用している。 | |
162 | 153 |
166 | 154 Aliceは、タスクをCode Segment、データをData Segmentという単位で記述し、Code SegmentはインプットとなるData Segmentが全て揃うと並列に実行される。 |
155 Data Segmentは対になるkeyが存在し、Data Segment Managerというノードごとに存在する独自のデータベースによって管理されている。 | |
156 各ノードにはラベル付きのプロキシであるRemote Data Segment Managerを立て、ラベルとkeyを指定してデータをtake/putするプロトコルとなっている。 | |
157 | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
158 \newpage |
174 | 159 記述の面において、Akkaでは基本的にメッセージをFIFO的に処理するため、複数のインプットを待ち合わせる場合は、待ち合わせの処理をプログラマが各必要があった。 |
160 しかしAliceは複数のインプットを1箇所に記述するるため、そのような煩雑さがない。 | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
161 |
166 | 162 プロトコルの設計方針において、AkkaやHazelcastは分散通信の複雜さを抽象度を高めることで隠す方針であるため、ロケーション透過性が高く、プログラマからは処理の流れを把握しにくくなっていた。 |
174 | 163 一方でAliceでは明示的に分散性を意識する代わりに、計算を通常計算とそれを支えるメタ計算として分離することで記述の複雑さを回避している。 |
164 これにより処理の流れを明確にし、分散計算のチューニングをしやすくしている。 | |
162 | 165 |
174 | 166 また、Aliceの分散ノード間の通信はラベルを用いてリモートノードを選択することによって指定する。 |
167 これはAkkaで送り先をドメインで指定しているのと同様である。 | |
168 Aliceではラベルの命名をToplogy Managerによって自動的に指定することもできる。 | |
146 | 169 |
162 | 170 |
166 | 171 \section{トポロジーの構成} |
162 | 172 AkkaではAkka Streamという機能で処理の流れが記述できる。 |
173 N入力1出力、1入力N出力、出力のみ、などが用意されたJunctionsと呼ばれる要素をつなぎ合わせることでトポロジーを記述する。 | |
146 | 174 |
162 | 175 HazelcastにはMapやQueueといったメモリ空間内のデータ構造は指定できるが、具体的なノード間トポロジーを記述する機構がない。 |
166 | 176 |
177 AliceではTopologyManagerという機構が分散ノードを管理しており、静的・動的なトポロジーを自動構成する。静的トポロジーではプログラマがトポロジーを図として記述できるため、より分かりやすく詳細な設定ができる。 | |
178 | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
179 \newpage |
166 | 180 |
181 \section{信頼性・拡張性の高い通信の提供} | |
182 ここでは信頼性・拡張性の高い通信の指標として、障害耐性、圧縮・転送通信、NAT越えについてを比較する。 | |
162 | 183 |
166 | 184 \subsection*{障害耐性} |
169 | 185 分散プログラムでは、1つのノードがダウンしてもシステム全体は動き続けなければならないため、フォールト・トレラントであることが重要である。 |
166 | 186 |
187 Akkaでは親子関係を構成でき、親アクターは子アクターを監視し障害が起こった際に再起動や終了といった処理を指定できる。 | |
162 | 188 |
169 | 189 また、Hazelcastは、1つのサーバで障害が起きても他のサーバがデータを共有しているため、データを失うことなく素早く復旧ができる。 |
166 | 190 |
191 Aliceでは、TopologyManager内にKeepAliveという機能があり、常にノードが生きているかHeartbeatを送信して監視しており、どこかのノードに障害が起こればトポロジーを再構成するといった対応ができる。 | |
192 | |
160 | 193 |
166 | 194 \subsection*{圧縮・転送通信} |
169 | 195 ノード間通信でサービスに沿った柔軟な通信をするためには、送信するデータを圧縮する機能や、受け取ったデータをそのままほかノードへ転送する機能が求められることがある。 |
166 | 196 |
169 | 197 データの圧縮を指定したい場合、Akka、Hazelcastはシリアライザが用意されているため、そのメソッドを呼び出すことで圧縮伸長を行う。 |
166 | 198 また、転送を指定したい場合、Akkaにはforwardメソッドがあるためそれを呼び出すことで受け取ったデータの転送が可能だが、Hazelcastは一つのMapへのアクセスに見立てているため、転送にもputを用いる。 |
199 | |
200 一方でAliceは圧縮の展開と転送を同時に行うことを想定した圧縮・転送機能を持っている。 | |
162 | 201 Data Segment内に圧縮と非圧縮の両形式を同時に持てるため、受け取った圧縮データを展開をしながら圧縮したまま別ノードに転送することができる。 |
166 | 202 また、圧縮するには送信する宛先ラベルに"compressed"とつけるだけでよく、データ取得時に自動で展開もされるため、プログラマがメソッドの呼び出しを追加する必要がなく圧縮・非圧縮を簡単に切り替えられる。 |
162 | 203 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
204 \newpage |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
205 |
166 | 206 \subsection*{NAT越え} |
207 ネットワーク間通信の大きな問題の一つに、NATがある。 | |
208 NATとは、WANとLANの間にあるIPアドレスの変換機構である。 | |
209 NATを隔てたプライベートネットワーク内では、LAN内だけでユニークなプライベートIPアドレスを持っており、WAN側からはそのIPアドレスを直接指定してアクセスできないためアドレス変換を行う必要がある。 | |
210 そのためNATを越えたノード間通信は容易ではなく、分散フレームワークでそれをサポートできることが望ましい。 | |
211 | |
212 しかしHazelcastではNAT越えをサポートする機能がなく、プログラマが自前で書かなければならない。 | |
162 | 213 Akkaではノードの設定にグローバルアドレスとプライベートアドレスを両方登録することでNATを越えた通信を可能にする。 |
214 AliceにNAT越えの機能はないが、TopologyManagerが各ノードのData Segment Managerと通信してトポロジー管理をしており、TopologyManager/Data Segment Managerを複数立ち上げることによりプライベートトポロジーとグローバルトポロジーの同時構成が可能だと考えた。 | |
215 しかし、Aliceが複数のData Segment Managerを持てない実装だったため、AliceのままでNAT越えを実装することは困難であると判明した。 | |
216 よりスケーラブルな分散環境を提供するためにも、Aliceを再設計する必要がある。 | |
160 | 217 |
218 | |
219 | |
146 | 220 \chapter{分散フレームワークAliceの概要} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
221 |
169 | 222 AliceではCode Segment(以下CS)とData Segment(以下DS)の依存関係を記述することでプログラミングを行う。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
223 CSは実行に必要なDSが全て揃うと実行される。CSを実行するために必要な入力されるDSのことをInputDS、CSが計算を行った後に出力されるDSのことをOutput DSと呼ぶ。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
224 |
169 | 225 \section{CodeSegmentとDataSegment} |
226 | |
227 データの依存関係にないCSは並列実行が可能である(図 \ref{fig:CS})。 | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
228 CSの実行においてDSが他のCSから変更を受けることはない。そのためAliceではデータが他から変更され整合性がとれなくなることはない。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
229 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
230 \begin{figure}[htbp] |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
231 \begin{center} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
232 \includegraphics{images/dsandcs2.pdf} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
233 \end{center} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
234 \caption{CodeSegmentの依存関係 } |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
235 \label{fig:CS} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
236 \end{figure} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
237 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
238 \newpage |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
239 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
240 AliceはJavaで実装されており、DSはJava Objectに相当する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
241 CSはRunnableなObject(void run()を持つObject)に相当する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
242 プログラマがCSを記述する際は、CodeSegmentクラスを継承する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
243 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
244 DSは数値や文字列などの基本的なデータの集まりを指し、Aliceが内部にもつデータベースによって管理されている。このデータベースをAliceではDS Managerと呼ぶ。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
245 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
246 CSは複数のDS Managerを持っている。DSには対になるString型のkeyが存在し、それぞれのManagerにkeyを指定してDSにアクセスする。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
247 一つのkeyに対して複数のDSをputするとFIFO的に処理される。なのでData Segment Managerは通常のデータベースとは異なる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
248 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
249 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
250 |
146 | 251 \section{DataSegmentManager} |
174 | 252 DS Manager(以下DSM)にはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
253 |
174 | 254 Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:Remote DSM} )。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
255 他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
256 |
162 | 257 \newpage |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
258 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
259 \begin{figure}[h] |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
260 \begin{center} |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
261 \includegraphics[width=150mm]{images/remote_datasegment.pdf} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
262 \end{center} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
263 \caption{Remote DSMは他のノードのLocal DSMのproxy } |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
264 \label{fig:Remote DSM} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
265 \end{figure} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
266 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
267 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
268 Remote DSMを立ち上げるには、DataSegmentクラスが提供するconnectメソッドを用いる。 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
269 接続したいノードのipアドレスとport番号、そして任意のManager名を指定することで立ちあげられる。 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
270 その後はManager名を指定してData Segment APIを用いてDSのやり取りを行うため、プログラマはManager名さえ |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
271 意識すればLocalへの操作もRemoteへの操作も同じ様に扱える。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
272 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
273 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
274 \newpage |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
275 |
146 | 276 \section{Data Segment API} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
277 DSの保存・取得にはAliceが提供するAPIを用いる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
278 putとupdate、flipはOutput DS APIと呼ばれ、DSをDSMに保存する際に用いる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
279 peekとtakeはInput DS APIと呼ばれ、DSをDSMから取得する際に使用する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
280 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
281 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
282 \item {\ttfamily void put(String managerKey, String key, Object val)} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
283 \end{itemize} |
161
cc301066b983
add chapter1 mindmap
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
160
diff
changeset
|
284 putとupdate、flipはOutput DS APIと呼ばれ、DSをDSMに保存する際に用いる。 |
cc301066b983
add chapter1 mindmap
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
160
diff
changeset
|
285 peekとtakeはInput DS APIと呼ばれ、DSをDSMから取得する際に使用する。 |
cc301066b983
add chapter1 mindmap
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
160
diff
changeset
|
286 |
cc301066b983
add chapter1 mindmap
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
160
diff
changeset
|
287 \begin{itemize} |
cc301066b983
add chapter1 mindmap
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
160
diff
changeset
|
288 \item {\ttfamily void put(String managerKey, String key, Object val)} |
cc301066b983
add chapter1 mindmap
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
160
diff
changeset
|
289 \end{itemize} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
290 DSをDSMに追加するためのAPIである。第一引数はLocal DSMかRemote DSMかといったManager名を指定する。そし |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
291 て第二引数で指定されたkeyに対応するDSとして第三引数の値を追加する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
292 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
293 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
294 \item {\ttfamily void update(String managerKey, String key, Object val)} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
295 \end{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
296 updateもDSをDSMに追加するためのAPIである。putとの違いは、queueの先頭のDSを削除してからDSを追加するこ |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
297 とである。そのためAPI実行前後でqueueの中にあるDSの個数は変わらない。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
298 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
299 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
300 \item{\ttfamily void flip(String managerKey, String key, Receiver val)} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
301 \end{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
302 flipはDSの転送用のAPIである。取得したDSに対して何もせずに別のKeyに対し保存を行いたい場合、一旦値を取 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
303 り出すのは無駄である。flipはDSを受け取った形式のまま転送するため無駄なコピーなくDSの保存ができる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
304 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
305 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
306 \item {\ttfamily void take(String managerKey, String key)} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
307 \end{itemize} |
174 | 308 takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。要求したDSが存在しなければ、CSの待ち合わせ (Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
309 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
310 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
311 \item {\ttfamily void peek(String managerKey, String key)} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
312 \end{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
313 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
314 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
315 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
316 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
317 \newpage |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
318 |
146 | 319 \section{CodeSegmentの記述方法} |
174 | 320 CSをユーザーが記述する際にはCodeSegmentクラスを継承して記述する(ソースコード \ref{src:StartCodeSegment} , \ref{src:CodeSegment})。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
321 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
322 継承することによりCode Segmentで使用するData Segment APIを利用する事ができる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
323 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
324 Alice には、Start CS (ソースコード \ref{src:StartCodeSegment} )というC の main に相当するような最初に |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
325 実行される CS がある。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
326 Start CSはどのDSにも依存しない。つまりInput DSを持たない。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
327 このCSをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
328 |
152 | 329 |
330 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} | |
331 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java} | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
332 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
333 \newpage |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
334 |
174 | 335 ソースコード \ref{src:StartCodeSegment} は、5行目で次に実行させたいCS(ソースコード \ref{src:CodeSegment} )を作成している。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
336 8行目でOutput DS APIを通してLocal DSMに対してDSをputしている。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
337 Output DS APIはCSの{\tt ods}というフィールドを用いてアクセスする。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
338 {\tt ods}は{\tt put}と{\tt update}と{\tt flip}を実行することができる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
339 TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でputが行われるとTestCodeSegmentは実 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
340 行される。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
341 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
342 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
343 CSのInput DSは、CSの作成時に指定する必要がある。指定はCommandType(PEEKかTAKE)、DSM名、そしてkey よっ |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
344 て行われる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
345 Input DS API はCSの{\tt ids}というフィールドを用いてアクセスする。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
346 Output DSは、{\tt ods}が提供するput/update/flipメソッドをそのまま呼べばよかったが、Input DSの場合{\tt ids}にpeek/takeメソッドはなく、create/setKeyメソッド内でCommandTypeを指定して実行する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
347 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
348 ソースコード\ref{src:CodeSegment}は、0から9までインクリメントする例題である。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
349 2行目では、Input DS APIがもつcreateメソッドでInput DSを格納する受け皿(Receiver)を作っている。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
350 引数には{\tt PEEK}または{\tt TAKE}を指定する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
351 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
352 \item {\ttfamily Receiver create(CommandType type)} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
353 \end{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
354 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
355 4行目から6行目はコンストラクタである。コンストラクタはオブジェクト指向のプログラミング言語で新たなオ |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
356 ブジェクトを生成する際に呼び出されて内容の初期化を行う関数である。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
357 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
358 TestCodeSegmentのコンストラクタが呼ばれた際には、 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
359 \begin{enumerate} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
360 \item CSが持つフィールド変数 {\tt Receiver input}に{\tt ids.create(CommandType.TAKE)}が行われ、{\tt input}が初期化される。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
361 \item 5行目にあるTestCodeSegmentのコンストラクタのTAKEが実行される。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
362 \end{enumerate} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
363 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
364 5行目は、2行目のcreateで作られたReceiverが提供するsetKeyメソッドを用いてLocal DSMからDSを取得している。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
365 \begin{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
366 \item \verb+void setKey(String managerKey, String key)+ |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
367 \end{itemize} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
368 setKeyメソッドはpeek/takeの実行を行う。どのDSMのどのkeyに対してpeekまたはtakeコマンドを実行させるかを指定できる。コマンドの結果がレスポンスとして届き次第CSは実行される。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
369 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
370 \newpage |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
371 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
372 実行されるrunメソッドの内容は |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
373 \begin{enumerate} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
374 \item 10行目で取得されたDSをInteger型に変換してcountに代入する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
375 \item 12行目でcountをインクリメントする。 |
160 | 376 \item 16行目で次に実行されるCSを作る。run内の処理を終えたらCSは破棄されるため、処理を繰り返したい場合はこのように新しいくCSを作る必要がある。この時点で次のCSはInput DSの待ち状態に入る。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
377 \item 17行目でcountをLocal DSMにputする。Input DSが揃い待ち状態が解決されたため、次のCSが実行される。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
378 \item 13行目が終了条件であり、countの値が10になれば終了する。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
379 \end{enumerate} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
380 となっている。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
381 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
382 1.で用いられているasInteger()はasClassメソッドの一部であり、asClassはtake/peekで取得したDSをObject型から任意の型で取得するためのAPIである。 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
383 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
384 \begin{itemize} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
385 \item {\ttfamily <T> T asClass(Class<T> clazz)} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
386 \end{itemize} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
387 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
388 CS内でDSのデータを扱うには、正しい型を意識しながらこのasClassメソッドを使わなければならない。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
389 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
390 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
391 \newpage |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
392 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
393 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
394 \section{AliceのMeta Computation} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
395 Aliceでは、処理をComputationとMeta Computationに階層化し、コアな仕様と複雑な例外処理に分離する。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
396 AliceのComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理と捉えられる。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
397 それに対して、AliceのMeta Computation は、Remoteノードとの通信トポロジーの構成や、通信するデータ形式の変換と言える。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
398 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
399 Aliceの機能を追加するということはプログラマ側が使うMeta Computationを追加すると言い換えられる。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
400 AliceではMeta Computationとして分散環境の構築等の機能を提供するため、プログラマはCSを記述する際にトポロジー構成や切断、再接続という状況を予め想定した処理にする必要はない。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
401 プログラマは目的の処理だけ記述し、切断や再接続が起こった場合の処理をMeta Computationとして指定するだけでよい。 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
402 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
403 このようにプログラムすることで、通常処理と例外処理を分離することができるため、仕様の変更を抑えたシンプルなプログラムを記述できる。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
404 仕様の変更を抑えてプログラムの拡張ができるということは、コードを破壊しないため変更以前の信頼性を保てるということである。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
405 |
159
cad92fc74613
change SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
158
diff
changeset
|
406 Meta ComputationもCS/DSで作られており、プログラマ側から見えないこれらのCS/DSはMeta CS/Meta DSと呼ばれる。 |
cad92fc74613
change SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
158
diff
changeset
|
407 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
408 現在Aliceには、データの圧縮機能、トポロジーの構成・管理機能、ノードの生存確認機能、ノードの切断・再接続時の処理管理機能などのMeta Computationが用意されている。 |
174 | 409 これらの有用性は水族館の例題\cite{Aquarium}やTreeVNCの例題\cite{TreeVNC}\cite{AliceVNC}によって示された。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
410 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
411 \newpage |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
412 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
413 \subsection{Aliceの圧縮機能} |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
414 リモートノードに大きなデータを送るために、データを圧縮したい場合がある。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
415 そこで、Aliceは圧縮をサポートしている。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
416 しかし、単に圧縮のメソッドを用意したわけではない。 |
174 | 417 圧縮データの展開と、圧縮したまま別ノードへの転送を同時に実現したい場合があるため、Meta CSを介すことでDSに圧縮と非圧縮のデータを同時に持てるようにしている(図\ref{fig:compress})。 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
418 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
419 \begin{figure}[h] |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
420 \begin{center} |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
421 \includegraphics[width=160mm]{images/compress.pdf} |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
422 \end{center} |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
423 \caption{DSが圧縮と非圧縮の両方を持つ} |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
424 \label{fig:compress} |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
425 \end{figure} |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
426 |
159
cad92fc74613
change SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
158
diff
changeset
|
427 1つのDS内にMeta DSとして以下の3つの表現を持たせることでデータに多態性を持たせ、必要に応じた形式でDSを扱う。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
428 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
429 \begin{enumerate} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
430 \item 一般的なJavaのクラスオブジェクト |
174 | 431 \item MessagePack for Java\cite{MessagePack}でシリアライズ化されたバイナリオブジェクト |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
432 \item 2を圧縮したバイナリオブジェクト |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
433 \end{enumerate} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
434 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
435 Local DSMにputされた場合は、(1)の一般的なJavaクラスオブジェクトとして追加される。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
436 Remote DSMにputされた場合は、通信時に(2)のbyteArrayに変換されたバイナリオブジェクトに変換されたDSが追加 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
437 される。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
438 Local/Remote DSMにDSを圧縮して保存したい場合は(3)の圧縮形式を用いる。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
439 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
440 \newpage |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
441 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
442 データの圧縮を指定するには、putするDSMの名前の前に"compressed"をつけるだけでよい。 |
174 | 443 ソースコード\ref{src:before},\ref{src:after}は通常のDSと圧縮のDSを扱う際の記述の例である。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
444 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
445 \lstinputlisting[label=src:before, caption=通常のDSを扱うCSの例]{source/beforeCompress.java} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
446 \lstinputlisting[label=src:after,caption=圧縮したDSを扱うCSの例]{source/afterCompress.java} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
447 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
448 このようにコードの変更を抑えて圧縮できるため、他の計算部分を変えずにデータ形式が指定できる。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
449 また、DSを取り出す際もasClass()内部で自動で展開が行われるため、コードの変更がなく、プログラマがデータの展開を考える必要がない。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
450 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
451 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
452 \subsection{TopologyManager} |
150 | 453 Aliceでは、ノード間の接続管理やトポロジーの構成管理を、Topology ManagerとTopology NodeというMeta Computationが提供している。 |
454 プログラマはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。 | |
174 | 455 トポロジーファイルはDOT Language\cite{dot}という言語で記述される。 |
456 DOT Languageとは、プレーンテキストを用いてデータ構造としてのグラフを表現するためのデータ記述言語の一つである。 | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
457 ソースコード\ref{src:topologyfile}は3台のノードでリングトポロジーを組むときのトポロジーファイルの例である。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
458 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
459 \lstinputlisting[label=src:topologyfile, caption=トポロジーファイルの例]{source/TopologyFile.dot} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
460 DOT Languageファイルはdotコマンドを用いてグラフの画像ファイルを生成することができる。そのため、記述したトポロジーが正しいか可視化することが可能である。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
461 |
174 | 462 Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきクライアントのIPアドレスやポート番号、接続名を送る(図\ref{fig:topologymanager})。 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
463 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
464 \newpage |
150 | 465 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
466 \begin{figure}[h] |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
467 \begin{center} |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
468 \includegraphics[width=80mm]{images/topologymanager.pdf} |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
469 \end{center} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
470 \caption{Topology Managerが記述に従いトポロジーを構成} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
471 \label{fig:topologymanager} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
472 \end{figure} |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
473 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
474 トポロジーファイルでlavelとして指定した名前はRemote DSMの名前としてTopology Nodeに渡される。 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
475 そのため、Topology NodeはTopology ManagerのIPアドレスさえ知っていれば自分の接続すべきノードのデータを受け取り、ノード間での正しい接続を実現できる。 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
476 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
477 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
478 また、実際の分散アプリケーションでは参加するノードの数が予め決まっているとは限らない。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
479 そのためTopology Managerは動的トポロジーにも対応している。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
480 トポロジーの種類を選択してTopology Managerを立ち上げれば、あとは新しいTopology Nodeが参加表明するたびに、Topology ManagerからTopology Nodeに対して接続すべきTopology Nodeの情報がput |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
481 され接続処理が順次行われる。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
482 そしてTopology Managerが持つトポロジー情報が更新される。 |
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
483 現在Topology Managerでは動的なトポロジータイプとして二分木に対応している。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
484 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
485 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
486 |
146 | 487 \chapter{Aliceの問題点} |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
488 Aliceを拡張していく中でいくつかの問題点が明らかになり、これらを解決するにはAlice自体を再設計する必要があるとわかった。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
489 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
490 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
491 \section{APIの記述の分離} |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
492 2.4で示したように、InputDSを記述するには、一度フィールドでReceiverをcreateして、その後Reveiverに対してsetKeyで待ち合わせるkeyを指定しなければならない。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
493 このようにインプットの処理が分離されてしまっていては、記述が煩雑な上にコードを読んだ際にどのkeyに対して待ち合わせを行っているのか直感的に分からない。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
494 |
174 | 495 さらに、setKeyは明確な記述場所が決まっていないため、そのDSを待ち合わせているCS以外からも呼び出せてしまう(ソースコード\ref{src:StartSetKey)})。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
496 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
497 \lstinputlisting[label=src:StartSetKey, caption=setKeyを外部から呼び出す例]{source/StartSetKey.java} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
498 \lstinputlisting[label=src:SetKey]{source/SetKey.java} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
499 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
500 このような書き方をされると、CSだけを見てどのkeyに対して待ち合わせを行っているのかわからないため、setKeyを呼び出しているコードを辿る必要がある。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
501 これでは見通しが悪いため、どこでkeyを指定するのか明確にすべきである。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
502 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
503 可読性の低いコードはプログラマの負担となるため、CSが何を待ち合わせているのかそのCSを見ただけで理解できるように記述の分離問題を改善しなくてはならない。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
504 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
505 |
156 | 506 \section{setKeyは最後に呼ばなければならない} |
507 setKeyメソッドをコンストラクタで呼ぶ際、setKeyメソッドを必ず最後に呼ばなければならない。 | |
508 | |
509 CSは内部で実行に必要なDSを数えている。DSの取得に成功するとこの値が、デクリメントされ、0になると必要なDSが全て揃ったことと判断されThread poolへ送られる。 | |
510 | |
511 setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。 | |
512 | |
513 \lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java} | |
514 | |
174 | 515 ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にDSの取得数を決めようとしている。 |
516 しかし、setKeyが最初に呼ばれた際に、DSの取得に成功すると実行可能と判断されてしまう。 | |
517 runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。 | |
518 この問題もインプットAPIの記述の分離により引き起こされるエラーである。 | |
156 | 519 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
520 \newpage |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
521 |
156 | 522 今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。 |
523 | |
524 \lstinputlisting[label=src:success,caption=NullPointerExceptionにならない記述]{source/ShowData.java} | |
525 | |
526 このように記述の順序を考えながらプログラミングしなければならない設計では、バグを引き起こし信頼性を損なうことに繋がる。より自然に扱えるAPI設計にするべきだと考える。 | |
527 | |
528 | |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
529 \section{動的なsetKey} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
530 setKeyはCSのコンストラクタで指定することが多い。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
531 このとき、指定するkeyは引数などから動的に受け取り、セットすることができる。 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
532 しかし、それでは実際にどんな処理が行われているのかわかりづらく、また、putする部分などの該当するkeyを扱う全てコードを変更しなければならない。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
533 このように、AliceではCSを使いまわすことを考慮して動的なsetKeyを可能にしてしまったせいで、慎重に書かなければプログラムの信頼性が保てないようになってしまっている。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
534 そのため、動的なsetKeyはできないように制限し、コードの見通しを良くする必要がある。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
535 CSに対してインプットとなるkeyが静的に決まれば、待ち合わせているkeyに対してのputのし忘れなどの問題をコンパイル時のモデル検査などで発見することができると考えられる。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
536 |
150 | 537 \section{型が推測できない} |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
538 inputDSを受け取るReceiverはデータをObject型で持っており、そのデータをCS内で扱うには正しい型にキャストする必要がある。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
539 しかし、inputDSで指定するのはkeyのみであり、そのデータの型までは分からない。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
540 そのため、DSの型を知るにはputしている部分まで辿る必要がある。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
541 辿ってもflipされている可能性もあるため、最初にそのDSをputしている部分を見つけるのは困難である。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
542 従って、待ち合わせているkeyにどのような型のデータが対応しているのかをそのCSを見ただけで分かるようにするべきと考える。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
543 |
156 | 544 \newpage |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
545 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
546 \section{key名と変数名の不一致} |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
547 2.4のCodeSegmentの例題である通り、key名とそのkeyで待ち合わせたDSを受け取るReceiver名は異なることがある。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
548 もしプログラマが適当に命名してしまえば後々混乱を招くため、待ち合わせるkey名とinput DS の変数名一致を強制させたい。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
549 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
550 |
164 | 551 \section{DataSegmentの型の明瞭性} |
152 | 552 2.5.1で示したように、Aliceに圧縮のMeta Computationを実装した際、DS内に複数の型を同時に持たせるようにした。 |
553 | |
554 | |
555 しかしこれでは、DSが今どの形式を持っているのか、どの状態にあるのかがわかりづらい。 | |
556 また、DSがbyteArray型を受け取った場合、データであるObject型として渡されたものなのか、MessagePackや圧縮で変換されたものなのかを判別する処理を入れなければならなかった。 | |
557 今後DSにより多様な形式を同時に持たせることになれば、さらにその判別の処理が増えることになる。 | |
558 | |
559 | |
560 Alice自体の拡張・デバッグをしやすくするためにも、DSがどの型を持っているのかをひと目で分かるようにしたい。 | |
561 | |
562 | |
150 | 563 \section{LocalDataSegmentManagerを複数持てない} |
564 Aliceでは1つのノードにつき1つしかLocalDSMを立ち上げられない作りになっている。 | |
565 そのために以下のような問題が発生した。 | |
566 | |
567 \subsection{1つのノードで複数台DSM同士のテストが行えない} | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
568 当研究室では分散データベースJungle\cite{Jungle}を開発しており、その分散通信部分にはAliceが用いられている。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
569 Jungleのような分散アプリケーションの開発では、1つのマシン上で複数の疑似ノードを立ててテストを行いたい場合があった。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
570 しかし、Aliceでは一つのアプリケーション内にLocalDSMは一つと決まっていたため、テストに必要なノード数分だけアプリケーションを別で立ち上げなければならないという手間があった。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
571 このためのシェルスクリプトをプログラマが書かなければならないのは本質的な作業ではない。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
572 より気軽にテストができるよう、同一プログラム内でLocalDSMを複数立ち上げられるようにすべきだと考えた。 |
150 | 573 |
574 \subsection{TopologyManagerの拡張が困難} | |
174 | 575 Aliceではより自由度の高い通信を行うために、TopologyManagerに幾つかの機能を追加すること考えていた\cite{OverNAT}。 |
150 | 576 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
577 その一つがNAT越えの機能である。NAT越えは分散アプリケーション構築における課題の1つでもあるが、プログラマにとってその実装は容易ではない。Topology ManagerにNATを越えたノード間通信機能をつけることにより、ネットワークを気にせずに通信が行えるようにしたい。 |
152 | 578 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
579 図 \ref{fig:nat}はTopologyManagerを用いてNAT越えをするための設計である。 |
152 | 580 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
581 \begin{figure}[h] |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
582 \begin{center} |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
583 \includegraphics[width=180mm]{images/nat.pdf} |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
584 \end{center} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
585 \caption{複数のTopologyManagerによるNAT越えの実現} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
586 \label{fig:nat} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
587 \end{figure} |
156 | 588 \newpage |
152 | 589 |
150 | 590 また、別トポロジーで立ち上げたアプリケーション同士を接続する機能も追加したいと考えていた。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
591 TreeTopologyのVNCアプリとStarTopologyのチャットアプリを連携したいという要望が生まれたためである。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
592 別トポロジーのアプリケーションが接続可能になれば、VNC画面のスナップショットをChat上に載せたり、VNC上にChatの内容をコメントとして流すといった拡張が容易になる(図 \ref{fig:vncandchat})。 |
150 | 593 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
594 \begin{figure}[h] |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
595 \begin{center} |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
596 \includegraphics[width=180mm]{images/vncandchat.pdf} |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
597 \end{center} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
598 \caption{別トポロジーのアプリケーションの接続} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
599 \label{fig:vncandchat} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
600 \end{figure} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
601 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
602 TopologyManagerはネットワークごと、トポロジーごとに存在するため、いずれの機能も複数のTopologyManagerを立ち上げ、連携させることで実現可能となる。 |
150 | 603 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
604 今までのAliceでは、1つのノードに対してTopology Managerは1つと決められていた。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
605 Topology Managerと各ノードのやり取りをするのは、ノードごとに実行されるTopology NodeというMeta Computationである。 |
174 | 606 Topology Managerは接続されたnodeの情報(nodeNameとIPアドレスのHashMap)を"nodeTable"というKeyに対応するDSとして保存している。 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
607 そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
608 つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
609 1つのノードに複数のTopologyManagerを対応させるには、TopologyNodeが複数のnodeNameを持つ必要がある。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
610 TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 |
150 | 611 |
152 | 612 |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
613 そこで、Meta Computationとして、通常のLocal DSMとは別にTopology ManagerごとのMeta Local DSMを立ち上げる方法が考えられる(図 \ref{fig:somehostname})。 |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
614 \begin{figure}[h] |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
615 \begin{center} |
156 | 616 \includegraphics[width=120mm]{images/somehostname.pdf} |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
617 \end{center} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
618 \caption{複数のTopologyManagerに複数のLocalDSMが対応} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
619 \label{fig:somehostname} |
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
620 \end{figure} |
150 | 621 |
156 | 622 \newpage |
623 | |
150 | 624 それぞれのTopology Managerに対応するLocalDSMを作り、それぞれに対応したnodeNameを格納することで、DSMを切り替えるだけでTopologyNodeの仕様は変えずに複数のTopology Managerに対応できるという設計である。 |
625 | |
151
3c425e8911cf
add Topology image
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
150
diff
changeset
|
626 しかし、現在のAliceのコードではDSMを管理するclassがstatic classであったため、複数のLocal DSMを持つことはできなかった。 |
150 | 627 staticを取り除こうとしたところ、Aliceの大部分のコードを修正する必要があることがわかった。 |
628 よって、再設計の際にはstatic classのない実装を行い、DSM切り替えによる方式を実現したい。 | |
146 | 629 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
630 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
631 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
632 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
633 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
634 |
146 | 635 \chapter{分散フレームワークChristieの設計} |
156 | 636 |
637 \section{Christieの必要条件} | |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
638 3章でのAliceの問題点を踏まえ、新たにフレームワークを作り直すべきだと考えた。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
639 本章では、新たに作った分散フレームワークChristieの設計を説明する。 |
156 | 640 Christieに必要な要件は以下のように考える。 |
641 | |
642 \begin{itemize} | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
643 \item {\ttfamily create/setKeyのような煩雑なAPIをシンプルにし可読性を向上させる} |
156 | 644 \end{itemize} |
645 | |
646 \begin{itemize} | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
647 \item {\ttfamily プログラマが型を推測しなくとも整合性がとれるように型を解決し、信頼性を向上させる} |
156 | 648 \end{itemize} |
649 | |
650 \begin{itemize} | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
651 \item {\ttfamily staticなLocalDSMをなくし、複数のインスタンスを同時に立ち上げられるようにすることでスケーラビリティを向上させる} |
156 | 652 \end{itemize} |
653 | |
654 | |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
655 |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
656 \section{Christieの基本設計} |
152 | 657 基本的にはAliceと同じ、タスクとデータを細かい単位に分割して依存関係を記述し、入力が揃った順から並列実行するというプログラミング手法を用いる。 |
658 | |
659 | |
660 ChristieはAliceと同じくJavaで書かれている。 | |
174 | 661 しかし将来的に当研究室が開発するGearsOS\cite{GearsOS}に取り入れたいため、GearsOSを構成する言語であるContinuation based C(CbC)に互換可能な設計を目指す。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
662 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
663 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
664 GearsOSではCodeSegment/DataSegmentと同様の概念としてCodeGear/DataGearという名称を用いているため、Christieでもそれに倣いCodeGear/DataGear(以下、CG/DG)と呼ぶこととする。 |
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
665 |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
666 \newpage |
152 | 667 |
174 | 668 DGはAliceと同様にDataGearManager(以下DGM)が管理する。 |
669 DGMはLocalとRemoteがあり、全てのDGMはCodeGearManager(以下CGM)で管理される。 | |
152 | 670 GearsOSではContextという全てのCG/DGを一括管理するプロセスがあり、AliceのCGMもこのContextに相当する。 |
174 | 671 全てのCGMはThreadPoolと他のCGM全てのリストを共有しているため、全てのCG/DGにアクセス可能である(図\ref{fig:christieClass})。 |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
672 |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
673 \begin{figure}[h] |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
674 \begin{center} |
160 | 675 \includegraphics[width=130mm]{images/ChristieClass.pdf} |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
676 \end{center} |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
677 \caption{CGMはCGMとDGMを管理する} |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
678 \label{fig:christieClass} |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
679 \end{figure} |
152 | 680 |
681 CGを記述する際はAlice同様CodeGear.classを継承する。 | |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
682 CodeGearは |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
683 |
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
684 void run(CodeGearManager cgm)を持つclassであり、プログラマはrunメソッド内に処理を記述する。 |
152 | 685 インプットで指定したkeyに対応したDGが全て揃ったとき、runに書かれた処理が実行される。 |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
686 ChristieのAPIにはrunの引数で受け取ったCGMを経由してアクセスする。 |
152 | 687 GearsOSではCG間でContextを受け渡すことによってCGはDGにアクセスするため、Christieでもその記述方法を採用した。 |
160 | 688 |
689 通常のRunnableクラスではこのように引数をうけとることができないが、CodeGearExecutorというRunnableのMeta Computationを挟んだことでこのようにCGMを受け渡しながらの記述を可能にした。 | |
690 | |
691 詳しいCodeGearの記述方法については、4.4章で説明する。 | |
156 | 692 |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
693 \newpage |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
694 |
146 | 695 \section{APIの改善} |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
696 ここではAliceのAPIの問題を踏まえて設計したChristieのAPIについて、インプット、アウトプット、データの取り出しに分けて説明する。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
697 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
698 \subsection*{アノテーションの導入によるインプットの記述} |
153 | 699 InputAPIにはAliceと同じくTakeとPeekを用意した。 |
156 | 700 ChristieではInput DG の指定にはアノテーションを使う。 |
701 アノテーションとは、クラスやメソッド、パッケージに対して付加情報を記述できるJavaのMeta Computationである。 | |
702 先頭に@をつけることで記述でき、オリジナルのアノテーションを定義することもできる。 | |
152 | 703 |
704 AliceではInputの受け皿であるReceiverを作り後からkeyをセットしていたが、 | |
174 | 705 ChristieではInputのためのDGを作り、その上にアノテーションでKeyを指定する(ソースコード\ref{src:take})。 |
152 | 706 |
153 | 707 \lstinputlisting[label=src:take, caption=Takeの例]{source/christie/InputDG.java} |
152 | 708 |
709 | |
156 | 710 アノテーションで指定したInputDGは、CGを生成した際にCodeGear.class内で待ち合わせの処理が行われる。 |
152 | 711 これにはJavaのreflectionAPIを利用している。 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
712 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
713 Christieのこのインプットアノテーションはフィールドに対してしか記述できないため、InputDGの生成とTake/Peekの指定とkeyの指定を必ず一箇所で書くことが明確に決まっている。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
714 そのためAliceのように外のCSからのkeyへの干渉をされることがない。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
715 また、アノテーションの指定はRUNTIMEではできないため、動的なkeyの指定も防ぐことができる。 |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
716 このように、アノテーションを用いたことで、Aliceの記述の分離問題が解決された。 |
152 | 717 |
174 | 718 ソースコード\ref{src:take}の2行目にあるように、InputDGを宣言する際には必ず型の指定が必要となる。 |
156 | 719 DataGearは様々な型のデータを扱うためにJavaの総称型で受け取るようにしており、\textless \textgreater 内に指定した型でデータの型を限定できる。 |
153 | 720 このように記述することで、Christieでは他の部分を辿らなくてもCGを見るだけでインプットされるデータの型が分かるように可読性を向上させた。 |
721 また、取得してきたDGが指定と違う型であった場合はエラーとなるため、型の整合性を保ちながら信頼性の高いプログラミングが可能となった。 | |
152 | 722 |
153 | 723 また、Aliceではkeyと変数名の不一致から可読性が低くなっていた。 |
724 しかしChristieではkeyと変数名が一致しないとエラーとなるため、自然と読みやすいコードが書けるようになっている。 | |
174 | 725 この部分に関しては、JavaのメタプログラミングAPIであるJavassist\cite{javassist}を用いてアノテーションから変数の自動生成も試みたが、Javassistでは変数生成の前に他のどのクラスも生成してはならないという制限があったため、Christieでは実現できなかった。 |
153 | 726 |
152 | 727 |
174 | 728 リモートノードに対してTake/Peekする際は、RemoteTake/RemotePeekのアノテーションを用いる(ソースコード\ref{src:remotetake})。 |
156 | 729 そのため待ち合わせ先がLocalかRemoteかはアノテーションの違いからひと目でわかるようになった。 |
153 | 730 |
731 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの例]{source/christie/RemoteInputDG.java} | |
152 | 732 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
733 |
174 | 734 なお、圧縮のMeta ComputationはAliceと同様で、指定する際にDGM名の前にcompressedをつける(ソースコード\ref{src:compresslocal})。 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
735 |
153 | 736 \lstinputlisting[label=src:compresslocal, caption=Localへの圧縮の指定の例]{source/christie/CompressLocal.java} |
737 | |
159
cad92fc74613
change SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
158
diff
changeset
|
738 LocalからのTAKEではDGM名の指定がないが、それはLocalでの圧縮は基本想定していないためである。 |
cad92fc74613
change SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
158
diff
changeset
|
739 しかし、Localでの圧縮をしようと思えばRemoteTakeを用いて間接的にすることは可能である。 |
153 | 740 |
152 | 741 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
742 \subsection*{DGMを指定してのアウトプットの記述} |
153 | 743 OutputAPIにはput/flipを用意した。 |
744 put/flipのメソッドはDGMに用意されている。 | |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
745 cal.java |
153 | 746 CodeGear.classにはDGMを取得するメソッドがあり、それを用いて書き込みたいDGMを指定して直接putする。 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
747 そのためLocal/Remoteの切り替えは指定するDGMの切り替えによって行う。 |
153 | 748 ソースコード\ref{src:put}、\ref{src:remoteput}はLocalとRemoteにputする記述の例である。 |
749 | |
750 \lstinputlisting[label=src:put, caption=Localへputする例]{source/christie/Put.java} | |
751 \lstinputlisting[label=src:remoteput, caption=Remoteへputする例]{source/christie/RemotePut.java} | |
752 | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
753 \newpage |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
754 |
174 | 755 flipも同様にDGMに直接DGを渡す(ソースコード\ref{src:flip})。 |
153 | 756 |
757 \lstinputlisting[label=src:flip, caption=Remoteへflipする例]{source/christie/Flip.java} | |
758 | |
759 ChristieではDGMに対して直接putするため、AliceのODSにあたる部分はない。 | |
760 ODSを経由するより直接DGMに書き込むような記述のほうが直感的であると考えたためである。 | |
761 | |
152 | 762 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
763 \subsection*{型を指定しないデータの取り出し} |
153 | 764 AliceのasClassに相当するのがgetDataである。 |
765 ソースコード\ref{src:getdata}はgetDataを用いてInputDGからデータを取得する例である。 | |
766 | |
767 \lstinputlisting[label=src:getdata, caption=getDataの例]{source/christie/GetData.java} | |
768 | |
769 Aliceと違う点は、プログラマが型を指定しなくて良い点である。 | |
174 | 770 4.3で示したように、InputDGを生成する際には型を指定する。 |
153 | 771 この型は内部で保存され、リモートノードと通信する際も保たれる。 |
772 このようにgetDataするだけでプログラマが指定しなくとも正しい型で取得できるため、プログラマの負担を減らし信頼性を保証することができる。 | |
773 | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
774 \newpage |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
775 |
150 | 776 \section{CodeGearの記述方法} |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
777 以下のコードはLocalDSMにputしたDGを取り出して表示するのを10回繰り返す例題である。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
778 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
779 \lstinputlisting[label=src:StartCodeGear, caption=StartCodeGearの例]{source/christie/StartTest.java} |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
780 \lstinputlisting[label=src:TestCodeGear, caption=CodeGearの例]{source/christie/TestCodeGear.java} |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
781 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
782 Alice同様、ChristieでもInputDGを持たないStartCGから処理を開始する。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
783 StartCGはStartCodeGear.classを継承することで記述できる。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
784 AliceではStartCSもCodeSegment.classを継承して書かれていたため、どれがStartCSなのか判別しづらかったが、Christieではその心配はない。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
785 |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
786 \newpage |
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
787 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
788 StartCGを記述する際にはcreateCGMメソッドでCGMを生成してコンストラクタに渡す必要がある。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
789 ソースコード\ref{src:StartCodeGear}の8行目でそれが行われている。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
790 createCGMの引数にはリモートノードとソケット通信する際使うポート番号を指定する。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
791 CGMを生成した際にLocalDGMやリモートと通信を行うためのDaemonも作られる。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
792 |
156 | 793 CGに対してアノテーションから待ち合わせを実行する処理はsetupメソッドが行う。 |
174 | 794 そのためソースコード\ref{src:StartCodeGear}の13行目、ソースコード\ref{src:TestCodeGear}の10行目のように、newしたCGをCGMのsetupメソッドに渡す必要がある。 |
156 | 795 AliceではnewすればCGが待ちに入ったが、Christieでは一度CGをnewしないとアノテーションから待ち合わせを行う処理ができないため、newの後にsetupを行う。 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
796 そのため、CGの生成には必ずCGMが必要になる。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
797 runでCGMを受け渡すのはこのためである。 |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
798 なお、StartCGはインプットを持たないため、setupを行う必要がなく、newされた時点でrunが実行される。 |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
799 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
800 \newpage |
153 | 801 |
802 | |
148
cf9c3be20362
add Alice abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
146
diff
changeset
|
803 \section{DataGearManagerの複数立ち上げ} |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
804 AliceではLocalDGMがstaticで書かれていたため複数のLocalDGMを立ち上げることができなかった。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
805 しかしChristieではCGMを2つ生成すればLocalDGMも2つ作られる。 |
174 | 806 複数のLocalDGM同士のやりとりも、Remoteへの接続と同じようにRemoteDGMをproxyとして立ち上げアクセスする(図\ref{fig:remoteDGM})。 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
807 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
808 \begin{figure}[h] |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
809 \begin{center} |
155
573db146fa93
change image size
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
154
diff
changeset
|
810 \includegraphics[width=130mm]{images/DGM.pdf} |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
811 \end{center} |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
812 \caption{RemoteDGMを介して他のLocalDGMを参照} |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
813 \label{fig:remoteDGM} |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
814 \end{figure} |
146 | 815 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
816 \newpage |
149
d57aa814a69a
add source, add chapter2
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
148
diff
changeset
|
817 |
174 | 818 ソースコード\ref{src:multilocal}は、LocalDSMを2つ立ち上げ、お互いをリモートに見立てて通信する例である。 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
819 11行目にあるように、RemoteDGMを立ち上げるにはCGMが持つcreateRemoteDGMメソッドを用いる。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
820 引数にはRemoteDGM名と接続するリモートノードのIPアドレス、ポート番号を渡している。 |
153 | 821 |
154
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
822 \lstinputlisting[label=src:multilocal, caption=LocalDGMを2つ作る例]{source/christie/MultiLocal.java} |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
823 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
824 リモートの場合の同じようにアクセスできることで、コードの変更をせずに、同一マシン上の1つのアプリケーション内で分散アプリケーションのテストができるようになった。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
825 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
826 また、CGMは内部にCGMのリストをstaticでもっており、複数生成したCGMを全て管理している。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
827 つまり、メタレベルではRemoteDGMを介さずに各LocalDGMに相互アクセス可能である。 |
14e0a5a932cf
add example CodeGear
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
153
diff
changeset
|
828 そのため、Christieでは容易にNAT越えが実装できることが期待できる。 |
153 | 829 |
150 | 830 \section{DataGearの拡張} |
153 | 831 Aliceではデータの多態性を実現するためにDS内に複数のデータ形式を保持していた。 |
832 しかしChristieではデータ形式ごとに別のclassに分けている。 | |
833 DataGearを継承したMessagePackDataGearと、それを更に継承したCompressedDataGearを用意した。 | |
834 そのため子クラスは親クラスのデータ形式を保持しながら新しいデータ形式を持つ形になっている。 | |
835 クラスを見るだけで今どの形式を保持しているかわかるようになったため、デバッグがしやすくなった。 | |
836 | |
162 | 837 \section{通信フロー} |
838 本章で説明したChristieの設計をいくつか例をあげてChristieの通信のフローをシーケンス図を用いて解説する。 | |
839 図\ref{fig:localSequence}はLocalDGMにTakeを行い、LocalDGM内にDGがあったときの処理の流れである。 | |
840 | |
841 \begin{figure}[h] | |
842 \begin{center} | |
843 \includegraphics[width=160mm]{images/LocalSequence.pdf} | |
844 \end{center} | |
845 \caption{LocalDGMにTakeしたときのフロー} | |
846 \label{fig:localSequence} | |
847 \end{figure} | |
848 | |
849 プログラマはmainでCGMとStartCGを生成する。 | |
850 CGMと同時にLocalDGMは作られる。 | |
851 CGが生成され、setupメソッドが呼ばれるとアノテーションからTAKEコマンドが作られ実行される。 | |
174 | 852 CGは生成したインプットコマンドの総数を初期値としたカウンタを持っており、コマンドが解決される(InputDGが揃う)たびにカウンタは減っていき、0になるとrun内の処理がThreadPoolへ送られる。 |
153 | 853 |
854 | |
162 | 855 \newpage |
856 | |
857 図\ref{fig:remotePutSequence}は、LocalDGMにTakeを行うが、LocalDGM内にDGがなかったためにPutの待ち合わせをするときの処理の流れである。 | |
858 mainなどの最初の処理は図\ref{fig:localSequence}と同様のため省略する。 | |
859 | |
860 \begin{figure}[h] | |
861 \begin{center} | |
862 \includegraphics[width=160mm]{images/RemotePutSequence.pdf} | |
863 \end{center} | |
864 \caption{RemoteDGMにPutしたときのフロー} | |
174 | 865 \label{fig:remotePutSequence} |
162 | 866 \end{figure} |
867 LocalまたはリモードノードからPUTコマンドが実行された際、もしwaitListにPutしたDGを待っているコマンドがあれば実行される。 | |
868 | |
869 | |
870 \newpage | |
871 図\ref{fig:remoteTakeSequence}は、RemoteDGMにTakeを行ったときの処理の流れである。 | |
156 | 872 |
162 | 873 \begin{figure}[h] |
874 \begin{center} | |
875 \includegraphics[width=165mm]{images/RemoteTakeSequence.pdf} | |
876 \end{center} | |
877 \caption{RemoteDGMにTakeしたときのフロー} | |
878 \label{fig:remoteTakeSequence} | |
879 \end{figure} | |
880 | |
881 StartCGで事前にRemoteDGMを生成しておく。 | |
882 RemoteTakeアノテーションからRemoteDGMに対するTakeコマンドを生成し実行する。 | |
883 RemoteTakeのようにリモートからの応答を待つコマンドはRemoteDGMのwaitListに入る。 | |
884 そして、MessagePack形式に変換したRemoteCommandを作成し、それをRemoteDGMが参照している別ノードのLocalDGMに送る。 | |
885 | |
886 それを受け取った側のLocalDGMは、DGがあればREPLYコマンドを生成して送り返す。 | |
887 もしDGがなければ、リモートから来たコマンドもローカルの場合と同様にLocalDGMのwaitListに入る。 | |
888 | |
889 REPLYを受け取るとRemoteDGMはwaitListに入っていたコマンドを解決する。 | |
890 | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
891 \chapter{再設計への考察} |
170 | 892 InputDGの指定において、CGにDGを宣言するというのは、DGをそのままflipできるようにするためであった。 |
893 逆に言えばそれ以外でDataGear型でプログラマが利用することは少ない。 | |
174 | 894 そのため、DGを宣言せずにアノテーションから生成し完全にメタレイヤーに移すことで、より分かりやすい記述が可能だと考える。 |
895 flipする場合は、keyを指定するだけで良い。 | |
896 | |
170 | 897 また、put/flipする際にDGM名を直接指定する書き方も、まだひと目でアウトプットしている部分が分かるようなシンタックスではないため、改善の余地がある。 |
146 | 898 |
170 | 899 DGMは一種のデータベースであると述べたが、現状のDGMはデータベースに必要なトランザクションを持っていない。 |
900 当研究室で開発しているJungleデータベースはトランザクションを持っており、更にマージ可能な差分管理システムを持っている。 | |
174 | 901 そのためJungleデータベースとの統合することで、DGMへの操作を信頼性高くすることが望ましい。 |
170 | 902 |
174 | 903 また、現在はノードごとにDGMとDGのkeyが与えられているが、将来的にはURLのような大域で使えるkeyを用意することでより手軽なRemoteDGMへのアクセスを提供できると考えられる。 |
146 | 904 |
170 | 905 \chapter{結論} |
906 \section{まとめ} | |
907 本研究では、まず分散フレームワークに必要な要件を洗い出し、Akka、Hazelcastと比較しながら分散フレームワークAliceが分散性を意識して記述できる特徴をもつことを示した。 | |
908 また、Aliceの持つCode Segment/Data Segmentの計算モデルや記述方法、Meta Computationについてを説明し、AliceでNAT越えを実現するための手法を示した。 | |
909 さらに現状のAliceの問題点として、NAT越えをするために必要なLocal Data Gear Managerの複数立ち上げができないこと、分散プログラムのテストがしづらいこと、APIシンタックスの分離により信頼性が損なわれていること、型の整合性がとれていないことなどを示し、再設計の必要性を述べた。 | |
175
7e7fe5e28ba4
add presen directory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
174
diff
changeset
|
910 そして、分散フレームワークChristieの設計を示し、Code Gear ManagerというCode Gear/Data Gearの管理機構を挟むことでData Gear Managerを複数立ち上げられるようにした。 |
7e7fe5e28ba4
add presen directory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
174
diff
changeset
|
911 これによりテストが容易になり、提案したNAT越えの手法に対応できる。 |
170 | 912 また、アノテーションを用いることでシンタックスの分離問題を解決し、さらに型整合のとれたより信頼性の高い記述が可能になったことを示した。 |
913 そして、これら実装したChristieに対しても更に改善すべき点を考察した。 | |
156 | 914 |
170 | 915 \section{今後の課題} |
916 \subsection*{TopologyManagerの実装} | |
156 | 917 Aliceと同じく、静的・動的なトポロジー管理のできるTopologyManagerの実装が必要である。 |
918 Christieでは複数のLocalDSMが立ち上げ可能なため、TopologyManagerでのNAT超えも実装し実用性があるかを検証する | |
170 | 919 また、通信の信頼性を保証するために、TopologyManagerがダウンした際に新たなTopologyManagerを立ち上げるMeta Computationも必要だと考える。 |
156 | 920 |
921 | |
170 | 922 \subsection*{実用性の検証} |
162 | 923 本論文ではChristieの設計と基本実装までを行ったが、それがどれほどの分散性能を持っているのかはまだ計測していない。 |
924 CG/DGのプログラミングモデルなどの基本的にはAliceと同じであるが、アノテーションの処理がどれほどのオーバーヘッドに繋がっているか現時点では不明である。 | |
925 そのため、Aliceと同等の速度性能を持っているか、コードの量や複雑度は抑えられているかなどを分散処理の例題を用いて測定する必要がある。 | |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
926 |
170 | 927 \subsection*{GearsOSへの移行} |
156 | 928 GearsOSはまだ開発途中であったため、本論文の作成時点ではChristieのような分散機能を実装することが叶わなかった。 |
174 | 929 GearsOSではモデル検査機構akasya\cite{akasya}があるため、待ちに入っているkeyのputし忘れなどをコンパイルの段階で見つけることができる。 |
160 | 930 GearsOS上で分散プログラミングができればより信頼性の高いプログラミングが期待できるため、将来的にはChristieをGearsOSの分散機構として取り込みたい。 |
931 | |
156 | 932 GearsOSにChristieを移行するには、GearsOSにJavaのアノテーションに相当するMeta Computationを実装する必要がある。 |
933 そしてChristieでは実現できなかったアノテーションからの変数の自動生成が行えれば更にプログラミングしやすいAPIになると考えられる。 | |
934 | |
160 | 935 |
156 | 936 \chapter{付録} |
937 \section{独自のアノテーション定義} | |
938 Christieのアノテーションの実装方法と、そのアノテーションからtakeを実行する部分を解説する。 | |
939 | |
940 ソースコード\ref{src:take}、\ref{src:remotetake}がChristie独自のアノテーションの定義である。 | |
941 | |
942 \lstinputlisting[label=src:take, caption=Takeの実装]{source/christie/TakeAnnotation.java} | |
943 \lstinputlisting[label=src:remotetake, caption=RemoteTakeの実装]{source/christie/RemoteTakeAnnotation.java} | |
944 | |
945 @Targetや@Retentionはアノテーション定義のためのアノテーション、メタアノテーションである。 | |
946 @Targetには、フィールドやメソッド、コンストラクタなど、このアノテーションの付加対象となる構文要素が何かを記述する。 | |
947 @Retentionには、SOURCE・CLASS・RUNTIMEが選択でき、アノテーションで付加された情報がどの段階まで保持されるかを定義する。reflectionAPIを利用するにはRUNTIMEでなければならないため、Christieのアノテーションの@Retentionは全てRUNTIMEである。 | |
948 | |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
949 \newpage |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
950 |
156 | 951 定義したアノテーションの仕様例がソースコード\ref{src:takeAno}、\ref{src:remotetakeAno}である。 |
952 | |
953 \lstinputlisting[label=src:takeAno, caption=Takeアノテーションの使用例]{source/christie/InputDG.java} | |
954 \lstinputlisting[label=src:remotetakeAno, caption=RemoteTakeアノテーションの使用例]{source/christie/RemoteInputDG.java} | |
955 | |
174 | 956 アノテーションを使う際、()内に記述する値がソースコード\ref{src:take}のvalueやソースコード\ref{src:remotetake}のdsmNameといったキーに保存される。 |
156 | 957 通常キーに対して値を入れる場合は、ソースコード\ref{src:remotetakeAno}のようにkey=の形で記述しなければならないが、Takeのようにキーが1つの場合、キー名をvalueにすることでその記述を省略することができる。 |
958 | |
158
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
959 setupメソッド内では生成されたフィールドに対してアノテーションを含めた情報を処理している。 |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
960 これにはJavaのreflectionAPIが使用されている。 |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
961 reflectionAPIでは対象となるクラスのフィールドやメソッド、それに対するアノテーションやアノテーションが保持するキーにアクセスすることができる。 |
2bf8a1edcecc
add SequenceDiagram
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
157
diff
changeset
|
962 ソースコード\ref{src:setup}はsetupメソッド内でreflectionAPIを用いてアノテーションからTakeコマンドを作成する部分である。 |
156 | 963 |
964 \lstinputlisting[label=src:setup, caption=reflectionAPIでフィールドの情報を取得]{source/christie/Setup.java} | |
965 | |
174 | 966 フィールドから取得したDGとアノテーションから取得したkeyからインプットコマンド(TAKE/PEEK)を生成し、DGMへ送って実行する。 |
146 | 967 |
968 | |
969 \chapter{謝辞} | |
970 本研究の遂行、また本論文の作成にあたり、ご多忙にも関わらず終始懇切なる御指導と御 | |
971 教授を賜わりました河野真治准教授に深く感謝したします。 | |
972 | |
156 | 973 そして、数々の貴重な御助言と技術的指導を戴いた伊波立樹さん、他フレームワークの調査に協力してくださった清水隆博さん、赤堀貴一さん、浜瀬裕暉さん、大城由也さん、並びに信頼研究室の皆様に感謝いたします。 |
974 先行研究であるAlice, Federated Linda, Jungle, TreeVNCがなければ本研究はありませんでした。 これら先行研究の設計や実装に関わった全ての先輩方に感謝いたします。 | |
975 | |
976 また、本フレームワークの名前の由来となったクリスティー式戦車の生みの親、ジョン・W・クリスティーに敬意を評します。 | |
977 | |
167
9a072c2d6e12
add English Abstract
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
166
diff
changeset
|
978 最後に、日々の研究生活を支えてくださった新里幸恵さん、大嶺志歩さん、阿波連知恵さん、米須智子さん、菱田正和さん、情報工学科の方々、そして家族に心より感謝いたします。 |
156 | 979 |
146 | 980 |
981 %参考文献 | |
982 \nocite{*} | |
983 \bibliographystyle{junsrt} | |
157
d620f126a383
change abstract & chapter1
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
156
diff
changeset
|
984 \bibliography{reference} |
146 | 985 |
986 %発表履歴 | |
987 \addcontentsline{toc}{chapter}{発表履歴} | |
988 %\input{history.tex} | |
989 | |
990 %付録 | |
991 \addcontentsline{toc}{chapter}{付録} | |
992 \appendix | |
993 %\input{sources.tex} | |
994 \end{document} |