changeset 22:0f95ad78a36c

update chapter2 and add multinetworkTree img
author riono <e165729@ie.u-ryukyu.ac.jp>
date Fri, 14 Feb 2020 03:36:26 +0900
parents fa92cb03dac1
children e18aecd16936
files FinalThesis/chapter2.tex FinalThesis/fig/MultiNetworkTree.graffle FinalThesis/fig/MultiNetworkTree.pdf FinalThesis/main.pdf riono-thesis.mm
diffstat 5 files changed, 30 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/FinalThesis/chapter2.tex	Thu Feb 13 21:01:10 2020 +0900
+++ b/FinalThesis/chapter2.tex	Fri Feb 14 03:36:26 2020 +0900
@@ -38,7 +38,7 @@
 
 送信されるデータは従来の方法だとN個のノードに対してN-1回の通信が必要である。これはバイナリツリー状の構造を持っているTreeVNCでも通信の数は変わらない。
 
-バイナリツリーのルートのノードをRoot Nodeと呼び、そこに接続されるノードをNodeと呼ぶ。Root Nodeは子Nodeにデータを渡す機能、各Nodeの管理、VNCサーバから送られてきたデータの管理を行っている。各Nodeは、親Nodeから送られてきたデータを自身の子Nodeに渡す機能、子Nodeから送られてきたデータを親Nodeに渡す機能がある。
+木構造のルートのノードをRoot Nodeと呼び、そこに接続されるノードをNodeと呼ぶ。Root Nodeは子Nodeにデータを渡す機能、各Nodeの管理、VNCサーバから送られてきたデータの管理を行っている。各Nodeは、親Nodeから送られてきたデータを自身の子Nodeに渡す機能、子Nodeから送られてきたデータを親Nodeに渡す機能がある。
 
 \section{TreeVNCの通信プロトコル}
 TreeVNCの通信経路としては以下が挙げられる。
@@ -94,7 +94,13 @@
 
 \section{MulticastQueue}
 配信側の画面が更新されると、VNCサーバから画面データがFRAME\_BUFFER\_UPDATEメッセージとして送らる。その際、画像データの更新を同時に複数のNodeに伝えるためにMulticastQueueというキューにデータを蓄積している。
-各Nodeはこのキューから画像データを取得し、画面の描画を行う。
+
+各NodeはMulticastQueueからデータを取得するスレッドを持つ。MulticastQueueは複数のスレッドから使用される。
+MulticastQueueはjava.util.concurrent.CountDownLatchを用いて実装されている。CountDownLatchとはjavaの並列実行用に用意されたAPIで、他のスレッドで実行中の操作が完了するまで、複数のスレッドを待機させることができるクラスである。スレッドを解放するカウントを設定することができ、カウントが0になるまでawaitメソッドでスレッドをブロックすることができる。
+
+TreeVNCでは、親NodeがMulticastQueueを持っており、接続されている子Nodeの数だけ画像データにカウントを設定する。子Nodeが画像データを取得すると、そのカウントが減る。接続している全ての子Nodeが画像データを取得するとカウントが0になり、MulticastQueueから画像データが削除される。
+
+\newpage
 
 \section{木の再構成}
 TreeVNCはバイナリツリー状での接続のため、Nodeが切断されたことを検知できずにいると構成した木構造が崩れてしまい、新しいNodeを適切な場所に接続できなくなってしまう。そこで木構造を崩さないよう、Node同士の接続の再構成を行う必要がある。
@@ -102,7 +108,7 @@
 TreeVNCの木構造の接続形態はRoot Nodeが持っているnodeListというリストで管理している。nodeList内のtreeNumという値が各Nodeに割り当てられており、これによって木構造のどの位置にNodeが接続されているかの判別が可能である。
 よって、Nodeの接続が切れた場合Root Nodeに切断を知らせなければならない。TreeVNCはLOST\_CHILDというメッセージ通信で、Node切断の検知および木構造の再構成を行っている。
 
-LOST\_CHILDの検出方法には、MulticastQueueを用いている。ある一定時間MulticastQueueから画像データが取得されない場合MemoryOverFlowを回避するためにTimeoutスレッドが用意されている。Timeoutを検知した際にNodeとの接続が切れたと判断する。
+LOST\_CHILDの検出方法には、MulticastQueueを用いている。親NodeがMulticastQueueを持っているが、接続している全ての子Nodeが画像データを取得するまでMulticastQueueの中に入っている画像データを削除することができない。子NodeがMulticastQueueから画像データを取得せずに、画像データが溜まり続けると親NodeがMemoryOverFlowを起こしてしまう。この問題を回避するためにTimeoutスレッドが用意されている。Timeoutを検知した際にNodeとの接続が切れたと判断する。
 LOST\_CHILDの検知と木構造の再構成の手順を以下に示す。
 
 \begin{itemize}
@@ -132,19 +138,21 @@
 
 \begin{figure}[htb] %PDF
 \begin{center}
-\includegraphics[scale=0.6]{fig/EncodeZRLE.pdf}
+\includegraphics[scale=0.5]{fig/EncodeZRLE.pdf}
 \figcaption{ZRLEでデータを途中から受け取った場合}
 \label{fig:ZRLE}
 \end{center}
 \end{figure}
 
+\newpage
+
 そこでZRLEEは一度Root Nodeで受け取ったZRLEのデータをunzipし、後述するUpdate Rectangleと呼ばれる画面ごとのデータに辞書を付与してzipし直すことで、初めからデータを読み込んでいなくても解凍を出来るようになっている(図\ref{fig:ZRLEtoZRLEE})。
 
 一度ZRLEEに変換してしまえば、子Nodeはそのデータをそのまま流すだけでよい。ただし、deflaterとinflaterでは前回までの通信で得た辞書をクリアしないとけないため、Root Node側とNode側では毎回新しく作る必要がある。辞書をクリアすることにより adaptive compressionを実現していることになり圧縮率が向上する。
 
 \begin{figure}[htb] %PDF
 \begin{center}
