57
|
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
3
|
|
4 <html xmlns="http://www.w3.org/1999/xhtml">
|
|
5
|
|
6 <head>
|
|
7 <style>
|
|
8 .center {
|
|
9 margin-left: auto;
|
|
10 margin-right: auto;
|
|
11 text-align: center;
|
|
12 }
|
|
13 .textcenter {
|
|
14 text-align: center;
|
|
15 }
|
|
16 .taninaritop {
|
|
17 margin: auto;
|
|
18 width: 95%;
|
59
|
19 // font-weight: bold;
|
57
|
20 }
|
|
21 </style>
|
|
22 <title>2011/9/27</title>
|
|
23 <!-- metadata -->
|
|
24 <meta name="generator" content="S5" />
|
|
25 <meta name="version" content="S5 1.1" />
|
|
26 <meta name="presdate" content="20110910" />
|
|
27 <meta name="author" content="Nobuyasu Oshiro" />
|
|
28 <meta name="company" content="University of the Ryukyu" />
|
|
29 <!-- meta temporary -->
|
|
30 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
|
31 <meta http-equiv="Content-Script-Type" content="text/javascript" />
|
|
32 <meta http-equiv="Content-Style-Type" content="text/css" />
|
|
33 <!-- configuration parameters -->
|
|
34 <meta name="defaultView" content="slideshow" />
|
|
35 <meta name="controlVis" content="hidden" />
|
|
36 <!-- configuration extensions -->
|
|
37 <meta name="tranSitions" content="true" />
|
|
38 <meta name="fadeDuration" content="500" />
|
|
39 <meta name="incrDuration" content="250" />
|
|
40 <!-- configuration autoplay extension -->
|
|
41 <meta name="autoMatic" content="false" />
|
|
42 <meta name="playLoop" content="true" />
|
|
43 <meta name="playDelay" content="10" />
|
|
44 <!-- configuration audio extension -->
|
|
45 <meta name="audioSupport" content="false" />
|
|
46 <meta name="audioVolume" content="100" />
|
|
47 <meta name="audioError" content="false" />
|
|
48 <!-- configuration audio debug -->
|
|
49 <meta name="audioDebug" content="false" />
|
|
50 <!-- style sheet links -->
|
|
51 <link rel="stylesheet" href="ui/default_utf/slides.css" type="text/css" media="projection" id="slideProj" />
|
|
52 <link rel="stylesheet" href="ui/default_utf/outline.css" type="text/css" media="screen" id="outlineStyle" />
|
|
53 <link rel="stylesheet" href="ui/default_utf/print.css" type="text/css" media="print" id="slidePrint" />
|
|
54 <link rel="stylesheet" href="ui/default_utf/opera.css" type="text/css" media="projection" id="operaFix" />
|
|
55 <!-- embedded styles -->
|
|
56 <style type="text/css" media="all">
|
|
57 .imgcon {width: 100%; margin: 0 auto; padding: 0; text-align: center;}
|
|
58 #anim {width: 33%; height: 320px; position: relative;}
|
|
59 #anim img {position: absolute; top: 0px; left: 0px;}
|
|
60 </style>
|
|
61 <!-- S5 JS -->
|
|
62 <script src="ui/default_utf/slides.js" type="text/javascript"></script>
|
|
63 </head>
|
|
64 <body>
|
|
65
|
|
66 <div class="layout">
|
|
67 <div id="controls"><!-- DO NOT EDIT --></div>
|
|
68 <div id="currentSlide"><!-- DO NOT EDIT --></div>
|
|
69 <div id="header"></div>
|
|
70 <div id="footer">
|
|
71 <h1>セミナー: 2011/ 9/ 27</h1>
|
|
72 <h2>並列信頼研</h2>
|
|
73 </div>
|
|
74 </div>
|
|
75
|
|
76 <div class="presentation">
|
|
77 <div class="slide">
|
|
78 <h1>Java による授業向け画面共有システムの設計と実装 </li>
|
|
79 <h3></h3>
|
|
80 <li>谷成 雄</li>
|
|
81 <h4><a href="http://ie.u-ryukyu.ac.jp/" rel="external">琉球大学 並列信頼研究室</a></h4>
|
|
82 <div class="handout"></div>
|
|
83 </div>
|
|
84 <!-- PAGE -->
|
|
85 <div class="slide">
|
|
86 <h1>目的と背景</h1>
|
59
|
87 <li>大学の講義中、スクリーンに映されている画面は後ろの席ほど見えづらい。 </li>
|
57
|
88 <li>その問題を手元のPCにも写せるようにすることで解決しようと考えた。</li>
|
59
|
89 <li>60人以上で画面共有を行うシステムを目標とする。</li>
|
57
|
90 </div>
|
|
91 <!-- PAGE -->
|
|
92 <div class="slide">
|
|
93 <h1>VNCによる画面共有</h1>
|
|
94 <li>VNC: Virtual Network Computing </br>ネットワークを介してコンピュータを遠隔操作するプログラム </li>
|
59
|
95 <li>VNC用いた授業用画面共有システムTreeVNCの設計と実装を行った。</li>
|
57
|
96 </div>
|
|
97 <!-- PAGE -->
|
|
98 <div class="slide">
|
|
99 <h1>通常のVNCの問題点</h1>
|
|
100 <table class="center">
|
|
101 <tr>
|
|
102 <td width=50% >
|
|
103 <p style="text-aline: center;" >
|
|
104 <img clas="scale" src="./pix/NormalVNC3.png" width="450">
|
|
105 </p>
|
|
106 </td>
|
|
107 <td width=50% style="text-align: left;">
|
|
108 <li><small>VNC Serverの負荷が重い。</small></li>
|
|
109 <li><small>Server側の通信網1本への通信負荷が高い。</small></li>
|
|
110 </td>
|
|
111 </tr>
|
|
112 </table>
|
|
113 </div>
|
|
114 <!-- PAGE -->
|
|
115 <div class="slide">
|
|
116 <h1>通常のVNCの問題点</h1>
|
|
117 <p style="text-align: center;">
|
|
118 <li>
|
|
119 <samll>1台と48台でVNCをかけた時のスループットとサーバ側のCPU使用率</small>
|
|
120 </li>
|
|
121 </p>
|
|
122 <table class="center" class="incremental" border=1>
|
|
123 <tr>
|
|
124 <td></td>
|
|
125 <td>スループット(単位:Byte)</td>
|
|
126 <td>CPU使用率</td>
|
|
127 </tr>
|
|
128
|
|
129 <tr>
|
|
130 <td>1台</td>
|
|
131 <td>20M<small>(VNCでの最大速度)</small></td>
|
|
132 <td>55%</td>
|
|
133 </tr>
|
|
134
|
|
135 <tr>
|
|
136 <td>48台</td>
|
58
|
137 <td>4M(1台あたり)</td>
|
57
|
138 <td>100%</td>
|
|
139 </tr>
|
|
140 </table>
|
59
|
141 <li>48台繋げる事によって、VNCに使われるCPUの使用率が100%になり、スループットが5分の1まで下がっている。</li>
|
57
|
142
|
|
143 </div>
|
|
144
|
|
145
|
|
146 <!-- PAGE -->
|
|
147 <div class="slide">
|
|
148 <h1>TreeVNCの設計</h1>
|
|
149 <table class="center" width=100% style="text-align: center;">
|
|
150 <tr>
|
|
151 <td><small>通常のVNC</small></td>
|
|
152 <td><small>TreeVNC</small></td>
|
|
153 </tr>
|
|
154 <tr>
|
|
155 <td>
|
|
156 <img class="scale" src="./pix/NormalVNC3.png" width="300">
|
|
157 </td>
|
|
158 <td>
|
|
159 <img src="./pix/TreeVNC3.png" width="300">
|
|
160 </td>
|
|
161 </tr>
|
|
162 </p>
|
|
163 </table>
|
|
164 <li>クライアントが増えてもかかる負荷一定。</li>
|
|
165 <li>通信網1本に対する負荷が減り、安定した通信ができる(有線)。</li>
|
|
166 </div>
|
|
167 </div>
|
59
|
168
|
57
|
169 <!-- PAGE -->
|
|
170 <div class="slide">
|
|
171 <h1>TreeVNCの設計</h1>
|
|
172 <table class="center" width=100% style="text-align: center;">
|
|
173 <tr>
|
|
174 <td><small>通常のVNC</small></td>
|
|
175 <td><small>TreeVNC</small></td>
|
|
176 </tr>
|
|
177 <tr>
|
|
178 <td>
|
|
179 <img class="scale" src="./pix/NormalVNC3.png" width="300">
|
|
180 </td>
|
|
181 <td>
|
|
182 <img src="./pix/TreeVNC3.png" width="300">
|
|
183 </td>
|
|
184 </tr>
|
|
185 </p>
|
|
186 </table>
|
|
187 <table class="center" border=1 cellspacing="0" width=100%>
|
|
188 <tr>
|
|
189 <td></td>
|
|
190 <td>通常のVNC</td>
|
|
191 <td>TreeVNC</td>
|
|
192 </tr>
|
|
193 <tr>
|
|
194 <td>通信量</td>
|
|
195 <td> N*データ量 (クライアントの数に比例) </td>
|
|
196 <td> (M+1) * データ量</td>
|
|
197 </tr>
|
|
198 </table>
|
|
199 <p style="text-align: center;"><small>クライアントの数をN、木構造の子供の数をMとする</small> </p>
|
|
200 </div>
|
|
201 </div>
|
|
202
|
59
|
203 <!-- PAGE -->
|
|
204 <div class="slide">
|
|
205 <h1>通常のVNCの問題点</h1>
|
|
206 <li>サーバへのCPU負荷が高い</li>
|
|
207 <li>1本の通信網への負荷が高い</li>
|
|
208 </div>
|
|
209 <!-- PAGE -->
|
|
210 <!--
|
|
211 <div class="slide">
|
|
212 <h1>VNCの問題点の解決策</h1>
|
|
213 <p style="text-align: center;">
|
|
214 <small>クライアントを木構造で接続させるTreeVNC</samll><br>
|
|
215 <img class="scale" src="./pix/TreeVNC0.png" width="500" heigth="500"><br>
|
|
216 </p>
|
|
217 </div>
|
|
218 -->
|
|
219
|
|
220 <!-- PAGE -->
|
|
221 <div class="slide">
|
|
222 <h1>今回の主な内容</h1>
|
|
223 <ul>
|
|
224 <li>木の構成</li>
|
|
225 <li>木の再構築</li>
|
|
226 <li>MulticastQueue</li>
|
|
227 <li>ZRLE Encodingの問題</li>
|
|
228 </ul>
|
|
229 </div>
|
|
230
|
|
231 <!-- PAGE -->
|
|
232 <div class="slide">
|
|
233 <h1>TreeVNCの設計</h1>
|
|
234 <table>
|
|
235 <tr>
|
|
236 <td>
|
|
237 <li>木構造での接続</li>
|
|
238 <li>クライアントの管理を行うTop Proxyを置く。</li>
|
|
239 <li>データは木の上から下へと流していくようにする。</li>
|
|
240 </td>
|
|
241 <td>
|
|
242 <!-- <li>tightVNC ViewerのJava版を元にTreeVNCの実装を行う。</li> -->
|
|
243 <p style="text-align: center;">
|
|
244 <img class="scale" src="./pix/TreeVNC0.png" width="500" heigth="500">
|
|
245 </p>
|
|
246 </td>
|
|
247 </tr>
|
|
248 </table>
|
|
249 </div>
|
|
250
|
|
251 <!-- PAGE -->
|
|
252 <div class="slide">
|
|
253 <div class="taninaritop">
|
|
254 <h1>木の構成手順</h1>
|
|
255 <table class="tanitable">
|
|
256 <tr>
|
|
257 <td>
|
|
258 <center><img class="scale" src="pix/uml1.png" alt=""></center>
|
|
259 </td>
|
|
260 <td valign="top">
|
|
261 <Font size="6">
|
|
262 <Font color="red">
|
|
263 requestHostName();
|
|
264 </Font>
|
|
265 <br>
|
|
266 プロキシに対してホストのアドレスを要求する関数。
|
|
267 </Font>
|
|
268 </td>
|
|
269 </tr>
|
|
270 </table>
|
|
271 </div>
|
|
272 </div>
|
|
273
|
|
274 <!-- PAGE -->
|
|
275 <div class="slide">
|
|
276 <div class="taninaritop">
|
|
277 <h1>木の構成手順</h1>
|
|
278 <table class="tanitable">
|
|
279 <tr>
|
|
280 <td>
|
|
281 <center><img class="scale" src="pix/uml2.png" alt=""></center>
|
|
282 </td>
|
|
283 <td valign="top">
|
|
284 <Font size="6">
|
|
285 <Font color="red">
|
|
286 transferParentAddress();
|
|
287 </Font>
|
|
288 <br>
|
|
289 クライアントに接続先を教える関数。
|
|
290 <br>
|
|
291 <br>
|
|
292 実際にクライアントにおくっているデータは
|
|
293 <br>
|
|
294 parentAddress
|
|
295 <br>
|
|
296 parentNum
|
|
297 <br>
|
|
298 treeNum
|
|
299 <br>
|
|
300 leaderFlag
|
|
301 <br>
|
|
302 の4つである。
|
|
303 <br>
|
|
304 リーダーは子供の中で一番若い番号の人がなる。
|
|
305 <br>
|
|
306 リーダーフラグは木の再構成の際に使用する。
|
|
307 </Font>
|
|
308 </td>
|
|
309 </tr>
|
|
310 </table>
|
|
311 </div>
|
|
312 </div>
|
|
313
|
|
314
|
|
315 <div class="slide">
|
|
316 <div class="taninaritop">
|
|
317 <h1>木の構成手順</h1>
|
|
318 <table class="tanitable">
|
|
319 <tr>
|
|
320 <td>
|
|
321 <center><img class="scale" src="pix/uml3.png" alt=""></center>
|
|
322 </td>
|
|
323 <td valign="top">
|
|
324 <Font size="6">
|
|
325 <Font color="red">
|
|
326 connectAndAuthenticate();
|
|
327 </Font>
|
|
328 <br>
|
|
329 プロキシから受け取ったデータをもとに接続を開始する関数。
|
|
330 </Font>
|
|
331 </td>
|
|
332 </tr>
|
|
333 </table>
|
|
334 </div>
|
|
335 </div>
|
|
336
|
|
337
|
|
338 <div class="slide">
|
|
339 <div class="taninaritop">
|
|
340 <h1>木の構成手順</h1>
|
|
341 <table class="tanitable">
|
|
342 <tr>
|
|
343 <td>
|
|
344 <center><img class="scale" src="pix/uml4.png" alt=""></center>
|
|
345 </td>
|
|
346 <td valign="top">
|
|
347 <Font size="6">
|
|
348 新しいクライアントが来るたびに今まで説明した3つの関数を呼び出す。
|
|
349 </Font>
|
|
350 </td>
|
|
351 </tr>
|
|
352 </table>
|
|
353 </div>
|
|
354 </div>
|
|
355
|
|
356
|
|
357 <div class="slide">
|
|
358 <div class="taninaritop">
|
|
359 <h1>木の構成手順</h1>
|
|
360 <table class="tanitable">
|
|
361 <tr>
|
|
362 <td>
|
|
363 <center><img class="scale" src="pix/uml5.png" alt=""></center>
|
|
364 </td>
|
|
365 <td valign="top">
|
|
366 <Font size="6">
|
|
367
|
|
368 </Font>
|
|
369 </td>
|
|
370 </tr>
|
|
371 </table>
|
|
372 </div>
|
|
373 </div>
|
|
374
|
|
375
|
|
376 <div class="slide">
|
|
377 <div class="taninaritop">
|
|
378 <h1>木の構成手順</h1>
|
|
379 <table class="tanitable">
|
|
380 <tr>
|
|
381 <td>
|
|
382 <center><img class="scale" src="pix/uml6.png" alt=""></center>
|
|
383 </td>
|
|
384 <td valign="top">
|
|
385 <Font size="6">
|
|
386
|
|
387 </Font>
|
|
388 </td>
|
|
389 </tr>
|
|
390 </table>
|
|
391 </div>
|
|
392 </div>
|
|
393
|
|
394
|
|
395 <div class="slide">
|
|
396 <div class="taninaritop">
|
|
397 <h1>木の構成手順</h1>
|
|
398 <table class="tanitable">
|
|
399 <tr>
|
|
400 <td>
|
|
401 <center><img class="scale" src="pix/uml7.png" alt=""></center>
|
|
402 </td>
|
|
403 <td valign="top">
|
|
404 <Font size="6">
|
|
405
|
|
406 </Font>
|
|
407 </td>
|
|
408 </tr>
|
|
409 </table>
|
|
410 </div>
|
|
411 </div>
|
|
412
|
|
413
|
|
414 <div class="slide">
|
|
415 <div class="taninaritop">
|
|
416 <h1>木の構成手順</h1>
|
|
417 <table class="tanitable">
|
|
418 <tr>
|
|
419 <td>
|
|
420 <center><img class="scale" src="pix/uml8.png" alt=""></center>
|
|
421 </td>
|
|
422 <td valign="top">
|
|
423 <Font size="6">
|
|
424
|
|
425 </Font>
|
|
426 </td>
|
|
427 </tr>
|
|
428 </table>
|
|
429 </div>
|
|
430 </div>
|
|
431
|
|
432
|
|
433 <div class="slide">
|
|
434 <div class="taninaritop">
|
|
435 <h1>木の構成手順</h1>
|
|
436 <table class="tanitable">
|
|
437 <tr>
|
|
438 <td>
|
|
439 <center><img class="scale" src="pix/uml9.png" alt=""></center>
|
|
440 </td>
|
|
441 <td valign="top">
|
|
442 <Font size="6">
|
|
443 ここで接続先がクライアント1になっているがこれはプロキシ側で
|
|
444 <br>
|
|
445 <Font color="red">
|
|
446 親の番号 = (自分の番号 - 1) / 親に対する子どもの数
|
|
447 </Font>
|
|
448 <br>
|
|
449 を計算してどの親に接続させれば良いかを決めてクライアントに報告している。
|
|
450 <br>
|
|
451 このように番号で木を管理している。
|
|
452 </Font>
|
|
453 </td>
|
|
454 </tr>
|
|
455 </table>
|
|
456 </div>
|
|
457 </div>
|
|
458
|
|
459
|
|
460 <div class="slide">
|
|
461 <div class="taninaritop">
|
|
462 <h1>木の再構成手順</h1>
|
|
463 <table class="tanitable">
|
|
464 <tr>
|
|
465 <td>
|
|
466 <center><img class="scale" src="pix/reuml1.png" alt=""></center>
|
|
467 </td>
|
|
468 <td valign="top">
|
|
469 <Font size="6">
|
|
470 クライアント1が落ちた時の再接続の処理についての説明。
|
|
471 </Font>
|
|
472 </td>
|
|
473 </tr>
|
|
474 </table>
|
|
475 </div>
|
|
476 </div>
|
|
477
|
|
478
|
|
479 <div class="slide">
|
|
480 <div class="taninaritop">
|
|
481 <h1>木の再構成手順</h1>
|
|
482 <table class="tanitable">
|
|
483 <tr>
|
|
484 <td>
|
|
485 <center><img class="scale" src="pix/reuml2.png" alt=""></center>
|
|
486 </td>
|
|
487 <td valign="top">
|
|
488 <Font size="6">
|
|
489 <Font color="red">
|
|
490 lostHost();
|
|
491 </Font>
|
|
492 <br>
|
|
493 木を構成する際にリーダを決めたが、そのリーダだけが呼び出す関数。
|
|
494 <br>
|
|
495 プロキシに対し落ちた親(クライアント1)の情報を報告する。
|
|
496 </Font>
|
|
497 </td>
|
|
498 </tr>
|
|
499 </table>
|
|
500 </div>
|
|
501 </div>
|
|
502
|
|
503
|
|
504 <div class="slide">
|
|
505 <div class="taninaritop">
|
|
506 <h1>木の再構成手順</h1>
|
|
507 <table class="tanitable">
|
|
508 <tr>
|
|
509 <td>
|
|
510 <center><img class="scale" src="pix/reuml3.png" alt=""></center>
|
|
511 </td>
|
|
512 <td valign="top">
|
|
513 <Font size="6">
|
|
514 <Font color="red">
|
|
515 reportLastNode();
|
|
516 </Font>
|
|
517 <br>
|
|
518 ラストノードに対し落ちたクライアントの代わりをするように命令を出す。
|
|
519 </Font>
|
|
520 </td>
|
|
521 </tr>
|
|
522 </table>
|
|
523 </div>
|
|
524 </div>
|
|
525
|
|
526
|
|
527 <div class="slide">
|
|
528 <div class="taninaritop">
|
|
529 <h1>木の再構成手順</h1>
|
|
530 <table class="tanitable">
|
|
531 <tr>
|
|
532 <td>
|
|
533 <center><img class="scale" src="pix/reuml4.png" alt=""></center>
|
|
534 </td>
|
|
535 <td valign="top">
|
|
536 <Font size="6">
|
|
537 <Font color="red">
|
|
538 connectAndAuthenticate();
|
|
539 </Font>
|
|
540 <br>
|
|
541 プロキシから受け取ったデータをもとに接続を開始する関数。
|
|
542 <br>
|
|
543 この時クライアント6がクライアント1に変わる。
|
|
544
|
|
545 </Font>
|
|
546 </td>
|
|
547 </tr>
|
|
548 </table>
|
|
549 </div>
|
|
550 </div>
|
|
551
|
|
552
|
|
553 <div class="slide">
|
|
554 <div class="taninaritop">
|
|
555 <h1>木の再構成手順</h1>
|
|
556 <table class="tanitable">
|
|
557 <tr>
|
|
558 <td>
|
|
559 <center><img class="scale" src="pix/reuml5.png" alt=""></center>
|
|
560 </td>
|
|
561 <td valign="top">
|
|
562 <Font size="6">
|
|
563 <Font color="red">
|
|
564 transferParentAddress();
|
|
565 </Font>
|
|
566 <br>
|
|
567 落ちた親の子供たちに対し新しい親のアドレスを報告する関数。
|
|
568 </Font>
|
|
569 </td>
|
|
570 </tr>
|
|
571 </table>
|
|
572 </div>
|
|
573 </div>
|
|
574
|
|
575
|
|
576 <div class="slide">
|
|
577 <div class="taninaritop">
|
|
578 <h1>木の再構成手順</h1>
|
|
579 <table class="tanitable">
|
|
580 <tr>
|
|
581 <td>
|
|
582 <center><img class="scale" src="pix/reuml6.png" alt=""></center>
|
|
583 </td>
|
|
584 <td valign="top">
|
|
585 <Font size="6">
|
|
586 <Font color="red">
|
|
587 connectAndAuthenticate();
|
|
588 </Font>
|
|
589 <br>
|
|
590 プロキシから受け取ったデータをもとに接続を開始する関数。
|
|
591
|
|
592 </Font>
|
|
593 </td>
|
|
594 </tr>
|
|
595 </table>
|
|
596 </div>
|
|
597 </div>
|
57
|
598
|
|
599 <!--RFBPROTOCOL説明-->
|
59
|
600 <!-- PAGE -->
|
|
601 <div class="slide">
|
|
602 <h1>RFB protocol</h1>
|
|
603 <li>Remote Frame Buffer Protocol : <br>GUI操作によるリモートアクセス用の通信プロトコル。VNCで用いられている。</li>
|
|
604 <li><font color=blue>1~5</font>まではinitial seaquenceとなる。</li>
|
|
605 <li><font color=orange>6</font>以降は繰り返し行われる処理。画面のデータが転送されてくる。</li>
|
|
606 </div>
|
57
|
607
|
|
608 <!-- PAGE -->
|
|
609 <div class="slide">
|
|
610 <h1>画像の更新(FramebufferUpdate)</h1>
|
|
611 <li>転送される画面(フレームバッファ)のデータは変更があった部分(差分)だけが矩形単位で送られる。</li>
|
|
612 <table class="center" width=100%>
|
|
613 <tr>
|
|
614 <td>
|
|
615 <img src="./pix/hadesScreen1.png">
|
|
616 </td>
|
|
617 <td>
|
|
618 <img src="./pix/rightArrow.png">
|
|
619 </td>
|
|
620 <td>
|
|
621 <img src="./pix/hadesScreen2.png">
|
|
622 </td>
|
|
623 </tr>
|
|
624 </table>
|
|
625 <small>
|
|
626 <p style="text-align: center;"><font color=red>赤枠 </font>で囲まれている矩形のデータだけが送られてくる。 </p>
|
|
627 </small>
|
|
628 </div>
|
|
629 <!-- PAGE -->
|
|
630 <div class="slide">
|
|
631 <h1>データの転送</h1>
|
|
632 <li>クライアントから接続されるとsenderスレッドが作られる。</li>
|
|
633 <li>senderスレッドによりデータの転送は並列に行われる。</li>
|
|
634 <p class="textcenter">
|
|
635 <img src="./pix/MulticastQueue3.png">
|
|
636 </p>
|
59
|
637 <li>MulticastQueueクラスを用いた並列な転送を行った。</li>
|
57
|
638 </div>
|
|
639
|
|
640 <!--MulticastQueueが必要になった経緯-->
|
59
|
641 <!--
|
57
|
642 <div class="slide">
|
|
643 <h1>MulticastQueue</h1>
|
|
644 <li>クライアントは、自分のペースでデータを読み込みたい。</li>
|
|
645 <li></li>
|
|
646 <li class="incremental">TreeVNCではVNCサーバとの接続はこのZRLEを扱う。</li>
|
|
647 </div>
|
59
|
648 -->
|
|
649
|
|
650 <!--PAGE-->
|
|
651 <div class="slide">
|
|
652 <h1>MulticastQueue</h1>
|
|
653 <li>MulticastQueue:データを順序よく読み込ませるクラス</li>
|
|
654 <table class="textcenter" border=1 cellspacing="0" width=100%>
|
|
655 <tr>
|
|
656 <td width=50%>
|
|
657 <img src="./pix/MulticastQueue2.png">
|
|
658 </td>
|
|
659 <td>
|
|
660 <img src="./pix/MulticastQueue.png">
|
|
661 </td>
|
|
662 </tr>
|
|
663
|
|
664 <tr>
|
|
665 <td>
|
|
666 次のデータがなければwaitする
|
|
667 </td>
|
|
668 <td>
|
|
669 データがputされ次第読み込みを再開する
|
|
670 </td>
|
|
671 </tr>
|
|
672 </table>
|
|
673 <p><small>
|
|
674 MulticastQueueは、java.util.CountDownnLatchにより実装されている。
|
|
675 </small></p>
|
|
676 </div>
|
|
677
|
57
|
678
|
|
679 <!-- PAGE -->
|
|
680 <div class="slide">
|
|
681 <h1>MulticastQueue</h1>
|
|
682 <table class="textcenter" style="margin-top: 50px" width=100% border=1 cellspacing="0">
|
|
683 <tr>
|
|
684 <td>
|
|
685 <img src="./pix/MulticastQueue_proxy2.png" width="600">
|
|
686 </td>
|
|
687 <td style="text-align: left;" width=50%>
|
|
688 <li>putでデータの入力</li>
|
|
689 <li>pollでデータの取り出し</li>
|
|
690 <li>Proxyは常に最新のデータの参照を渡す</li>
|
|
691 </td>
|
|
692 </tr>
|
|
693 <tr>
|
|
694 <td width=50%>
|
|
695 <img src="./pix/MulticastQueue_proxy3.png" width="600">
|
|
696 </td>
|
|
697 <td style="text-align: left;">
|
|
698 <li>クライアントは最新のデータから読み込み始める。</li>
|
|
699 </td>
|
|
700 </tr>
|
|
701 </table>
|
|
702 </div>
|
|
703 <!-- PAGE -->
|
|
704 <div class="slide">
|
|
705 <h1>MulticastQueueの問題点</h1>
|
|
706 <li>クライアントがデータを読み込まない時...
|
|
707 <table class="textcenter" width=100% style="margin-top: 50px; margin-bottom: 50px;">
|
|
708 <tr>
|
|
709 <td width=50%>
|
|
710 <img src="./pix/MCTimeOut1.png">
|
|
711 </td>
|
|
712 <td>
|
|
713 <img src="./pix/MCTimeOut2.png">
|
|
714 </td>
|
|
715 </tr>
|
|
716 </table>
|
|
717 <li>読み込まれないデータはProxyのメモリに残り続ける。</li>
|
|
718 </div>
|
|
719 <!-- PAGE -->
|
|
720 <div class="slide">
|
|
721 <h1>MulticastQueueの問題点</h1>
|
|
722 <li>TimeOut(TO)スレッドを走らせ、最新のデータから取得できるようする。</li>
|
|
723 <table class="textcenter" width=100% style="margin-top: 50px; margin-bottom: 50px;">
|
|
724 <tr>
|
|
725 <td width=50%>
|
|
726 <img src="./pix/MCTimeOut3.png">
|
|
727 </td>
|
|
728 <td>
|
|
729 <img src="./pix/MCTimeOut4.png">
|
|
730 </td>
|
|
731 </tr>
|
|
732 </table>
|
|
733 <li>どこからも参照されないデータはProxyのメモリから削除される。</li>
|
|
734 </div>
|
|
735 <!-- PAGE -->
|
|
736 <div class="slide">
|
|
737 <h1>エンコード</h1>
|
59
|
738 <li>Mac OS XではZRLEを使ってVNCを行うことができる</li>
|
57
|
739 <li>ZRLEはデータ量がRAWデータの約4分の1ですむ。</li>
|
59
|
740 <li>TreeVNCではVNCサーバとの接続はこのZRLEを扱う。</li>
|
57
|
741 </div>
|
|
742 <!-- PAGE -->
|
|
743 <div class="slide">
|
|
744 <h1>ZRLE</h1>
|
|
745 <li>ZRLE : Zlib Run-Length Encoding </li>
|
|
746 <ul>
|
|
747 <li>Zlib圧縮(gzip)されたデータ扱うエンコーディング。</li>
|
|
748 </ul>
|
|
749 <li>最初の4バイトにはZlibのデータの長さが、続いてZlibのデータが送られてくる。</li>
|
|
750 <small>
|
|
751 <table border=1 width=50% cellspacing="0">
|
|
752 <tr>
|
|
753 <td>バイト数</td>
|
|
754 <td><pre>型 </pre></td>
|
|
755 <td>説明 </td>
|
|
756 </tr>
|
|
757 <tr>
|
|
758 <td>4</td>
|
|
759 <td>U32</td>
|
|
760 <td>length</td>
|
|
761 </tr>
|
|
762 <tr>
|
|
763 <td>length</td>
|
|
764 <td>U8 array</td>
|
|
765 <td>ZlibData</td>
|
|
766 </tr>
|
|
767 </table>
|
|
768 </small>
|
59
|
769 <li>Zlibデータは辞書を元にデータの解凍を行う</li>
|
|
770 <li>辞書がなければデータを正しく解凍できない</li>
|
57
|
771 </div>
|
59
|
772 <!--PAGE-->
|
|
773 <div class="slide">
|
|
774 <h1>ZRLEの問題</h1>
|
|
775 <li>辞書はZlibデータの最初に送られてくる。</li>
|
|
776 <li>もしも、ZRLEのデータを最初から送っているのなら、辞書も送ることができる。</li>
|
|
777 <li>データの途中から送ると辞書は送られず、正しく解凍を行うことができない。</li>
|
|
778 <table class="textcenter" width=100%>
|
|
779 <tr>
|
|
780 <td>
|
|
781 <img src="./pix/ZRLE.png" width="600" >
|
|
782 </td>
|
|
783 <td>
|
|
784 <img src="./pix/ZRLE2.png" width="600" >
|
|
785 </td>
|
|
786 </tr>
|
|
787 </table>
|
|
788 </div>
|
|
789
|
57
|
790 <!-- PAGE -->
|
|
791 <div class="slide">
|
|
792 <h1>ZRLEE</h1>
|
|
793 <li>そこで、ProxyがZRLEを使ってデータを受け取り圧縮し直して木の下へ流していくことにした。</li>
|
|
794 <li><small>この圧縮し直したデータはZRLEEと名付けた。</small></li>
|
|
795 <table class="textcenter" width=100%>
|
|
796 <tr>
|
|
797 <td>
|
|
798 <img src="./pix/ZRLEE2.png" width="600">
|
|
799 </td>
|
|
800 <td>
|
|
801 <img src="./pix/ZRLEE3.png" width="600">
|
|
802 </td>
|
|
803 </tr>
|
|
804 </table>
|
|
805 </div>
|
|
806 <!-- PAGE -->
|
|
807 <div class="slide">
|
|
808 <h1>ZRLEEの疑問点</h1>
|
|
809 <li>ZRLEEには毎回辞書が付与されている。</li>
|
|
810 <p class="textcenter">
|
|
811 <img src="./pix/ZRLEE2.png" width="600">
|
|
812 </p>
|
|
813 <li class="incremental">ZRLEに比べるとデータ量は増えないのか...?</li>
|
|
814 <li class="incremental">-> ZRLEと比較してみるとデータ量は少なくなった。</li>
|
|
815 </div>
|
|
816 <!-- PAGE -->
|
|
817 <div class="slide">
|
|
818 <h1>ZRLEEのデータ量</h1>
|
|
819 <p style="text-align: center;">
|
|
820 <small>1920*1080の描画にかかったデータ量</small>
|
|
821 </p>
|
|
822 <table class="textcenter" width=100%>
|
|
823 <tr>
|
|
824 <td width=50%>
|
|
825 <img src="./pix/dataLength.png" width="450" heigth="325">
|
|
826 </td>
|
|
827 <td>
|
|
828 <table border=1 cellspacing="0" width=100%>
|
|
829 <tr>
|
|
830 <td></td>
|
|
831 <td>ZRLE</td>
|
|
832 <td>ZRLEE</td>
|
|
833 </tr>
|
|
834 <tr>
|
|
835 <td>データ量</td>
|
|
836 <td>3.4M</td>
|
|
837 <td>3.2M</td>
|
|
838 </tr>
|
|
839 </table>
|
|
840 </td>
|
|
841 </tr>
|
|
842 </table>
|
|
843 <li>ZRLEよりデータ量が多くなるどころか少ない。</li>
|
|
844 <li>原因</li>
|
|
845 <ul>
|
|
846 <li>ZRLEEは送られるデータ毎で最適な辞書が使われる。</li>
|
|
847 </ul>
|
|
848 </div>
|
|
849
|
|
850
|
|
851 <!-- PAGE -->
|
|
852 <div class="slide">
|
|
853 <h1>データ転送量</h1>
|
|
854 <p style="text-align: center;">
|
|
855 <small>矩形の大きさと描画に必要なデータ量(単位:Byte)</small>
|
|
856 </p>
|
|
857 <table class="center" border=1 cellspacing="0" width=80%>
|
|
858 <tr>
|
|
859 <td>矩形の大きさ \ エンコード</td>
|
|
860 <td>RAW</td>
|
|
861 <td>ZRLE</td>
|
|
862 </tr>
|
|
863
|
|
864 <tr>
|
|
865 <td>724 * 449</td>
|
|
866 <!--
|
|
867 <td>1300304</td>
|
|
868 <td>796642</td>
|
|
869 -->
|
|
870 <td>1.3M</td>
|
|
871 <td>0.8M</td>
|
|
872 </tr>
|
|
873
|
|
874 <tr>
|
|
875 <td>1920 * 64</td>
|
|
876 <!--
|
|
877 <td>491520</td>
|
|
878 <td>309602</td>
|
|
879 -->
|
|
880 <td>0.5M</td>
|
|
881 <td>0.15M</td>
|
|
882 </tr>
|
|
883
|
|
884 <tr>
|
|
885 <td>1920 * 1080</td>
|
|
886 <!--
|
|
887 <td>8294400</td>
|
|
888 <td>3472780</td>
|
|
889 -->
|
|
890 <td>8.2M</td>
|
|
891 <td>3.4M</td>
|
|
892 </tr>
|
|
893
|
|
894 </table>
|
|
895
|
|
896 <p style="text-align: center;">
|
|
897 <img src="./pix/dataLength.png" width="450" heigth="325"> <br>
|
|
898 <small>RAW、ZRLE、ZRLEEエンコードのデータ量の比較</small>
|
|
899 </p>
|
|
900 </div>
|
|
901 <!-- PAGE -->
|
|
902 <div class="slide">
|
|
903 <h1>既存のプログラムとの比較</h1>
|
|
904 <li>VNC Reflector</li>
|
|
905 <ul>
|
|
906 <li>tightVNCの作者が作成したプログラム</li>
|
59
|
907 <li>VNC Reflector(Proxy)にクライアントが接続することでVNCを行うことができる</li>
|
57
|
908 </ul>
|
|
909 </div>
|
|
910 <!-- PAGE -->
|
|
911 <!-- PAGE -->
|
|
912 <div class="slide">
|
59
|
913 <h1>質問</h1>
|
57
|
914 </div>
|
|
915 </body>
|
|
916 </html>
|