annotate paper/chapter3.tex @ 17:675939a7f983

change experiment picture
author sugi
date Fri, 23 Jan 2015 16:43:48 +0900
parents b9b3f2241ab4
children fd43827452ad
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
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
77 \section{切断時の処理}
17
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
78 MMORPGでは、試合の最中にサーバーからユーザーが切断された場合、自動的にユーザーが操作するキャラクターをゲーム開始時の位置に戻すという処理が実行される。
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
79 同様にTreeVNCでは切断を検知した場合、LostParentというメッセージがトップノードに対して送信される。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
80
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
81 以上の例のように、アプリケーションはノードの切断に対する処理を用意したい場合がある。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
82 しかし、Aliceを用いたアプリケーションの場合、アプリケーション側で検知するのは難しい。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
83 切断自体は、Remote Data Segmentに対してwriteまたはreadを行った際に出るExceptionにより判断することができる。
17
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
84 だが、I/O の処理はCode Segmentを実行するThreadで行われない。専用のI/O Threadによって行われるため、Code Segment内でExceptionを捕まえられず、例外処理を行なうことができない。
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
85
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
86 そこで、Aliceが切断を検知した際に、任意のCode Segmentを実行できる機能 (ClosedEventManager)を追加した。
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
87 ユーザはClosedEventManagerにCode Segmentを登録することで、切断時の処理として実行するCode Segmentを指定できる。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
88 \begin{table}[htbp]
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
89 \lstinputlisting[label=src:registerEvent, caption=切断時に実行されるCode Segmentの登録方法]{source/RegisterEvent.java}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
90 \end{table}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
91
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
92 また、切断したRemote Data Segmentの情報を利用したい場合は、Code Segmentをextends する代わりにClosed Event Code Segmentをextendsし、用意されているMethodを使うことで取得可能である(ソースコード \ref{src:CatchClosedEvent})。
0
295b393a7134 first commit
sugi
parents:
diff changeset
93
4
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
94 \begin{table}[htbp]
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
95 \lstinputlisting[label=src:CatchClosedEvent, caption=CloseEventCodeSegmentを継承したCodeSegment]{source/CatchClosedEvent.java}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
96 \end{table}
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
97 ClosedEventCodeSegmentを継承したCode Segmentに、Input Data Segmentを追加記述する事ができる。
e59c8e99a5c1 modify chapter4
sugi
parents: 3
diff changeset
98 その際は、もちろんInput Data Segmentが全て揃うまでCode Segmentは実行されない。
0
295b393a7134 first commit
sugi
parents:
diff changeset
99
13
ef47dab5764f modify chapter2
sugi
parents: 6
diff changeset
100 \section{Topologyの再構成}
14
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
101 ノードは永続的にアプリケーションに参加し続ける訳ではない。目的を果たすとアプリケーションから離脱する。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
102 Topology次第では、アプリケーションに支障をきたす。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
103 例えば、AliceVNCは木構造であるため、子ノードを持つノードがアプリケーションから離脱した場合、その子ノードに対してデータを送信することができなくなる。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
104
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
105 この問題を解決するには、アプリケーションからノードが切断するたびにTopologyの再構成を行なう必要がある。そこで、Dynamic Topology Managerに、Topologyの再構成を行う機能を追加した。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
106
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
107 図 \ref{fig:TopologyFIx}、 \ref{fig:TopologyFIx2}、\ref{fig:TopologyFIx3}はTopologyの再構成をコラボレーションダイアグラムで表したものである。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
108
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
109 \begin{figure}[htbp]
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
110 \begin{center}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
111 \includegraphics[width=120mm]{images/TopologyFIx.pdf}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
112 \end{center}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
113 \caption{切断ノードの検知}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
114 \label{fig:TopologyFIx}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
115 \end{figure}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
116
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
117 \begin{enumerate}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
118 \item Keep AliveがNode1の切断を検知すると、Node3からTopology Managerに対して切断したノードの情報がputされる。keep Aliveは各ノードで動いているため、実際にはNode0とNode4もTopology Managerに対してNode1の情報をputする。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
119 \item Topology Managerは最後にアプリケーションに参加したNode6とその親Node2に対して互いを切断するための準備を行わせる、CLOSEMESSAGEをputする。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
120 \item 切断する準備ができるとお互いに準備完了を知らせるCLOSEREADYをputする。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
121 \item \label {tb:last}CLOSEREADYを受け取ると切断を行い、Remote Data Segmentが使用不可能になる。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
122 \end{enumerate}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
123
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
124 \begin{figure}[htbp]
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
125 \begin{minipage}{0.5\hsize}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
126 \begin{center}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
127 \includegraphics[width=90mm]{images/TopologyFix2.pdf}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
128 \end{center}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
129 \caption{接続すべきノード情報の送信}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
130 \label{fig:TopologyFIx2}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
131 \end{minipage}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
132 \begin{minipage}{0.5\hsize}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
133 \begin{center}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
134 \includegraphics[width=80mm]{images/TopologyFix3.pdf}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
135 \end{center}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
136 \caption{再構成の完了}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
137 \label{fig:TopologyFIx3}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
138 \end{minipage}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
139 \end{figure}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
140
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
141 \begin{enumerate}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
142 \setcounter{enumi}{4}
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
143 \item Node1、Node3、Node4に対してNode6の情報を送り、接続を行わせる。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
144 \item Node6に対して、Node1、Node3、Node4の情報を送り、接続を行わせる。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
145 \item お互いにRemote Data Segmentの名前を贈り合い、Remote Data Segmentが利用可能になる。
b9b3f2241ab4 modify chapter2
sugi
parents: 13
diff changeset
146 \end{enumerate}
13
ef47dab5764f modify chapter2
sugi
parents: 6
diff changeset
147
0
295b393a7134 first commit
sugi
parents:
diff changeset
148 \section{再接続の処理}
17
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
149 MMORPGでは、試合の最中に障害などによりサーバーから離脱したユーザーが、試合が終わるまでに再びサーバーに接続してきた場合に、再びその試合に参加できるような再接続の処理が用意されている。
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
150
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
151 分散にアプリケーションでは、MMORPGの例のように再接続してきたノードに対して通常の処理とは別の処理を行わせたい場合がある。そこで、Aliceに再接続してきたノードに、任意のCode Segmentを実行できる機能を追加した。ユーザーはconfigにCode Segmentを継承したClassを登録することで、再接続時に実行されるCode Segmentを指定することができる。
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
152
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
153 \begin{table}[htbp]
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
154 \lstinputlisting[label=src:StartAquarium, caption=再接続に実行するCode Segmentの登録方法]{source/StartAquariumFX.java}
675939a7f983 change experiment picture
sugi
parents: 14
diff changeset
155 \end{table}
0
295b393a7134 first commit
sugi
parents:
diff changeset
156
1
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
157 \section{Multicast Data Segment}
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
158 TreeVNCには、Multicastを利用して起動しているTreeVNCのRoot Nodeの情報の一覧にして表示する接続先自動検索システムという機能がある。この機能によりTreeVNCの起動の際にIPアドレスを入力する手間を省くことができる。
cf3a4335c64a add source code and modify chapters
gi
parents: 0
diff changeset
159
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
160 現在のAliceは起動時にTopology ManagerのIPアドレスを入力する必要があり、TreeVNCの接続先自動検索機能が必要と考えられる。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
161 その機能を実現するためにはMulticastに対応する必要がある。そこで、同じマルチキャストアドレスを持つ端末を1つのData Segmentとして扱うMuticast Data Segmentを追加した。
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
162 Multicast Data Segmentも他のData Segment同様、Data Segment APIを用いて扱う。
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
163
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
164 \begin{figure}[htbp]
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
165 \begin{center}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
166 \includegraphics[width=120mm]{images/multicast.pdf}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
167 \end{center}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
168 \caption{Multicast Data Segment}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
169 \label{fig:multicast}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
170 \end{figure}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
171
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
172 図 \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
173 \subsection{Multicast Data Segmentの制限}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
174 Multicast Data SegmentはUDPを用いて実装されている。1つのUDPのパケットで運ぶことのできるデータが、65507bytes(65535bytesからIPヘッダの最低サイズ20bytesとUDPのヘッダのサイズ8bytesを引いた大きさ)である。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
175 現状、分割して送る処理をMulticast Data Segmentが持たない。従って、Multicast Data Segmentを利用する際には、データのサイズを65507bytes以下にしなければならない。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
176 \subsection{Multicast Data Segment Manager}
5
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
177 Multicast Data SegmentもRemote Data Segment同様Managerを経由して操作を行う。Multicast DSMを作成するとMulticast Data Segmentに対する送受信用のスレッドが作成される。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
178
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
179 \begin{itemize}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
180 \item {\ttfamily public static MulticastDataSegmentManager \\
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
181 connectMulticast(String connectionKey ,String MCSTADDR, int port, String nis, SocketType type)}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
182 \end{itemize}
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
183
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
184 DataSegment classのstaticメソッドである、connectMulticastを呼ぶことでMulticast DSMが作成される。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
185 第1引数はMulticast DSMへのアクセスするためのkeyを指定できる。第2引数はマルチキャストアドレスを、第3引数はポート番号を、第4引数はネットワークインターフェイスを指定する。第5引数はSocketTypeを指定する。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
186 SocketTypeには、{\tt Sender}と{\tt Receiver}と{\tt Both}が存在する。{\tt Sender}を指定した場合は、第2引数で指定したマルチキャストアドレスに対して送信処理を行うスレッドを作成する。{\tt Receiver}を指定した場合は、第2引数で指定したマルチキャストアドレスに対して送信されたデータを受信するスレッドを作成する。{\tt Both}は、送受信両方のスレッドを作成する。
c8f50c3ead48 modify chapter3
sugi
parents: 4
diff changeset
187
6
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
188 現在、Multicast Data Segmentは自動では作成されないため、ユーザー自身で作成する必要がある。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
189
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
190 ソースコード \ref {src:MulticastStartCodeSegment}と\ref {src:MulticastIncrement}は実際にMulticast Data Segmentを利用した例題である。例題の内容はmulticast Data Segmentに対してtakeを行い、取得したデータをインクリメントして再びputを行うものである。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
191
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
192 Multicast DSMを作成する際のSocketTypeの引数はBothであるため、ReceiverとSender両方作成される。そのため、"multicast"というkeyに対してputを行うと、自分自身に対してもData Segmentがputされる。takeもまた同様に自分自身に対してもtakeが要求され、要求に対してreplyを返すことになる。
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
193 \begin{table}[htbp]
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
194 \lstinputlisting[label=src:MulticastStartCodeSegment, caption=multicast DSMの作成例]{source/MulticastStartCodeSegment.java}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
195 \end{table}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
196
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
197 \begin{table}[htbp]
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
198 \lstinputlisting[label=src:MulticastIncrement, caption=multicast Data Segmentの使用例]{source/MulticastIncrement.java}
3c415702fab0 modify chapter3
sugi
parents: 5
diff changeset
199 \end{table}