annotate chapter3.tex @ 4:14e96778c600

update
author oc
date Mon, 16 Feb 2015 01:03:14 +0900
parents 63ae5aaa2a7a
children 1bc81f8b7517
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
1 \chapter{TreeVNC のリファクタリング}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
2
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
3 \section{動的な port 番号の指定}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
4 TreeVNCは複雑な分散アルゴリズムを用いたシステムであり、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
5 デバッグを行う環境を整える必要がある。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
6
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
7 従来のTreeVNCでは、固定port番号を複数利用していた。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
8 port番号は一意なので、1台で複数のTreeVNCを立ち上げることができない。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
9
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
10 動的にport番号を割り当てることで、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
11 1つのnodeに対して複数のTreeVNCを起動することを可能にした。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
12 最低限のソケットポートを開けることによって、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
13 メモリの使用量を抑えることにも繋がる。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
14
4
oc
parents: 3
diff changeset
15 以下に、動的に port 番号を割り当てているソースコードを記述する。
oc
parents: 3
diff changeset
16
oc
parents: 3
diff changeset
17 % selectPort する箇所を記述する
oc
parents: 3
diff changeset
18
oc
parents: 3
diff changeset
19 \begin{lstlisting}[caption=オプション--fixSize,label=fixsize]
oc
parents: 3
diff changeset
20 public int selectPort(int p) {
oc
parents: 3
diff changeset
21 int port = p;
oc
parents: 3
diff changeset
22 while (true) {
oc
parents: 3
diff changeset
23 try {
oc
parents: 3
diff changeset
24 servSock = new ServerSocket(port);
oc
parents: 3
diff changeset
25 acceptPort = port;
oc
parents: 3
diff changeset
26 myAddress = "127.0.0.1";
oc
parents: 3
diff changeset
27 nets.getNetworkInterfaces();
oc
parents: 3
diff changeset
28 break;
oc
parents: 3
diff changeset
29 } catch (BindException e) {
oc
parents: 3
diff changeset
30 port++;
oc
parents: 3
diff changeset
31 continue;
oc
parents: 3
diff changeset
32 } catch (SocketException e) {
oc
parents: 3
diff changeset
33 e.printStackTrace();
oc
parents: 3
diff changeset
34 } catch (IOException e) {
oc
parents: 3
diff changeset
35 e.printStackTrace();
oc
parents: 3
diff changeset
36 }
oc
parents: 3
diff changeset
37 }
oc
parents: 3
diff changeset
38 System.out.println("accept port = " + port);
oc
parents: 3
diff changeset
39 return port;
oc
parents: 3
diff changeset
40 }
oc
parents: 3
diff changeset
41 \end{lstlisting}
oc
parents: 3
diff changeset
42
oc
parents: 3
diff changeset
43
3
oc
parents: 1
diff changeset
44 % messageの説明にportにどんな関係があるのかとから
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
45 以前は固定port番号を使用しmessageの通信を行っていたが、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
46 一意なportを割り当てられているnodeが通信を行うことによって、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
47 どのport番号が使用されているかを意識する必要がなくなった。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
48
4
oc
parents: 3
diff changeset
49 \newpage
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
50
3
oc
parents: 1
diff changeset
51 \section{QUALITYモードとSPEEDモード}
oc
parents: 1
diff changeset
52
oc
parents: 1
diff changeset
53 高解像度のまま拡大・縮小の処理を行うと、
oc
parents: 1
diff changeset
54 PCのスペックによって描画処理に時間がかかってしまうことがある。
oc
parents: 1
diff changeset
55 授業中に TreeVNC を使用する際、
oc
parents: 1
diff changeset
56 拡大・縮小をしてしまうと描画処理が重くなり遅延が生じていた。
oc
parents: 1
diff changeset
57
oc
parents: 1
diff changeset
58 画像描画処理には、品質優先( QUALITY モード)・スピード優先( SPEED モード)がある。
oc
parents: 1
diff changeset
59 今まで TreeVNC は基本的に QUALITY モードを設定していた。
oc
parents: 1
diff changeset
60
oc
parents: 1
diff changeset
61 どちらのモードを使用するかをビューワから変更出来るようにした。
oc
parents: 1
diff changeset
62 これにより、描画処理の遅延を解決することができた。
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
63
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
64
4
oc
parents: 3
diff changeset
65 \section{ホスト切り替え時の挙動の修正}
oc
parents: 3
diff changeset
66 画面の切り替えを行う際、新しいホスト側の画面に生じた
oc
parents: 3
diff changeset
67 ビデオフィードバックが他のユーザに配信されてしまう問題があった。
oc
parents: 3
diff changeset
68
oc
parents: 3
diff changeset
69 ホストの切り替えの際、
oc
parents: 3
diff changeset
70 新しいホスト側のviewerを閉じることで問題を解決した。
oc
parents: 3
diff changeset
71
oc
parents: 3
diff changeset
72
oc
parents: 3
diff changeset
73 \newpage
oc
parents: 3
diff changeset
74
oc
parents: 3
diff changeset
75
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
76 \section{Tree の構成の変更}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
77
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
78 従来のTreeVNCは、クライアントの接続する木構造が単一であった。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
79 そのため、ネットワークインターフェースが違うクライアントが
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
80 同じ木に混在している状況が生じた。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
81 速度の遅いクライアントが木に存在すると、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
82 そのクライアント以下の通信速度が遅くなってしまう。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
83
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
84 この問題を解決するために、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
85 図\ref{fig:multinetworktree}の様に、ネットワークインターフェース別に
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
86 木構造を形成するように設計した。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
87
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
88 TreeVNCは、rootがnodeListというリストを保持し、木構造を管理している。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
89 複数のネットワークインターフェースで木構造を形成する場合、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
90 このnodeListをネットワークインターフェース毎に作成しておく。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
91 新しいnodeを接続する際、nodeのネットワークインターフェースを取得し、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
92 どのnodeListに登録されるかが決まる。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
93 こうすることによって、TreeVNCを複数のネットワークインターフェイス別に
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
94 木構造を構成することができる。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
95
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
96 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
97 \begin{center}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
98 \includegraphics[scale=0.4]{./images/chapter3/MultiNetworkTree.pdf}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
99 \end{center}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
100 \caption{Multi Network Tree}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
101 \label{fig:multinetworktree}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
102 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
103
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
104
3
oc
parents: 1
diff changeset
105 \newpage
oc
parents: 1
diff changeset
106
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
107 \section{切断時の検知方法の変更}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
108
3
oc
parents: 1
diff changeset
109 接続していたクライアントとの接続が切れた際の検知方法を変更した。
oc
parents: 1
diff changeset
110
oc
parents: 1
diff changeset
111 root は nodeList という TreeVNC のネットワークトポロジーを管理するためのリストを持っている。
oc
parents: 1
diff changeset
112 root は TreeVNC の接続処理の全てを担っている。
oc
parents: 1
diff changeset
113 %node が切断された場合、 root は TreeVNC の木構造を崩さないように切断を検知し、
oc
parents: 1
diff changeset
114 %木構造を崩さないよう、 node 同士の接続を再構成しなければならない。
oc
parents: 1
diff changeset
115 node の接続が切れた場合、代わりとなる node の接続が必要となるため root に知らせなければならない。
oc
parents: 1
diff changeset
116
oc
parents: 1
diff changeset
117 変更前は、lostParent という検知方法を採用していた。
oc
parents: 1
diff changeset
118 この方法は、親となる node の接続が切れた場合、
oc
parents: 1
diff changeset
119 子となる node から root に対して lostParent message を送信する。
oc
parents: 1
diff changeset
120 これにより root は lostParent を検知し、代替 node の接続を行う。
oc
parents: 1
diff changeset
121
4
oc
parents: 3
diff changeset
122 以下に、lostParent の検知・再接続方法を記述する。
oc
parents: 3
diff changeset
123
oc
parents: 3
diff changeset
124 \begin{itemize}
oc
parents: 3
diff changeset
125 \item 親 node の接続が切れる
oc
parents: 3
diff changeset
126 \item 切れた親 node に接続していた子 node が root に LOST\_PARENT message を送信する
oc
parents: 3
diff changeset
127 \item root が nodeList の更新を行う
oc
parents: 3
diff changeset
128 \item 切れた親 node の代わりに、nodeList の最後尾 node を配置する
oc
parents: 3
diff changeset
129 \item 親 node を失った子 node は、新しい親 node に接続する
oc
parents: 3
diff changeset
130 \end{itemize}
oc
parents: 3
diff changeset
131
3
oc
parents: 1
diff changeset
132 この方法では、子のいない末端の node の接続が切れた際に root にメッセージが送信されない。
oc
parents: 1
diff changeset
133 root は切断を検知できないと、nodeList の更新を行うことができない。
oc
parents: 1
diff changeset
134 nodeList が正しく更新されない場合、図\ref{fig:lostparent}のように、
oc
parents: 1
diff changeset
135 新しい node を既に切断されている node に接続しようと試み、失敗してしまう。
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
136
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
137 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
138 \begin{center}
3
oc
parents: 1
diff changeset
139 \includegraphics[scale=0.7]{./images/chapter3/lostParent.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
140 \end{center}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
141 \caption{lostParent}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
142 \label{fig:lostparent}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
143 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
144
4
oc
parents: 3
diff changeset
145 \newpage
oc
parents: 3
diff changeset
146
3
oc
parents: 1
diff changeset
147 末端 node の切断が検知できない問題を解決するために、
oc
parents: 1
diff changeset
148 lostChild という検知方法に変更した。
oc
parents: 1
diff changeset
149
4
oc
parents: 3
diff changeset
150 TreeVNC は、画像データ(framebufferUpdate)が MulticastQueue という Queue に蓄積される。
3
oc
parents: 1
diff changeset
151 node はこの Queue から画像データを取得し、描画している。
oc
parents: 1
diff changeset
152 lostChild の検出方法は、この MulticastQueue を使用している。
oc
parents: 1
diff changeset
153 ある一定時間、MulticastQueue から画像データが取得されない場合、
4
oc
parents: 3
diff changeset
154 その node との接続が切れたと判断することができる。
oc
parents: 3
diff changeset
155
oc
parents: 3
diff changeset
156 以下に、lostChild の検知・再接続方法を記述する。
3
oc
parents: 1
diff changeset
157
4
oc
parents: 3
diff changeset
158 \begin{itemize}
oc
parents: 3
diff changeset
159 \item 子 node の切断を検知した node が root へ LOST\_CHILD message を送信する(図\ref{fig:lostchild1}中, 1:)
oc
parents: 3
diff changeset
160 \item LOST\_CHILD message を受け取った root は nodeList の更新を行う(図\ref{fig:lostchild1}中, 2:)
oc
parents: 3
diff changeset
161 \item 切断した node を nodeList から消し、nodeList の最後尾の node に切断した node number を割り当てる
oc
parents: 3
diff changeset
162 \item root は最後尾の node に、切断した子 node が接続していた親 node に接続する様に CONNECT\_TO message を送信する(図\ref{fig:lostchild1}中, 3:)
oc
parents: 3
diff changeset
163 \item 最後尾の node が子 node を失った親 node へ接続しに行く(図\ref{fig:lostchild1}中, 4:)
oc
parents: 3
diff changeset
164 \end{itemize}
3
oc
parents: 1
diff changeset
165
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
166 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
167 \begin{center}
3
oc
parents: 1
diff changeset
168 \includegraphics[scale=0.7]{./images/chapter3/lostChild1.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
169 \end{center}
3
oc
parents: 1
diff changeset
170 \caption{lostChild を検知・再接続}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
171 \label{fig:lostchild1}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
172 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
173
4
oc
parents: 3
diff changeset
174 \newpage
oc
parents: 3
diff changeset
175
oc
parents: 3
diff changeset
176 lostChild を検知することより、
oc
parents: 3
diff changeset
177 切断されてしまった全ての node を検知することができるので、
oc
parents: 3
diff changeset
178 nodeList の更新が正しく行われる。
oc
parents: 3
diff changeset
179
oc
parents: 3
diff changeset
180 新しい node からの接続要求 WHERE\_TO\_CONNECT message に対して、
oc
parents: 3
diff changeset
181 適切な node への接続を提供することができる(図\ref{fig:lostchild2}中, 1,2:)。
oc
parents: 3
diff changeset
182
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
183 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
184 \begin{center}
3
oc
parents: 1
diff changeset
185 \includegraphics[scale=0.7]{./images/chapter3/lostChild2.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
186 \end{center}
3
oc
parents: 1
diff changeset
187 \caption{新 node の接続}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
188 \label{fig:lostchild2}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
189 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
190