annotate paper/chapter3.tex @ 6:3c415702fab0

modify chapter3
author sugi
date Tue, 06 Jan 2015 12:47:49 +0900
parents c8f50c3ead48
children ef47dab5764f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
295b393a7134 first commit
sugi
parents:
diff changeset
1 \chapter{Aliceの新機能} \label{chapter:chapter3}
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
2 水族館の例題によって、Aliceを用いて分散プログラムを記述可能であることが証明された。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
3 しかし、実用的なアプリケーションを記述するには、まだ機能が足りないと予測される。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
4 そこで、当研究室で開発を行っているTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
5
0
295b393a7134 first commit
sugi
parents:
diff changeset
6 \section{Dynamic Topologyへの対応}
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
7 第2章で示したように分散フレームワークAliceはTopology Fileを読み込むことでTopologyを構成する。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
8 つまり、予め参加するノードの台数が決まっている必要がある。また、Topologyに全ノードが参加するまでアプリケーションが起動しない。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
9
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
10 しかし、実際のアプリケーションでは、参加するノードの数は決まっていないため、Topologyを動的に変化させる必要がある。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
11 そこで、Topology Fileの代わりにTopologyを指定して起動させた場合(ソースコード \ref{src:DynamicTopologyManager})、ノードがTopologyに従い、順次追加されるようにTopology Managerに機能を追加した。
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
12
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
13 \begin{table}[htbp]
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
14 \lstinputlisting[label=src:DynamicTopologyManager, caption=Dynamic Topology Managerの起動方法]{source/TopologyManager.sh}
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
15 \end{table}
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
16
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
17 現在は、TreeVNCのTopologyである木構造のみ指定可能である。引数Childの後に子供の数を指定することで2分木だけではなく3分木などのTopologyを作ることができる。デフォルトでは2分木になっている。
0
295b393a7134 first commit
sugi
parents:
diff changeset
18
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
19 \subsection{Dynamic Topology Managerの参加表明処理}
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
20 トポロジーファイルを指定して起動した場合は、図 \ref{fig:topologymanagerandnode}で示したように、アプリケーションが起動する前に全ての接続すべきTopology Nodeの情報がTopology Nodeにputされ、接続処理が行われる。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
21
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
22 Dynamic Topologyの場合は、新しくTopology Nodeがアプリケーションに参加するたびにTopology ManagerからTopology Nodeに対して、接続すべきTopology Nodeの情報がputされ、接続処理が行われる。(図 \ref{fig:DynamicTopology})。
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
23
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
24 Dynamic Topologyへの参加表明の方法は、従来の方法と同じく、Topology Nodeの起動時にコマンドライン引数からTopology ManagerのIPアドレスとポート番号を指定するだけでよい。
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
25
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
26 \begin{figure}[htbp]
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
27 \begin{center}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
28 \includegraphics[width=100mm]{images/DynamicTopologymanagerandnode.pdf}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
29 \end{center}
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
30 \caption{Dynamic Topology ManagerとTopology Node間の通信}
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
31 \label{fig:DynamicTopology}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
32 \end{figure}
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
33
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
34 \section{Keep Alive}
3
cacc83aea539 modify chapter3
sugi
parents: 2
diff changeset
35 ノード間の通信は、Remote Data Segmentに対してputやpeekを行うことでのみ発生する。従って、Code Segmentの実装次第では、長時間通信が行われない可能性がある。通信が行われない間にRemote Data Segmentとの接続が切れた場合、次の通信が行われるまで切断を発見することができない。また、接続状態ではあるが問題が発生し、応答に時間がかかる場合も考えられる。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
36
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
37 以上の問題を検知するためにアプリケーションではKeep Aliveという、定期的にheart beatを送り生存確認を行う機能を持つことが望ましい。そこで、Alice自体にKeep Aliveの機能を実装した。
2
33246fe15eb5 edit omnigraffle
sugi
parents: 1
diff changeset
38
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
39 一定時間内にノードから応答がない場合、Keep Aliveにより、そのノードのRemote Data Segmentが切断される。
0
295b393a7134 first commit
sugi
parents:
diff changeset
40
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
41
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
42 図 \ref{fig:keepAlive}は、keepAliveの処理をコミュニケーションダイアグラムで示したものである。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
43 keepAliveは、タスクとタスクを実行するTaskExecuterと実行順序を管理するSchedulerによって実装されている。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
44 タスクの種類には、{\tt PING}、{\tt CLOSE}、{\tt CREATE}があり、TaskExecuterは、タスクの種類に従って処理を行なう。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
45 {\tt PING}は、指定されたRemote Data Segmentに対してheartbeatを送信する。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
46 {\tt CLOSE}は、指定されたRemote Data Segmentを削除する。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
47 {\tt CREATE}は{\tt PING}のタスクを作成し、Schedulerに登録する。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
48
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
49 タスクを作成する際に実行時間の指定をする。Schedulerにタスクを登録すると、Schedulerはタスクの実行時間に従って、タスクを実行順に並び替える。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
50 \begin{figure}[htbp]
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
51 \begin{center}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
52 \includegraphics{images/keepAlive.pdf}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
53 \end{center}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
54 \caption{keepAliveの仕組み}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
55 \label{fig:keepAlive}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
56 \end{figure}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
57
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
58 \subsubsection{処理の流れ}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
59 \begin{enumerate}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
60 \item CreateTask(Code Segment)により{\tt PING}タスクが投入される。\label{enum:putPingTask}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
61 \item TaskExecuterはSchedulerから次に実行すべき{\tt PING}タスクを受け取る。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
62 \item 指定された時間が訪れるとheartbeatがRemote Data Segment(Node B)に送信される。\label{enum:send}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
63 \item \ref{enum:send}と同時にheartbeatを送信したRemote Data Segmentとの接続を切断する{\tt CLOSE}タスクが投入される。\label{enum:putCloseTask}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
64 \item \ref{enum:putCloseTask}で投入された{\tt CLOSE}タスクが実行されるまでに、Remote Data Segment(Node B)からのレスポンスがあった場合、RemoveTask(Code Segment)により{\tt CLOSE}タスクが削除される。
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
65 %\item \ref{enum:putPingTask}に戻る。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
66 \end{enumerate}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
67
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
68 \ref{enum:putPingTask}で作られる{\tt PING}タスクは、接続しているRemote Data Segmentの数だけ投入される。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
69 "\_CLSIT"というkeyには、アクセス可能なRemote Data Segmentのkeyの一覧が保存されている。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
70 CreateTaskは、この一欄により動的にタスクを作成している。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
71
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
72 以上で説明した処理の流れは、接続状態に問題がない場合である。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
73 接続状態に問題があり、{\tt CLOSE}タスクの実行されるまでにレスポンスがない場合は、{\tt CLOSE}タスクによりRemote Data Segmentが削除される。
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
74
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
75 heartbeatは、Node AからNode Bに一方向に送られる訳ではなく、Node BからNode Aにも送られている。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
76 %Singleton Code Segmentの注意点 ids.initが必要とその理由の記述
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
77
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
78 \section{切断時の処理}
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
79 DataBaseではデータ更新の際にトランザクション処理に障害が起こった場合、DataBase側でトランザクション処理開始前に戻すロールバックという処理が行われる。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
80 同様にTreeVNCでは切断を検知した場合、LostParentというメッセージがトップノードに対して送信される。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
81
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
82 以上の例のように、アプリケーションはノードの切断に対する処理を用意したい場合がある。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
83 しかし、Aliceを用いたアプリケーションの場合、アプリケーション側で検知するのは難しい。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
84 切断自体は、Remote Data Segmentに対してwriteまたはreadを行った際に出るExceptionにより判断することができる。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
85 だが、I/O の処理はCode Segmentを実行するThreadで行われない。専用のI/O Threadによって行われるため、Code Segment内でExceptionを捕まえられず、例外として処理することができない。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
86
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
87 そこで、Aliceが切断を検知した際に、任意のCode Segmentを実行できる機能 (ClosedEventManager)を追加した。
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
88 ユーザはClosedEventManagerにCode Segmentを登録することで、切断時の処理として実行するCode Segmentを指定できる。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
89 \begin{table}[htbp]
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
90 \lstinputlisting[label=src:registerEvent, caption=切断時に実行されるCode Segmentの登録方法]{source/RegisterEvent.java}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
91 \end{table}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
92
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
93 また、切断したRemote Data Segmentの情報を利用したい場合は、Code Segmentをextends する代わりにClosed Event Code Segmentをextendsし、用意されているMethodを使うことで取得可能である(ソースコード \ref{src:CatchClosedEvent})。
0
295b393a7134 first commit
sugi
parents:
diff changeset
94
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
95 \begin{table}[htbp]
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
96 \lstinputlisting[label=src:CatchClosedEvent, caption=CloseEventCodeSegmentを継承したCodeSegment]{source/CatchClosedEvent.java}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
97 \end{table}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
98 ClosedEventCodeSegmentを継承したCode Segmentに、Input Data Segmentを追加記述する事ができる。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
99 その際は、もちろんInput Data Segmentが全て揃うまでCode Segmentは実行されない。
0
295b393a7134 first commit
sugi
parents:
diff changeset
100
295b393a7134 first commit
sugi
parents:
diff changeset
101 \section{再接続の処理}
295b393a7134 first commit
sugi
parents:
diff changeset
102
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
103 \section{Multicast Data Segment}
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
104 TreeVNCには、Multicastを利用して起動しているTreeVNCのRoot Nodeの情報の一覧にして表示する接続先自動検索システムという機能がある。この機能によりTreeVNCの起動の際にIPアドレスを入力する手間を省くことができる。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
105
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
106 現在のAliceは起動時にTopology ManagerのIPアドレスを入力する必要があり、TreeVNCの接続先自動検索機能が必要と考えられる。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
107 その機能を実現するためにはMulticastに対応する必要がある。そこで、同じマルチキャストアドレスを持つ端末を1つのData Segmentとして扱うMuticast Data Segmentを追加した。
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
108 Multicast Data Segmentも他のData Segment同様、Data Segment APIを用いて扱う。
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
109
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
110 \begin{figure}[htbp]
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
111 \begin{center}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
112 \includegraphics[width=120mm]{images/multicast.pdf}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
113 \end{center}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
114 \caption{Multicast Data Segment}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
115 \label{fig:multicast}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
116 \end{figure}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
117
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
118 図 \ref{fig:multicast}はMulticast Data Segmentを図で表したものである。Multicast Data Segmentに対してputを行うとnode D、node E、node Fの3つのnodeに対してデータがputされる。同様にTakeを行うと3つのnodeからreplyが来る。
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
119 \subsection{Multicast Data Segmentの制限}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
120 Multicast Data SegmentはUDPを用いて実装されている。1つのUDPのパケットで運ぶことのできるデータが、65507bytes(65535bytesからIPヘッダの最低サイズ20bytesとUDPのヘッダのサイズ8bytesを引いた大きさ)である。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
121 現状、分割して送る処理をMulticast Data Segmentが持たない。従って、Multicast Data Segmentを利用する際には、データのサイズを65507bytes以下にしなければならない。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
122 \subsection{Multicast Data Segment Manager}
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
123 Multicast Data SegmentもRemote Data Segment同様Managerを経由して操作を行う。Multicast DSMを作成するとMulticast Data Segmentに対する送受信用のスレッドが作成される。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
124
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
125 \begin{itemize}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
126 \item {\ttfamily public static MulticastDataSegmentManager \\
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
127 connectMulticast(String connectionKey ,String MCSTADDR, int port, String nis, SocketType type)}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
128 \end{itemize}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
129
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
130 DataSegment classのstaticメソッドである、connectMulticastを呼ぶことでMulticast DSMが作成される。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
131 第1引数はMulticast DSMへのアクセスするためのkeyを指定できる。第2引数はマルチキャストアドレスを、第3引数はポート番号を、第4引数はネットワークインターフェイスを指定する。第5引数はSocketTypeを指定する。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
132 SocketTypeには、{\tt Sender}と{\tt Receiver}と{\tt Both}が存在する。{\tt Sender}を指定した場合は、第2引数で指定したマルチキャストアドレスに対して送信処理を行うスレッドを作成する。{\tt Receiver}を指定した場合は、第2引数で指定したマルチキャストアドレスに対して送信されたデータを受信するスレッドを作成する。{\tt Both}は、送受信両方のスレッドを作成する。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
133
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
134 現在、Multicast Data Segmentは自動では作成されないため、ユーザー自身で作成する必要がある。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
135
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
136 ソースコード \ref {src:MulticastStartCodeSegment}と\ref {src:MulticastIncrement}は実際にMulticast Data Segmentを利用した例題である。例題の内容はmulticast Data Segmentに対してtakeを行い、取得したデータをインクリメントして再びputを行うものである。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
137
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
138 Multicast DSMを作成する際のSocketTypeの引数はBothであるため、ReceiverとSender両方作成される。そのため、"multicast"というkeyに対してputを行うと、自分自身に対してもData Segmentがputされる。takeもまた同様に自分自身に対してもtakeが要求され、要求に対してreplyを返すことになる。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
139 \begin{table}[htbp]
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
140 \lstinputlisting[label=src:MulticastStartCodeSegment, caption=multicast DSMの作成例]{source/MulticastStartCodeSegment.java}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
141 \end{table}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
142
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
143 \begin{table}[htbp]
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
144 \lstinputlisting[label=src:MulticastIncrement, caption=multicast Data Segmentの使用例]{source/MulticastIncrement.java}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
145 \end{table}