title: CbC 言語による OS 記述
author: Mitsuki Miyagi
profile:
lang: Japanese
code-engine: coderay
# メタ計算の重要性
- プログラムを記述する際、通常の処理の他に、メモリ管理、スレッドの待ち合わせやネットワークの管理、エラーハンドリング等、記述しなければならない処理が存在する。これ
らの計算を Meta Computation と呼ぶ
# TreeVNC の問題点
- TreeVNC を実際に使用していく中で様々な問題が発生
- 講義等を大学外の遠隔地から受けたい場合がある
- TreeVNC は NAT を越えた接続が行うことができない
# TreeVNC の問題点
- ゼミ等で発表者毎に画面切り替えを行う際、デュアルディスプレイを使っている学生がいた
- その際 VNC サーバーからはすべての画面データが送信されており、発表とは関係ない画面も配信されていた
# この発表は
- TreeVNC の概要
- 構造
- 原理
- 画面切り替え
- 今回の改良
- NAT 対応
- マルチディスプレイの対応
- TreeVNC の評価
- 画像データ送信の遅延
- ネックになってるノードへの対処
# TreeVNC
- TreeVNC は本研究室で開発している VNC を利用した画面配信システム
- 配信コストを分散させることで大人数でも画面配信が可能
- スムーズな配信画面の切替を行う
# VNC
- VNC(Virtual Network Computing) は RFBプロトコルを用いて遠隔操作を行うソフトウェア
- サーバー側とクライアント側に分かれており、サーバーを起動し、クライアントがサーバーに接続を行うことで遠隔操作を可能とする
# RFB プロトコル
- RFB(Remote Frame Buffer)プロトコルは VNC で用いられているプロトコル
- 自身の画面をネットワーク越しに他者の画面に表示する
- Framebuffer と呼ばれるメモリ上に置かれた画像データを使用して画面表示を行う
- サーバーは Framebuffer が更新されるたびにクライアントに対して変更部分だけを送信する。
# TreeVNC の構造
- Java で作成されたTightVNC(Tight Virtual Network Computing) を元に作成されている
- 様々なメッセージで通信を行う
- クライアント同士をバイナリツリー状に接続する
- バイナリツリーのルートのノードをRoot Nodeと呼び、 Root Node に接続されるノードを Node と呼ぶ
- Root Node が参照している VNC サーバーから FrameBuffer を取得して、 木構造を辿って Node に送信する。
# TreeVNC の原理
- ポート一本あたりの負荷
- 従来のVNC : Node数 * データ量
- TreeVNC : (2(子供の数) + 1) * データ量
- 従来のVNCはNode数に比例
- TreeVNCはNode数に関係なく一定
# 共有画面切り替え
- TreeVNC の Root Node は配信者の VNC サーバーと通信を行っている
- 画面を配信されている側のビューワにある Share Screen ボタンが押す
- Root Node に SERVER\_CHANGE\_REQUEST を木構造を辿りながら送信
- Root Node は Share Screen ボタンを押したクライアントの VNC サーバーと通信を開始
# Direct Connection
- NATを越えたネットワークからの接続は直接配信側の Root Node に接続を行うことで実現する
- Direct Connection した Node はそのネットワークの Root Node になる
- Direct Connection された Root Node では NAT を越えたネットワーク先の Node の管理を行わない
# マルチディスプレイ
- 画面切り替えの際のSERVER\_CHANGE\_REQUESTに共有するディスプレイの座標を付加する
- Root Node は 接続した VNC サーバーから画像データを要求する FRAME\_BUFFER\_UPDATE\_REQUEST に受け取った座標を付加する
- VNC サーバーは要求された座標内の画像データを FRAME\_BUFFER\_UPDATE で Root Node に送信する
# TreeVNC の評価
- 木の深さによる画像データの遅延を調べる
- 実験環境
- 実際に講義を受講している学生が TreeVNC を使用
- 約20名の接続
# 実測方法
- Root Node は 送信時間と画像データを持った CHECK\_DELAY を 末端 Node まで木構造を辿りながら伝達する
- CHECK\_DELAY を受け取った各 Node は 付加された送信時間を CHECK\_DELAY\_REPLY に付加し、 Root Node に送信する
- CHECK\_DELAY\_REPLY を受け取った Root Node は CHECK\_DELAY の送信にどれだけ時間がかかったかの計算を行う
# 深さ1, 2
# 深さ3, 4
# 結果から
- 画像データの伝達はほぼ1秒以内に収まっている
- 容量が小さい場合でも時間がかかる場合がある。 それはその送信の前に大容量の画像を送信した後の回線の遅延が残っているためだと考えられる
- 深さ3が遅い原因として1つの Node がボトルネックになっている事が判明した。
- ネックになった Node をそのままにするとその子Nodeに影響を及ぼしてしまう。 そのためその Node に何らかの対応を行う必要がある
# ネックになっているノードへの対処
- CHECK\_DELAY\_REPLY で Root Node は ネックかどうかのを判断をする
- ネックになっているなら、その Node を木構造のリストから削除
- 最後の Node を削除した Node の場所に移動
- ネックになったところは三分木になる
# まとめと課題
- 今回TreeVNCの様々な問題点の解決を行った
- NAT
- マルチディスプレイ
- 画面切り替えの安定化
- エラー通知
- NATを越えた画面切り替え
- 音声配信等の共有機能の追加