Mercurial > hg > Members > nobuyasu > presen
view OpenSourceConference/index.html @ 7:7e05f4f580b7
modify index.html
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Sep 2011 08:41:09 +0900 |
parents | d1f572bde42f |
children | 95d46a58d75e |
line wrap: on
line source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> .center { margin-left: auto; margin-right: auto; text-align: center; } .textcenter { text-align: center; } </style> <title>2011/9/6</title> <!-- metadata --> <meta name="generator" content="S5" /> <meta name="version" content="S5 1.1" /> <meta name="presdate" content="20110906" /> <meta name="author" content="Nobuyasu Oshiro" /> <meta name="company" content="University of the Ryukyu" /> <!-- meta temporary --> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <!-- configuration parameters --> <meta name="defaultView" content="slideshow" /> <meta name="controlVis" content="hidden" /> <!-- configuration extensions --> <meta name="tranSitions" content="true" /> <meta name="fadeDuration" content="500" /> <meta name="incrDuration" content="250" /> <!-- configuration autoplay extension --> <meta name="autoMatic" content="false" /> <meta name="playLoop" content="true" /> <meta name="playDelay" content="10" /> <!-- configuration audio extension --> <meta name="audioSupport" content="false" /> <meta name="audioVolume" content="100" /> <meta name="audioError" content="false" /> <!-- configuration audio debug --> <meta name="audioDebug" content="false" /> <!-- style sheet links --> <link rel="stylesheet" href="ui/default_utf/slides.css" type="text/css" media="projection" id="slideProj" /> <link rel="stylesheet" href="ui/default_utf/outline.css" type="text/css" media="screen" id="outlineStyle" /> <link rel="stylesheet" href="ui/default_utf/print.css" type="text/css" media="print" id="slidePrint" /> <link rel="stylesheet" href="ui/default_utf/opera.css" type="text/css" media="projection" id="operaFix" /> <!-- embedded styles --> <style type="text/css" media="all"> .imgcon {width: 100%; margin: 0 auto; padding: 0; text-align: center;} #anim {width: 33%; height: 320px; position: relative;} #anim img {position: absolute; top: 0px; left: 0px;} </style> <!-- S5 JS --> <script src="ui/default_utf/slides.js" type="text/javascript"></script> </head> <body> <div class="layout"> <div id="controls"><!-- DO NOT EDIT --></div> <div id="currentSlide"><!-- DO NOT EDIT --></div> <div id="header"></div> <div id="footer"> <h1>ゼミ: 2011/ 9/ 6</h1> <h2>並列信頼研</h2> </div> </div> <div class="presentation"> <div class="slide"> <h1>Java による授業向け画面共有システムの設計と実装 </li> <h3></h3> <li>大城 信康 谷成 雄</li> <h4><a href="http://ie.u-ryukyu.ac.jp/" rel="external">琉球大学 並列信頼研究室</a></h4> <div class="handout"></div> </div> <!-- PAGE --> <div class="slide"> <h1>目的と背景</h1> <li>大学の講義中、スクリーンに映されている画面は後ろの席程見えずらい。 </li> <li>その問題を手元のPCにも写せるようにすることで解決しようと考えた。</li> <li class="incremental">60人以上での画面共有を行うことを目標とする。</li> </div> <!-- PAGE --> <div class="slide"> <h1>VNCを用いての画面共有</h1> <li>画面を共有する方法 -> VNC</li> <li>VNC: Virtual Network Computing </br>ネットワークを介してコンピュータを遠隔操作するプログラム </li> <li>VNCのリモートPCの画面を写す機能を利用する。</li> </div> <!-- PAGE --> <div class="slide"> <h1>通常のVNCの問題点</h1> <table class="center"> <tr> <td width=50% > <p style="text-aline: center;" > <img clas="scale" src="./pix/NormalVNC3.png" width="450"> </p> </td> <td width=50% style="text-align: left;"> <li><small>VNC Serverの負荷が重い。</small></li> <li><small>Server側の通信網1本への通信負荷が高い。</small></li> </td> </tr> </table> </div> <!-- PAGE --> <div class="slide"> <h1>通常のVNCの問題点</h1> <p style="text-align: center;"> <li> <samll>1台と48台でVNCをかけた時のスループットとサーバ側のCPU使用率</small> </li> </p> <table class="center" class="incremental" border=1> <tr> <td></td> <td>スループット(単位:Byte)</td> <td>CPU使用率</td> </tr> <tr> <td>1台</td> <td>20M</td> <td>15%</td> </tr> <tr> <td>48台</td> <td>0.4M</td> <td>100%</td> </tr> </table> <li>VNCに使われるCPUの使用率が100%になり、スループットが5分の1まで下がっている。</li> </div> <!-- PAGE --> <div class="slide"> <h1>VNCの問題点の解決策</h1> <p style="text-align: center;"> <small>クライアントを木構造で接続させる</samll><br> <img class="scale" src="./pix/TreeVNC0.png" width="500" heigth="500"><br> </p> </div> <!-- PAGE --> <div class="slide"> <h1>TreeVNCの利点</h1> <table class="center" width=100% style="text-align: center;"> <tr> <td><small>通常のVNC</small></td> <td><small>TreeVNC</small></td> </tr> <tr> <td> <img class="scale" src="./pix/NormalVNC3.png" width="300"> </td> <td> <img src="./pix/TreeVNC3.png" width="300"> </td> </tr> </p> </table> <li>クライアントが増えてもかかる負荷一定。</li> <li>通信網1本に対する負荷が減り、安定した通信ができる(有線)。</li> </div> </div> <!-- PAGE --> <div class="slide"> <h1>TreeVNCの利点</h1> <table class="center" width=100% style="text-align: center;"> <tr> <td><small>通常のVNC</small></td> <td><small>TreeVNC</small></td> </tr> <tr> <td> <img class="scale" src="./pix/NormalVNC3.png" width="300"> </td> <td> <img src="./pix/TreeVNC3.png" width="300"> </td> </tr> </p> </table> <table class="center" border=1 cellspacing="0" width=80%> <tr> <td></td> <td>通常のVNC</td> <td>TreeVNC</td> </tr> <tr> <td>最大負荷</td> <td> N * データ量 (クライアントの数に比例) </td> <td> (M+1) * データ量</td> </tr> </table> <p style="text-align: center;"><small>クライアントの数をN、木構造の子供の数をMとする</small> </p> </div> </div> <!-- PAGE --> <div class="slide"> <h1>TreeVNCの設計</h1> <li>TreeVNCのクライアントは最初にTop Proxyに接続を行う。</li> <li>データは木の下へと流れていく。</li> <li>tightVNC ViewerのJava版(ver 1.3)を元にTreeVNCの実装を行う。</li> <p style="text-align: center;"> <img class="scale" src="./pix/TreeVNC0.png" width="500" heigth="500"> </p> </div> <!-- PAGE --> <div class="slide"> <h1>発表内容</h1> <ul> <li>RFB Protocol</li> <li>データ転送量</li> <li>データ転送に用いたMulticastQueueについての説明</li> <li>TreeVNCのデモ</li> <li>木構造の再構築</li> <li>ZRLE Encodingの問題</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>RFB protocol</h1> <li>Remote Frame Buffer Protocol : <br>GUI操作によるリモートアクセス用の通信プロトコル。VNCで用いられる。</li> <li>転送される画面(フレームバッファ)のデータは変更があった部分(差分)だけが矩形単位で送られる。</li> <table class="center" width=100%> <tr> <td> <img src="./pix/hadesScreen1.png"> </td> <td> <img src="./pix/rightArrow.png"> </td> <td> <img src="./pix/hadesScreen2.png"> </td> </tr> </table> <small> <p style="text-align: center;"><font color=red>□ </font>で囲まれている矩形のデータだけが送られてくる。 </p> </small> </div> <!-- PAGE --> <div class="slide"> <h1>VNC のシーケンス図</h1> <table class="scale" width=100% > <tr> <td width=50%> <img class="scale" src="./pix/VNC-Sequence-.png" height=80%> </td> <td width=50% align="left"> <small> <li><font color=blue>1~5</font>まではinitial seaquenceとなる。</li> <li><font color=orange>6</font>以降は繰り返し行われる処理。画面のデータが転送されてくる。</li> </small> </td> </tr> </table> </div> <!-- PAGE --> <div class="slide"> <h1>RFB Protocol</h1> <li>FramebufferUpdateRequest:</li> <li><small>画面に差分が発生したらサーバから教えて貰うためのリクエスト</small></li> <small> <table> <td width=50%> <table border=1 cellspacing="0"> <tr> <td>バイト数</td> <td><pre>型 [値]</pre></td> <td>説明 </td> </tr> <tr> <td>1</td> <td><pre>U8 3</pre></td> <td>message-type </td> </tr> <tr> <td>1</td> <td><pre>U8<pre></td> <td>incremental</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>x-position</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>y-position</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>width</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>height</td> </tr> </table> </td> </table> <li>このリクエストはTop Proxyだけが行う。 </li> </small> </div> <!-- PAGE --> <div class="slide"> <h1>RFB Protocol</h1> <li>FramebufferUpdate: <small>画面の更新データ</small></li> <small> <table border=1 cellspacing="0" > <tr> <td>バイト数</td> <td><pre>型 [値]</pre></td> <td>説明 </td> </tr> <tr> <td>1</td> <td><pre>U8 0</pre></td> <td>message-type </td> </tr> <tr> <td>1</td> <td><pre>U8<pre></td> <td>padding</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>number-of-rectangles</td> </tr> </table> <li>以下number-of-rectanglesの数だけ矩形のデータが続く</li> <table width=100%> <td> <table border=1 cellspacing="0" width=50%> <tr> <td>バイト数</td> <td><pre>型 </pre></td> <td>説明 </td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>x-position</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>y-position</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>width</td> </tr> <tr> <td>2</td> <td><pre>U16<pre></td> <td>height</td> </tr> <tr> <td>4</td> <td><pre>U32<pre></td> <td>encoding-type</td> </tr> <tr> <td>...</td> <td><pre>...<pre></td> <td>PIXEL DATA</td> </tr> </table> </td> <td> </td> </table> </small> </div> <!-- PAGE --> <div class="slide"> <h1>RFB Protocol</h1> <li style="text-align: center;"><small>例:FramebufferUpdate</small></li> <table class="center" border=1 cellspacing="0" width=50%> <tr> <td>x-position</td> <td>336</td> </tr> <tr> <td>y-position</td> <td>388</td> </tr> <tr> <td>width</td> <td>724</td> </tr> <tr> <td>height</td> <td>449</td> </tr> <tr> <td>encoding-type</td> <td>16(ZRLE)</td> </tr> <tr> <td>ZRLE</td> <td>...</td> </tr> </table> <table class="center"> <tr> <td> <img src="./pix/hadesScreen1.png"> </td> <td> <img src="./pix/rightArrow.png"> </td> <td> <img src="./pix/hadesScreen2.png"> </td> </tr> </table> </div> <!-- PAGE --> <div class="slide"> <h1>データ転送量</h1> <p style="text-align: center;"> <small>矩形の大きさと描画に必要なデータ量(単位:Byte)</small> </p> <table class="center" border=1 cellspacing="0" width=80%> <tr> <td>矩形の大きさ \ エンコード</td> <td>RAW</td> <td>ZRLE</td> </tr> <tr> <td>724 * 449</td> <!-- <td>1300304</td> <td>796642</td> --> <td>1.3M</td> <td>0.8M</td> </tr> <tr> <td>1920 * 64</td> <!-- <td>491520</td> <td>309602</td> --> <td>0.5M</td> <td>0.15M</td> </tr> <tr> <td>1920 * 1080</td> <!-- <td>8294400</td> <td>3472780</td> --> <td>8.2M</td> <td>3.4M</td> </tr> </table> <p style="text-align: center;"> <img src="./pix/dataLength.png" width="450" heigth="325"> <br> <small>RAW、ZRLE、ZRLEEエンコードのデータ量の比較</small> </p> </div> <!-- PAGE --> <div class="slide"> <h1>データ転送量</h1> <li>クライアントが60台の時の通常のVNCと、2分木構成にしたTreeVNCの通信網への負荷について考える。</li> <table class="center" border=1 cellspacing="0" width=80%> <tr> <td></td> <td>通常のVNC</td> <td>TreeVNC</td> </tr> <tr> <td>最大負荷</td> <td> N * データ量(クライアントの数に比例) </td> <td> (M+1) * データ量</td> </tr> </table> <p style="text-align: center;"><small>クライアントの数をN、木構造の子供の数をMとする</small> </p> <li>N = 60、 M = 1 となる。</li> <li>724 * 449 の画面分のデータ(0.8M)を送信するとする。 </li> </div> <!-- PAGE --> <div class="slide"> <h1>データ転送量</h1> <li></li> <table class="center" border=1 cellspacing="0" width=80%> <tr> <td></td> <td>通常のVNC</td> <td>TreeVNC</td> </tr> <tr> <td>最大負荷</td> <td>48M</td> <td>2.4M</td> </tr> </table> <table class="center" width=100% style="text-align: center;"> <tr> <td><small>通常のVNC</small></td> <td><small>TreeVNC</small></td> </tr> <tr> <td width=50%> <img class="scale" src="./pix/NormalVNC4.png"> </td> <td> <img src="./pix/TreeVNC5.png"> </td> </tr> </p> </table> <small> <p style="text-align: center">クライアント:60台 TreeVNCは2分木でTreeを構成 </p> </small> </div> <!-- PAGE --> <div class="slide"> <h1>エンコード</h1> <li>MacintoshでVNCを行うとZRLEを使うことができる。</li> <li>データ量がRAWデータの約4分の1のデータ量ですむ。</li> <li class="incremental">TreeVNCではこのZRLEを扱っている。</li> </div> <!-- PAGE --> <div class="slide"> <h1>ZRLE</h1> <li>ZRLE : Zlib Run-Length Encoding </li> <ul> <li>Zlib圧縮(gzip)されたデータ扱うエンコーディング。</li> </ul> <li>最初の4バイトにはZlibのデータの長さが、続いてZlibのデータが送られてくる。</li> <small> <table border=1 width=50% cellspacing="0"> <tr> <td>バイト数</td> <td><pre>型 </pre></td> <td>説明 </td> </tr> <tr> <td>4</td> <td>U32</td> <td>length</td> </tr> <tr> <td>length</td> <td>U8 array</td> <td>zlibData</td> </tr> </table> </small> <li>Zlibデータ</li> <ul> <li>Zlibデータは辞書を元にデータの解凍を行う</li> </ul> <li class="incremental">辞書がなければデータを正しく解凍できない</li> </div> <!-- PAGE --> <div class="slide"> <h1>ZRLEの問題</h1> <li>辞書はZlibデータの最初に送られてくる。</li> <li>ZRLEのデータを最初から送ることができれば、辞書も送ることができる。</li> <li>データの途中から送ると辞書は送られず、正しく解凍を行うことができない。</li> <table class="textcenter" width=100%> <tr> <td> <img src="./pix/ZRLE.png" width="600" > </td> <td> <img src="./pix/ZRLE2.png" width="600" > </td> </tr> </table> </div> <!-- PAGE --> <div class="slide"> <h1>ZRLEE</h1> <li>そこで、Top ProxyにZRLEのデータを再度圧縮し直すことで辞書を付けてもらうことにした。</li> <small> <pre> Deflater nDeflater = deflater; // new Deflater(); LinkedList<ByteBuffer> out = new LinkedList<ByteBuffer>(); unzip(inflater, inputs, 0 , out, INFLATE_BUFSIZE); // dump32(inputs); int len2 = zip(nDeflater, out, 0, bufs); </pre> </small> <li>一度再圧縮してしまえば後はどこからデータを流しても問題ない。</li> <table class="textcenter" width=100%> <tr> <td> <img src="./pix/ZRLEE2.png" width="600"> </td> <td> <img src="./pix/ZRLEE3.png" width="600"> </td> </tr> </table> </div> <!-- PAGE --> <div class="slide"> <h1>ZRLEE</h1> <li>クライアント側は毎回新しい解凍器(Deflater)を使うようにする。</li> <pre> if (rfb.updateRectEncoding==RfbProto.EncodingZRLEE) zrleInStream = null; if (zrleInStream == null) zrleInStream = new ZlibInStream(); </pre> </div> <!-- PAGE --> <div class="slide"> <h1>ZRLEの問題</h1> <li>解凍に必要な辞書を取り出すことができないため、ZRLEのデータはそのまま投げるだけでは正しく解凍されない。</li> <li>そこで、VNC Serverへ接続するTop ProxyはZRLEで送られてきたデータを毎回新しく圧縮し直すという方法をとった。</li> <li>一度圧縮し直されたデータはそのまま流すことができる。よってクライアント側では圧縮し直す必要はない。 </li> </div> <!-- PAGE --> <div class="slide"> <h1>データ量の見積もり</h1> <li>先頭20バイトを読みupdate一回分のデータ量を調べる。</li> <li>update1回分のデータを読み込み次のクライアントに送信する。</li> <li>また、描画データを送信すると同時に画面の更新を行うようにする。</li> <li class="incremental">描画データの管理はMulticastQueueで行った。 </li> </div> <!-- PAGE --> <div class="slide"> <h1>MulticastQueue</h1> <li>MulticastQueueはjava.util.CountDownLatchを用いて実装されたクラスである。 </li> <li>クライアントから接続されると、データ転送用のスレッド(sender)が走る。 </li> <li>このスレッドは次に流すデータが来るまでは待機して置かなければならない。そして流すべきデータがくるとまた動き始めなければならない。</li> <li>このスレッドの待機・解放を行うのがMulticastQueueとなる。 </li> <!-- <small> <li>CountDownLatchはカウントを用いてスレッドの待機と解放を行えるクラスである。</li> </small> --> </div> <!-- PAGE --> <div class="slide"> <h1>MulticastQueue</h1> <li>MulticastQueueの図を入れる。 </li> <p style="text-align: center;"> <small> 接続されてきた時点からデータの送信が始まる。データは読み込まれるまでメモリ上に残っている。 </small> </p> </div> <!-- PAGE --> <div class="slide"> <h1>MulticastQueueの問題点</h1> <li>Clientがデータを読み込まないとデータが溜まりメモリを圧迫してしまう。 </li> <p style="text-align: center;"> <img src="./pix/TimeOut1.png"> </p> </div> <!-- PAGE --> <div class="slide"> <h1>MulticastQueueの問題点</h1> <li style="text-align: center;">解決策</li> <p style="text-align: center;"> <img src="./pix/TimeOut2.png"> </p> <small> <li>TimeOut(TO)スレッドを走らせ、一定の時間データを読み込まなければ代わりにこのTOが読み込むようにする。</li> </small> </div> <!-- PAGE --> <div class="slide"> <h1>TreeVNCのデモ</h1> <li>では実際に動かしてみる。</li> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>TreeVNCの利点と欠点</h1> <ul> <li>ケーブル1本への負荷が減る。一極集中型よりスループットを維持できる。</li> <li>無線を使われると遅くなる。</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1>テスト環境について</h1> <li>CUI版のVNCクライアントを作成</li> <li>48台あるクラスタでCUI版のクライアントをはしらせてVNCをかけさせる。</li> <li>最初の1台目と50台めをGUI版のクライアントで接続を行い見比べてみる。 </li> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> <li></li> </div> <!-- PAGE --> <div class="slide"> <h1>既存のプログラムとの比較</h1> <li>VNC Reflector</li> <ul> <li>tightVNCの作者が作成したプログラム</li> <li>VNC Reflecotrにクライアントが接続することでVNCを行うことができる</li> </ul> </div> <!-- PAGE --> <div class="slide"> <h1></h1> <li></li> </div> <!-- PAGE --> </div> </body> </html>