-\includegraphics[scale=0.7]{fig/EncodeZRLEtoZRLEE.pdf}
+\includegraphics[scale=0.5]{fig/EncodeZRLEtoZRLEE.pdf}
 \figcaption{ZRLEEへ再圧縮されたデータを途中から受け取った場合}
 \label{fig:ZRLEtoZRLEE}
 \end{center}
@@ -154,8 +162,6 @@
 
 TreeVNCではRFBプロトコルによって配信側の画面の変更部分はFRAME\_BUFFER\_UPDATEメッセージとして送られてくる。メッセージの中には変更部分の原点のx,y座標と縦横の幅等が含まれており、長方形として展開される。この長方形をUpdate Rectangleと呼ぶ。
 
-\newpage
-
 \section{ShareScreen}
 ゼミでは発表者が順々に入れ替わる。発表者が入れ替わるたびに共有する画面の切り替えが必要となる。ゼミを円滑に進めるために、画面の切り替えをスムーズに行いたい。
 
@@ -165,4 +171,19 @@
 
 TreeVNCを立ち上げることでケーブルを使用する必要なしに、各参加者の手元のPCに発表者の画面を共有することができる。画面の切り替えについてはユーザがVNCサーバへの際接続を行うことなく、ビューワー側のShare Screenボタンを押すことで配信者の切り替えが可能となっている。
 
-TreeVNCのRoot Nodeは配信者のVNCサーバと通信を行なっている。VNCサーバから画面データを受信し、そのデータを子Nodeへと送信している。配信者切り替え時にShare Screenを実行すると、Root Nodeに対しSERVER\_CHANGE\_REQUESTというメッセージが送信される。このメッセージにはShare Screenボタンを押したNodeの番号やディスプレイ情報が付与されている。メッセージを受け取ったRoot Nodeは配信を希望しているNodeのVNCサーバと通信を始める。そのためTreeVNCは配信者切り替えのたびにVNCを終了し再接続する必要がない。
\ No newline at end of file
+TreeVNCのRoot Nodeは配信者のVNCサーバと通信を行なっている。VNCサーバから画面データを受信し、そのデータを子Nodeへと送信している。配信者切り替え時にShare Screenを実行すると、Root Nodeに対しSERVER\_CHANGE\_REQUESTというメッセージが送信される。このメッセージにはShare Screenボタンを押したNodeの番号やディスプレイ情報が付与されている。メッセージを受け取ったRoot Nodeは配信を希望しているNodeのVNCサーバと通信を始める。そのためTreeVNCは配信者切り替えのたびにVNCを終了し再接続する必要がない。
+
+\newpage
+
+\section{複数のネットワーク接続時の木の構成}
+TreeVNCはRoot Nodeが複数のネットワークに接続している場合、図\ref{fig:multinetwork}のようにネットワーク別にを形成する。TreeVNCはRoot NodeがTreeManagerを持っている。TreeManagerはTreeVNCの接続部分を管理しており、木構造を管理するnodeListの生成を行う。このnodeListを元に、新しいNodeの接続や、切断検出時の接続の切り替え等を行なっている。
+
+TreeManagerはRoot Nodeの保持しているネットワーク毎に生成される。新しいNodeが接続してきた際、interfacesからNodeのネットワークと一致するTree Managerを取得し、Node接続の処理を任せる。
+
+\begin{figure}[htb] %PDF
+\begin{center}
+\includegraphics[scale=0.7]{fig/MultiNetworkTree.pdf}
+\figcaption{ZRLEEへ再圧縮されたデータを途中から受け取った場合}
+\label{fig:multinetwork}
+\end{center}
+\end{figure}
Binary file FinalThesis/fig/MultiNetworkTree.graffle has changed
Binary file FinalThesis/fig/MultiNetworkTree.pdf has changed
Binary file FinalThesis/main.pdf has changed
--- a/riono-thesis.mm	Thu Feb 13 21:01:10 2020 +0900
+++ b/riono-thesis.mm	Fri Feb 14 03:36:26 2020 +0900
@@ -28,7 +28,7 @@
 </node>
 </node>
 <node CREATED="1581237491121" ID="ID_1312560790" MODIFIED="1581237502156" TEXT="ShareScreen"/>
-<node CREATED="1581580586272" ID="ID_1888266375" MODIFIED="1581580606369" TEXT="&#x8907;&#x6570;&#x306e;&#x30cd;&#x30c3;&#x30c8;&#x30ef;&#x30fc;&#x30af;&#x6642;&#x306e;&#x63a5;&#x7d9a;"/>
+<node CREATED="1581580586272" ID="ID_1888266375" MODIFIED="1581617775724" TEXT="&#x8907;&#x6570;&#x306e;&#x30cd;&#x30c3;&#x30c8;&#x30ef;&#x30fc;&#x30af;&#x63a5;&#x7d9a;&#x6642;&#x306e;&#x6728;&#x306e;&#x69cb;&#x6210;"/>
 </node>
 <node CREATED="1580927716648" ID="ID_4678920" MODIFIED="1580927734514" POSITION="right" TEXT="Multicast&#x306e;&#x5c0e;&#x5165;"/>
 <node CREATED="1580927735309" ID="ID_457187552" MODIFIED="1580927741703" POSITION="right" TEXT="Blocking&#x306e;&#x624b;&#x6cd5;">