Mercurial > hg > Papers > 2014 > taninari-master
comparison paper/chapter3.tex @ 26:aec4085dd5db
update
author | Taninari YU <you@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 04 Feb 2014 03:50:01 +0900 |
parents | 2d6118b66367 |
children | 7149e38f717c |
comparison
equal
deleted
inserted
replaced
25:2d6118b66367 | 26:aec4085dd5db |
---|---|
1 \chapter{画面共有システムTreeVNCの設計} | 1 \chapter{画面共有システムTreeVNCの設計} |
2 | 2 |
3 \section{木構造を用いたTreeVNCの設計} | 3 \section{木構造を用いたTreeVNCの設計} |
4 多人数が参加している授業でVNCを使う場合に起こる問題は、一つのコンピュータに多人数が繋がり、処理が集中してしまって、性能が大幅に落ちてしまうところである(図\ref{fig:vnc})。 | 4 多人数が参加している授業でVNCを使う場合に起こる問題は、一つのコンピュータに多人数で同時につながり、処理が集中してしまって、性能が大幅に落ちてしまうところである(図\ref{fig:vnc})。 |
5 多人数の同時接続を可能にするには、一極集中で接続するのではなく、Node同士で負荷を分散させることによって実現できるのではないかと考えた。\\ | 5 多人数の同時接続を可能にするには、一極集中で接続するのではなく接続を分散させることが必要である。そこで、Node同士で接続を行うことによって負荷分散をすることが実現できるのではないかと考えた。\\ |
6 負荷分散を行う際、Node同士どのようなトポロジを組むのが適切か検討した結果、上から流れてきたデータを下のNodeへと伝えていくことのできる木構造が良いと考えた。\\ | 6 負荷分散を行う際、Node同士どのようなトポロジを組むのが適切か検討した結果、上から流れてきたデータを下のNodeへと伝えていくことのできる木構造が良いと考えた。\\ |
7 今回行った設計ではNodeを木構造に接続させデータを流すためにサーバとNodeの間にRoot Node(サーバとNodeの通信を仲介するもの)を設置する方式をとった。Root Nodeは主にNodeの管理とServerから流れてきた画像データの管理を担当する。\\ | 7 今回行った設計ではNodeを木構造に接続させデータを流すためにサーバとNodeの間にRoot Node(サーバとNodeの通信を仲介するもの)を設置する方式をとった。Root Nodeは主にNodeの管理とServerから流れてきた画像データの管理を担当する。\\ |
8 木構造で設計したものを(図\ref{fig:treestructure})に示す。\\ | 8 木構造で設計したものを(図\ref{fig:treestructure})に示す。\\ |
9 | 9 |
10 | 10 |
26 \end{figure} | 26 \end{figure} |
27 | 27 |
28 \newpage | 28 \newpage |
29 | 29 |
30 \section{TreeVNCの原理} | 30 \section{TreeVNCの原理} |
31 従来VNCでは、一極集中型でサーバに接続してしまうのでサーバに負荷がかかって性能を低下させたり停止してしまっている。そこでNodeを木構造に配置させることで、サーバへの負荷が減る。 | 31 従来のVNCとTreeVNCの構造を比較した図を(図\ref{fig:comparenormalandtree})に示す。\\ |
32 従来VNCとTreeVNCの構造を比較した図を(図\ref{fig:comparenormalandtree})に示す。\\ | |
33 | 32 |
34 \begin{figure}[!htbp] | 33 \begin{figure}[!htbp] |
35 \begin{center} | 34 \begin{center} |
36 \includegraphics[width=130mm]{./images/comparenormalandtree.pdf} | 35 \includegraphics[width=130mm]{./images/comparenormalandtree.pdf} |
37 \end{center} | 36 \end{center} |
39 \label{fig:comparenormalandtree} | 38 \label{fig:comparenormalandtree} |
40 \end{figure} | 39 \end{figure} |
41 | 40 |
42 | 41 |
43 (表\ref{tb:oneporttraffic})はポート一本あたりの通信量である。\\ | 42 (表\ref{tb:oneporttraffic})はポート一本あたりの通信量である。\\ |
44 表から推察できるように、ポート一本あたりの負荷は通常のVNCの場合はNode数に比例して増えている。しかしTreeVNCの場合はTreeの子供の数が一定なので、Node数に関係なく一定である。\\ | 43 表から推察できるように、ポート一本あたりの負荷は従来のVNCの場合はNode数に比例して増えている。しかしTreeVNCの場合はTreeの子供の数が一定なので、Node数に関係なく一定である。\\ |
45 送信する量も通常のVNCの場合Node数に比例した量のデータ送信しなければならいので、CPUに負荷がかかり性能が低下したり停止したりしている。\\ | 44 送信する量も通常のVNCの場合、Node数に比例した量のデータ送信しなければならいので、CPUに負荷がかかり性能が低下したり停止したりしている。\\ |
46 対してTreeVNCはが増えても配信するデータは一定なので性能が低下せず使用することができる。 | 45 対してTreeVNCはが増えても配信するデータは一定なので性能が低下せず使用することができる。 |
47 | 46 |
48 \begin{table}[htbp] | 47 \begin{table}[htbp] |
49 \caption{ポート一本あたりの通信量(NはNode数、MはTreeの子供の数)} | 48 \caption{ポート一本あたりの通信量(NはNode数、MはTreeの子供の数)} |
50 \label{tb:oneporttraffic} | 49 \label{tb:oneporttraffic} |
51 \begin{center} | 50 \begin{center} |
52 \begin{tabular}{|c|c|c|} \hline | 51 \begin{tabular}{|c|c|c|} \hline |
53 & 通常のVNC & TreeVNC \\ \hline | 52 & 従来のVNC & TreeVNC \\ \hline |
54 通信量 & N * データ量 & (M + 1) * データ量 \\ \hline | 53 通信量 & N * データ量 & (M + 1) * データ量 \\ \hline |
55 \end{tabular} | 54 \end{tabular} |
56 \end{center} | 55 \end{center} |
57 \end{table} | 56 \end{table} |
58 | 57 |
59 | 58 \newpage |
60 | 59 |
61 %\section{画面拡大縮小} | 60 %\section{画面拡大縮小} |
62 %\section{画面描画範囲の指定} | 61 %\section{画面描画範囲の指定} |
63 | 62 |
64 \subsection{木の生成} | 63 \subsection{木の生成} |
65 負荷を分散させるために木構造を用いるので、Nodeをツリー状に接続する仕組みが必要である。TreeVNCでは、以下の点順で、木の構成を行う。\\ | 64 負荷を分散させるために木構造を用いるので、Nodeをツリー状に接続する仕組みが必要である。TreeVNCでは、以下の手順で、木の構成を行う。 |
66 図\ref{fig:createtree}は、2分木で木を構成する際の手続きを示したシーケンスダイアグラムである。\\ | 65 図\ref{fig:createtree}は、2分木で木を構成する際の手続きを示したシーケンスダイアグラムである。\\ |
67 1.初めにNodeはRoot Nodeに接続先IPを尋ねる(Where connect)。\\ | 66 1.初めにNodeはRoot Nodeに接続先IPを尋ねる(Where to connect?)。\\ |
68 2.Root Nodeは、Nodeに接続するべきホストのIPを引き渡す(Answer)。\\ | 67 2.Root Nodeは、Nodeに接続するべきホストのIPを引き渡す(Answer)。\\ |
69 3.Nodeは指定されたホストに接続する(Connect)。 | 68 3.Nodeは指定されたホストに接続する(Connect)。 |
70 | 69 |
71 \begin{figure}[!htbp] | 70 \begin{figure}[!htbp] |
72 \begin{center} | 71 \begin{center} |
116 | 115 |
117 | 116 |
118 \newpage | 117 \newpage |
119 \section{表示画面の切り替え} | 118 \section{表示画面の切り替え} |
120 VNCを使用して画面共有を行う場合、授業では、唯一講師の画面を共有する。しかし、ゼミなど発表者が多数いる場合は画面共有の対象を切り替えたいことがある。画面共有対象の切り替えを行う場合、発表者ごとにサーバを立ち上げ直さなければならないという問題が発生する。そこで、ユーザ側からRoot Nodeにリクエストを出して、画面共有の対象を切り替える機能が必要になる。 | 119 VNCを使用して画面共有を行う場合、授業では、唯一講師の画面を共有する。しかし、ゼミなど発表者が多数いる場合は画面共有の対象を切り替えたいことがある。画面共有対象の切り替えを行う場合、発表者ごとにサーバを立ち上げ直さなければならないという問題が発生する。そこで、ユーザ側からRoot Nodeにリクエストを出して、画面共有の対象を切り替える機能が必要になる。 |
121 画面を切り替えるときは、Root Nodeだけが接続を切り替え、他のNodeのトポロジの変更はない(図\ref{fig:change})。 | 120 TreeVNCで画面を切り替えるときは、Root Nodeだけが接続を切り替え、他のNodeのトポロジの変更はない(図\ref{fig:change})。 |
122 | 121 |
123 \begin{figure}[!htbp] | 122 \begin{figure}[!htbp] |
124 \begin{center} | 123 \begin{center} |
125 \includegraphics[width=100mm]{./images/changeserver.pdf} | 124 \includegraphics[width=100mm]{./images/changeserver.pdf} |
126 \end{center} | 125 \end{center} |
129 \end{figure} | 128 \end{figure} |
130 画面の切替をどのユーザが行うのかという問題がある。Root Nodeに対してユーザが毎回IPアドレスを入力して切り替えるのはUserInterface的によくない。そこで、Node側に画面切り替えを行うボタンを設置し、ボタンを押すとRoot Nodeに自分の画面へ切り替えるように命令を出しRoot Nodeが了承すると画面が切り替わるように設計した。 | 129 画面の切替をどのユーザが行うのかという問題がある。Root Nodeに対してユーザが毎回IPアドレスを入力して切り替えるのはUserInterface的によくない。そこで、Node側に画面切り替えを行うボタンを設置し、ボタンを押すとRoot Nodeに自分の画面へ切り替えるように命令を出しRoot Nodeが了承すると画面が切り替わるように設計した。 |
131 | 130 |
132 \newpage | 131 \newpage |
133 \section{マルチディスプレイの対応} | 132 \section{マルチディスプレイの対応} |
134 マルチディスプレイを用いてVNCを行うと、すべてのディスプレイのデータが繋がって表示されてしまう。通常発表などに使用されるディスプレイは一つである。すべての画面のデータを送ってしまうとその分だけ無駄なデータを送っていることになる。そこで、発表用に使用する画面のデータだけを送ることのできるようにディスプレイを指定する機能が必要になる。 | 133 マルチディスプレイを用いてVNCを行うと、すべてのディスプレイのデータが繋がって表示されてしまう。通常、発表などに使用されるディスプレイは一つである。すべての画面のデータを送ってしまうとその分だけ無駄なデータを送っていることになる。そこで、発表用に使用する画面のデータだけを送ることのできるようにディスプレイを指定する機能が必要になる。 |
135 | 134 |
136 | 135 |
137 \section{木の再構成} | 136 \section{木の再構成} |
138 木を構成することはできたが途中のNodeが切断してしまった場合に木を再構成しなければならない。 | 137 TreeVNCは木構造で接続しているので親Nodeが切断してしまった場合に木を再構成しなければならない。 |
139 木を再構成する手順は以下の用に行う。 | 138 木を再構成する手順は以下のようにして行う。 |
140 \begin{enumerate} | 139 \begin{enumerate} |
141 \item 子供のリーダー(最初に親につないだ子供)が親が落ちたことをRoot Nodeに対して報告する。 | 140 \item 子供のリーダー(最初に親につないだ子供)が親が落ちたことをRoot Nodeに対して報告する。 |
142 \item Root Nodeは報告を受けると番号の一番大きいNode(最後のNode)に対して落ちた親の代\ | 141 \item Root Nodeは報告を受けると番号の一番大きいNode(最後のNode)に対して落ちた親の代わりになるように報告する。 |
143 わりになるように報告する。 | |
144 \item Root Nodeから命令を受けたNodeは指定されたNodeに接続をしなおす。 | 142 \item Root Nodeから命令を受けたNodeは指定されたNodeに接続をしなおす。 |
145 \item Root NodeはNodeのリストを更新して、親が落ちた子供たちに新しい親の情報を教える。 | 143 \item Root NodeはNodeのリストを更新して、親が落ちた子供たちに新しい親の情報を教える。 |
146 \item 親が切断された子供たちは、Root Nodeからもらった情報を元に新しい親に対して接続を行う。 | 144 \item 親が切断された子供たちは、Root Nodeからもらった情報を元に新しい親に対して接続を行う。 |
147 \end{enumerate} | 145 \end{enumerate} |
148 このようにして木を再構成することができる。 | 146 このようにして木を再構成することができる。 |
178 \label{fig:reconnection2} | 176 \label{fig:reconnection2} |
179 \end{figure} | 177 \end{figure} |
180 | 178 |
181 6:replyChildlen()は、親が切断した子供たちに対して新しい親の情報を報告する関数である。\\ | 179 6:replyChildlen()は、親が切断した子供たちに対して新しい親の情報を報告する関数である。\\ |
182 | 180 |
183 7:reConnection()はRoot Nodeから来た情報をもとにVNC接続を行う関数である。 | 181 7:reConnection()はRoot Nodeから来た情報をもとにVNC接続を行う関数である。\\ |
184 | 182 |
185 以上の関数を用いることでNodeが落ちても木を再構成することができる。 | 183 以上の関数を用いることでNodeが落ちても木を再構成することができる。 |
186 | 184 |
187 \newpage | 185 \newpage |
188 | 186 |
232 MultiCastQueueを使ってデータ取得ときに問題が発生した。 | 230 MultiCastQueueを使ってデータ取得ときに問題が発生した。 |
233 接続してきたNodeがデータを取得しない状況、例えばサスペンド状態になったときにRoot Nodeのメモリの中にデータが残り続けるというものである。 | 231 接続してきたNodeがデータを取得しない状況、例えばサスペンド状態になったときにRoot Nodeのメモリの中にデータが残り続けるというものである。 |
234 メモリにデータが残り続けるとMemory Over Flowを起こしてしまう。 | 232 メモリにデータが残り続けるとMemory Over Flowを起こしてしまう。 |
235 その様子を図\ref{fig:TimeOut}を用いて説明する。 | 233 その様子を図\ref{fig:TimeOut}を用いて説明する。 |
236 Parentは流れてきたFramebufferUpdateをMulticastQueueの中に追加して行く。 | 234 Parentは流れてきたFramebufferUpdateをMulticastQueueの中に追加して行く。 |
237 MulticastQueは要素ごとにCountDownLatchを持っていて、Childがデータを読み込むとCountDownを行い。Countが0になるとデータを削除する。 | 235 MulticastQueueは要素ごとにCountDownLatchを持っていて、Childがデータを読み込むとCountDownを行い、Countが0になるとデータを削除する。 |
238 ParentはChildが画像を受け取るまでMulticastQueueの中に持っているFramebufferUpdateを削除することができない。 | 236 ParentはChildが画像を受け取るまでMulticastQueueの中に持っているFramebufferUpdateを削除することができない。 |
239 Childがサスペンド状態になった場合、MulticastQueueの中にあるFramebufferUpdateを削除することができないのでメモリを圧迫してしまいMemory Over Flowを起こしてしまう。 | 237 Childがサスペンド状態になった場合、MulticastQueueの中にあるFramebufferUpdateを削除することができないのでメモリを圧迫してしまいMemory Over Flowを起こしてしまう。 |
240 そこで、ある一定の時間が経過すると代わりにデータを取得してくれるTimeOut用のスレッドを作成した。 | 238 そこで、ある一定の時間が経過すると代わりにデータを取得してくれるTimeOut用のスレッドを作成した。 |
241 TimeOutスレッドはサスペンドしているNodeの代わりにFramebufferUpdateを取得する。 | 239 TimeOutスレッドはサスペンドしているNodeの代わりにFramebufferUpdateを取得する。TimeOutスレッドによりMemory Over Flowを防ぐことができる。 |
242 | 240 |
243 | 241 |
244 \begin{figure}[tb] | 242 \begin{figure}[tb] |
245 \begin{center} | 243 \begin{center} |
246 \includegraphics[scale = 0.9]{images/TimeOut.pdf} | 244 \includegraphics[scale = 0.9]{images/TimeOut.pdf} |
254 | 252 |
255 \newpage | 253 \newpage |
256 | 254 |
257 | 255 |
258 \section{圧縮の問題} | 256 \section{圧縮の問題} |
259 VNCで扱うRFB プロトコルには、使えるエンコーディングのタイプの1つとしてZRLE(Zlib Run-Length Encoding)がある。 | 257 RFBの使えるエンコーディングタイプの1つとして、ZRLE(Zlib Run-Length Encoding)がある。 |
260 ZRLEはZlibで圧縮されたデータとそのデータのバイト数がヘッダーとして付けられ送られてくる。 | 258 ZRLEはZlibで圧縮されたデータとそのデータ長さがヘッダーとして付けられ送られてくる。 |
261 Zlibはフリーのデータ圧縮及び解凍を行うライブラリである。 | 259 Zlibはフリーのデータ圧縮及び解凍を行うライブラリである。 |
262 可逆圧縮アルゴリズムの圧縮と解凍が行えるjava.util.zip.deflaterとjava.util.zip.inflaterを実装している。 | 260 可逆圧縮アルゴリズムの圧縮と解凍が行えるjava.util.zip.deflaterとjava.util.zip.inflaterを実装している。 |
263 | 261 |
264 \subsection{java.util.zip.deflaterの実装の問題} | 262 \subsection{java.util.zip.deflaterの実装の問題} |
265 Zlib圧縮は辞書を持っていて、その辞書に登録されているデータを元に解凍が行われる(図\ref{fig:ZRLE})。 | 263 Zlib圧縮は辞書を持っていて、その辞書に登録されているデータを元に解凍が行われる(図\ref{fig:ZRLE})。 |
312 \label{fig:ZRLEE} | 310 \label{fig:ZRLEE} |
313 \end{figure} | 311 \end{figure} |
314 | 312 |
315 | 313 |
316 \subsection{接続先自動検索システム} | 314 \subsection{接続先自動検索システム} |
317 NodeがRoot Nodeに接続する際、Root NodeのIPアドレスを指定する必要がある。IPアドレスを毎回入力するのは手間がかかる上、間違うと接続することができない。\\ | 315 NodeがRoot Nodeに接続する際、Root NodeのIPアドレスを指定する必要がある。IPアドレスを毎回入力するのは手間がかかる上、間違う可能性もあるのでよくない。 |
318 そこで、Nodeが起動した際に、起動しているTreeVNCのRoot Nodeを検索し、IPアドレスの情報を取得し、一覧にして選択させることによって直接アドレスを手入力する必要がなくなる。\\ | 316 そこで、Nodeが起動した際に、起動しているTreeVNCのRoot Nodeを検索し、IPアドレスの情報を取得し、一覧にして選択して接続できるようにすることで、直接アドレスを手入力する必要がなくなる。 |
319 TreeVNCのRoot Nodeを検索する際には、Broadcast通信を用いることによって実現することができる。\\ | 317 TreeVNCのRoot Nodeを検索する際には、Broadcast通信を用いることによって実現することができる。 |
320 | 318 |
321 | 319 |
322 | 320 |
323 | 321 |
324 | 322 |
325 | 323 |
326 | 324 |
327 | 325 |