Mercurial > hg > Events > OSC2011
changeset 7:63b061716258
modify
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 10 Sep 2011 05:46:47 +0900 |
parents | 4573aaf1bf0b (current diff) d3785522a5bc (diff) |
children | 9ecd6c8cfb68 |
files | presen/index.html presen/index.html~ presen/pix/MulticastQueue3.png |
diffstat | 8 files changed, 86 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- a/presen/index.html Sat Sep 10 05:27:00 2011 +0900 +++ b/presen/index.html Sat Sep 10 05:46:47 2011 +0900 @@ -749,14 +749,15 @@ <ul> <li>ZRLEよりも少なくですむ可能性がある。</li> <li>圧縮率が高い為プロキシのメモリを食わないですむ。</li> + </ul> <li>一度ZRLEEに圧縮してしまえば、データはそのまま流すことができる。</li> <li>TreeVNCの設計にある「データを木の下へ流す」の条件を満たす。</li> - </ul> </div> <!-- PAGE --> <div class="slide"> - <h1>圧縮したデータの転送</h1> - <li>データの転送は複数いる子へ並列に行う。</li> + <h1>データの転送</h1> + <li>クライアントから接続されるとsenderスレッドが作られる。</li> + <li>senderスレッドによりデータの転送は並列に行われる。</li> <p class="textcenter"> <img src="./pix/MulticastQueue3.png"> </p> @@ -885,6 +886,18 @@ <li>どこからも参照されないデータはProxyのメモリから削除される。</li> </div> <!-- PAGE --> + <div class="slide"> + <h1>並列なデータ転送に関して...</h1> + <li>次のソースを見てください。</li> + <pre> +executor.execute(new SendThread(out, buffer)); + </pre> + <li class="incremental">実はこのソース、僕が最初に書いた並列にデータを転送させる部分です。</li> + <li class="incremental">一回のデータ転送に1スレッドを立てているというとても酷いソース</li> + <li class="incremental">3台つなげただけでプログラムが落ちた。</li> + <li class="incremental">こんなプログラムだけは書かないようにしましょう...</li> + </div> + <!-- PAGE --> <div class="slide"> <div class="taninaritop"> @@ -1202,6 +1215,8 @@ </Font> <br> プロキシから受け取ったデータをもとに接続を開始する関数。 + <br> + この時クライアント6がクライアント1に変わる。 </Font> </td> @@ -1262,6 +1277,15 @@ </div> <!-- PAGE --> +<div class="slide"> + <div class="taninaritop" > + <h1>木の再構成手順</h1> + <center><h2>再構成後の木</h2></center> + <center><img class="scale" src="pix/reuml7.png" alt=""></center> + </div> +</div> + +<!-- PAGE --> <div class="slide"> <h1>最後に</h1>
--- a/presen/index.html~ Sat Sep 10 05:27:00 2011 +0900 +++ b/presen/index.html~ Sat Sep 10 05:46:47 2011 +0900 @@ -87,7 +87,7 @@ <div class="slide"> <h1>本日の内容</h1> <li>友人と作ったJavaによる画面共有システム「TreeVNC」について</li> - <li>TreeVNCを作るにあたって学んだJavaでの並列プログラミングの仕方やVNCの話</li> + <li>TreeVNCを作るにあたって学んだJavaでの並列プログラミングの仕方やVNCのプロトコル話</li> </div> <!-- PAGE --> <div class="slide"> @@ -109,6 +109,7 @@ <li>まず、iMacで複数のPCからVNCをかけてみた。</li> <li class="incremental">-> 10台と繋ぐ前にVNCでの画面がカクカクに... </li> <li class="incremental">さらにCPU使用率も跳ね上がった。</li> + <li class="incremental">原因について考えたみる。</li> </div> <!-- PAGE --> <div class="slide"> @@ -246,7 +247,7 @@ <li>データ転送量</li> <li>ZRLE Encodingの問題</li> <li>データ転送に用いたMulticastQueueについての説明</li> - <li>木構造の再構築</li> + <li>木構造の再構築(谷成さん)</li> </ul> </div> <!-- PAGE --> @@ -294,7 +295,7 @@ <li>FramebufferUpdateRequest:</li> <li><small>画面に差分が発生したらサーバから教えて貰うためのリクエスト</small></li> <small> -<table> +<table width=100% style="text-align: center;"> <td width=50%> <table border=1 cellspacing="0"> <tr> @@ -341,15 +342,19 @@ </table> </td> +<td> +<img src="./pix/TreeVNC1.png" width=90%> +</td> </table> -<li>このリクエストはTop Proxyだけが行う。 </li> </small> +<li><small>このリクエストはTop Proxyだけが行う。</small> </li> </div> <!-- PAGE --> <div class="slide"> <h1>RFB Protocol</h1> - <li>FramebufferUpdate: <small>画面の更新データ</small></li> - + <li>FramebufferUpdate:<small>画面の更新データ</small></li> +<table width="100%"> +<td width=50%> <small> <table border=1 cellspacing="0" > <tr> @@ -377,11 +382,11 @@ </tr> </table> - <li>以下number-of-rectanglesの数だけ矩形のデータが続く</li> + <li><small>以下number-of-rectanglesの数だけ矩形のデータが続く</small></li> <table width=100%> <td> -<table border=1 cellspacing="0" width=50%> +<table border=1 cellspacing="0" width=100%> <tr> <td>バイト数</td> <td><pre>型 </pre></td> @@ -431,9 +436,13 @@ </td> </table> - +</small> +</td> +<td width> + <img src="./pix/TreeVNC2.png" width=90%> +</td> +</table> -</small> </div> <!-- PAGE --> <div class="slide"> @@ -553,7 +562,7 @@ </tr> </table> <p style="text-align: center;"><small>クライアントの数をN、木構造の子供の数をMとする</small> </p> - <li>N = 60、 M = 1 、使用するエンコードはZRLEとする。</li> + <li>N = 60、 M = 2 、使用するエンコードはZRLEとする。</li> <li>724 * 449 の画面分のデータ(0.8M)を送信するとする。 </li> </div> @@ -595,7 +604,7 @@ <!-- PAGE --> <div class="slide"> <h1>エンコード</h1> - <li>MacintoshでVNCを行うとZRLEを使うことができる。</li> + <li>MacintoshでZRLEを使ってVNCを行うことができる</li> <li>データ量がRAWデータの約4分の1ですむ。</li> <li class="incremental">TreeVNCではこのZRLEを扱っている。</li> </div> @@ -622,23 +631,25 @@ <tr> <td>length</td> <td>U8 array</td> - <td>zlibData</td> + <td>ZlibData</td> </tr> </table> </small> - - <li>Zlibデータ</li> - <ul> - <li>Zlibデータは辞書を元にデータの解凍を行う</li> - </ul> - <li class="incremental">辞書がなければデータを正しく解凍できない</li> - </div> + <li>VNCでZRLEを使う場合は単一のzrleストリームを使ってデータの解凍を行う。</li> + <li class="incremental">問題が発生</li> + </div> <!-- PAGE --> <div class="slide"> <h1>ZRLEの問題</h1> + <li>Zlibデータは辞書を元にデータの解凍を行う</li> + <li class="incremental">辞書がなければデータを正しく解凍できない</li> + </div> + <div class="slide"> + <h1>ZRLEの問題</h1> <li>辞書はZlibデータの最初に送られてくる。</li> - <li>ZRLEのデータを最初から送ることができれば、辞書も送ることができる。</li> + <li>もしも、ZRLEのデータを最初から送っているのなら、辞書も送ることができる。</li> <li>データの途中から送ると辞書は送られず、正しく解凍を行うことができない。</li> + <li class="incremental">Zlibデータを扱うZlibInStreamがエラーを吐く</li> <table class="textcenter" width=100%> <tr> <td> @@ -653,7 +664,7 @@ <!-- PAGE --> <div class="slide"> <h1>ZRLEE</h1> - <li>そこで、Top ProxyにZRLEのデータを再度圧縮し直すことで辞書を付けてもらうことにした。以下はその部分のソースである。</li> + <li>そこで、ProxyがZRLEを使ってデータを受け取り圧縮し直して木の下へ流していくことにした。</li> <small> <pre> Deflater nDeflater = deflater; // new Deflater(); @@ -663,7 +674,7 @@ int len2 = zip(nDeflater, out, 0, bufs); </pre> </small> -<li>この圧縮し直したデータはZRLEEと名付けた。</li> +<li><small>この圧縮し直したデータはZRLEEと名付けた。</small></li> <table class="textcenter" width=100%> <tr> <td> @@ -685,19 +696,20 @@ if (zrleInStream == null) zrleInStream = new ZlibInStream(); </pre> - <li>JavaではZlibの辞書の取り出しが実装されていなかった為、このような方法をとることになった。</li> - <li class="incremental">ZRLEに比べるとデータ量は増えないのか...?</li> + <li>Zlibの規約には辞書の取り出し(flush)については書かれている。</li> + <li>Javaでは実装されていなかった為、このような方法をとることになった。</li> </div> <!-- PAGE --> <div class="slide"> - <h1>ZRLEEのデータ量</h1> + <h1>ZRLEEの疑問点</h1> + <li>ZRLEEには毎回辞書が付与されている。</li> <p class="textcenter"> <img src="./pix/ZRLEE2.png" width="600"> </p> - <li>毎回辞書の付与がされるため、ZRLEに比べるとデータ量が増える...?</li> - <li class="incremental">ZRLEと比較してみるとデータ量は変わらないことが判明</li> - </div> - <!--PAGE--> + <li class="incremental">ZRLEに比べるとデータ量は増えないのか...?</li> + <li class="incremental">-> ZRLEと比較してみるとデータ量は変わらないことが判明</li> + </div> + <!-- PAGE --> <div class="slide"> <h1>ZRLEEのデータ量</h1> <p style="text-align: center;"> @@ -724,6 +736,7 @@ </td> </tr> </table> + <li>ZRLEよりデータ量が多くなるどころか少ない。</li> <li>原因</li> <ul> <li>ZRLEEは送られるデータ毎で最適な辞書が使われる。</li> @@ -732,26 +745,22 @@ <!-- PAGE --> <div class="slide"> <h1>ZRLEEを使う利点</h1> - <li>データ量が少なくすむ</li> + <li>データ量が少なくですむ</li> <ul> <li>ZRLEよりも少なくですむ可能性がある。</li> <li>圧縮率が高い為プロキシのメモリを食わないですむ。</li> - </ul> - <li>そのままデータを流すことができる</li> - <ul> - <li>圧縮作業は一回ですむ。</li> + <li>一度ZRLEEに圧縮してしまえば、データはそのまま流すことができる。</li> + <li>TreeVNCの設計にある「データを木の下へ流す」の条件を満たす。</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>圧縮したデータの転送</h1> - <li>一度ZRLEEに圧縮してしまえば、データはそのまま流すことができる。</li> - <li class="incremental"> -> 気にするのはスループットだけでいい。</li> - <li>また、データの転送は複数いる子へ並列に行われる。</li> + <li>データの転送は複数いる子へ並列に行う。</li> <p class="textcenter"> <img src="./pix/MulticastQueue3.png"> </p> - <li class="incremental">MulticastQueueクラスを用いてデータの転送を行った。</li> + <li class="incremental">MulticastQueueクラスを用いた並列な転送を行った。</li> </div> <!-- PAGE --> <div class="slide"> @@ -1193,6 +1202,8 @@ </Font> <br> プロキシから受け取ったデータをもとに接続を開始する関数。 + <br> + この時クライアント6がクライアント1に変わる。 </Font> </td> @@ -1253,6 +1264,15 @@ </div> <!-- PAGE --> +<div class="slide"> + <div class="taninaritop" > + <h1>木の再構成手順</h1> + <center><h2>再構成後の木</h2></center> + <center><img class="scale" src="pix/reuml7.png" alt=""></center> + </div> +</div> + +<!-- PAGE --> <div class="slide"> <h1>最後に</h1>