view final_main/chapter2.tex @ 0:83f997abf3b5

first commit
author e155702
date Thu, 14 Feb 2019 16:51:50 +0900
parents
children 8b42a96b95aa
line wrap: on
line source

\chapter{TreeVNC の基本概念}
%% VNCとはなにか?どのようなものか?どのようにしてなりたっているか?

 TreeVNC は当研究室で開発している画面配信ソフトウェアである。

本章は TreeVNC の基本概念となっている技術について説明する。

%% どういう概念? どうしてそうするの? どうやってつかうの? 
\section{ Virtual Network Computing }

VNC(Virtual Network Computing) は、RFB プロトコルを用いて PC の遠隔操作を行うことを目的としたリモートデスクトップソフトウェアである。

サーバー側とクライアント側に分かれており、起動したサーバーにクライアントが接続することで遠隔操作を可能にしている。


\section{ RFB プロトコル}

RFB(Remote Frame Buffer)プロトコルは、自身の画面をネットワークを通じて送信し他者の画面に表示するプロトコルである。

ユーザがいる側と FrameBuffer への更新が行われる側に分かれ、それぞれを RFB クライアント、RFB サーバと呼ぶ。FrameBuffer は、メモリ上に置かれた画像データのことである。

RFB プロトコルでは、始めにプロトコルバージョンの確認、認証を行う。その後クライアントに向けて FrameBuffer の大きさやデスクトップに付けられた名前などが含まれている初期メッセージが送信される。RFB サーバ側は FrameBuffer の更新が行われるたびに RFB クライアントに対して FrameBuffer の変更部分だけを送信する。更に、RFB クライアントの FramebufferUpdateRequest が来るとそれに答え返信する。変更部分だけを送信する理由は、更新がある度に全画面を送信していると、送信するデータ面、更新にかかる時間面において効率が悪いからである。

RFB プロトコルには、描画データに使われるエンコードが多数用意されており、更に、独自のエンコードを実装することも可能である。


%%ここより上を修正したい
\section{ TreeVNC の基本構造}
TreeVNC は TightVNC を元に作成されている 


\section{従来の VNC と TreeVNC の相違点}

従来の VNC は画面配信を行う際、サーバー側に全てのクライアントが同時に接続してしまうため、多人数に配信を行う場合、クライアントに対する全ての処理をサーバー1つで負担することになり、サーバーの処理性能が落ちてしまう問題点が存在する。


%%従来の VNC の接続方式の図
%%従来の VNC 使用時のパフォーマンスの計測結果


\section{}
CbC で DataGear を扱う際、 Context と呼ばれる接続可能な CodeGear、 DataGear のリ
スト、Temporal DataGear のためのメモリ空間等を持っている Meta DataGearである。
CbC で必要な CodeGear 、 DataGear を参照する際は Context を通してアクセスする必
要がある。

\section{stub CodeGear}
CodeGear が必要とする DataGear を取り出す際、 Context を通す必要がある。
しかし、 Context を直接扱えるようにするのは信頼性を損なう。そのため CbC では
Context を通して必要なデータを取り出して次の Code Gear に接続する stub CodeGear
を定義している。CodeGear は stub CodeGear を介してのみ必要な DataGear へアクセス
することができる。 stub CodeGear は CodeGear 毎に生成され、次の CodeGear へと接
続される。
stub CodeGear は CodeGear の Meta CodeGear に当たる。


\section{CbCによる Interface の記述と継続}

CodeGear は通常の関数と比べ、細かく分割されるためメタ計算をより柔軟に記述でき
る。 CodeGear 、 DataGear にはそれぞれメタレベルとして、 Meta CodeGear
、 Meta DataGear が存在する。

CbC で実装していくうちに、stub CodeGear の記述が煩雑になることが分かった。
そのため 既存の実装を モジュールとして扱うため Interface という仕組みを導入した。

Interface は DataGear に対して何らかの操作(API)を行う CodeGear とその
CodeGear で使われる DataGear の集合を抽象化した メタレベルの DataGear
として定義されている。

% interface は データ構造に record で interface 名を列挙し、実際の動作をする関数と紐付けている。使用する際は、$ DataName->InterfaceFunk $のように使用する。

例として CbC による Stack Interface のソースコード\ref{src:interface-define},
\ref{src:interface}がある。Stack への push 操作に注目して見ると、
実態は SingleLinkedStack の push であることが\ref{src:interface}で分
かる。実際の SingleLinkedStack の push では Stack を指定する必要があるが、
Interface で実装した Stack では push 先の Stack が stackImpl として扱
われている。この stackImpl は$ Stack->push $で呼ばれた時の Stack と同じになる。
これにより、 ユーザーは実行時に Stack を指定する必要がなくなる。
また、ユーザーが誤って異なる Stack を指定することを防ぐこともできる。

このように Interface 記述をすることで CbC で通常記述する必要がある一定の部分を省略し呼び出
しが容易になる。

\lstinputlisting[label=src:interface-define, caption=CbCでのStack-Interfaceの定義] {src/interface.cbc}

\lstinputlisting[label=src:interface, caption=CbCでのStack-Interfaceの実装] {src/singleLinkedStackInterface.cbc}