view paper/conclusion.tex @ 31:819eedb5189e

add poster
author sugi
date Sat, 21 Feb 2015 00:10:08 +0900
parents 6a9525138c2e
children
line wrap: on
line source

\chapter{結論} \label{chapter:conclusion}

\section{まとめと今後の課題}
本研究では、まずはじめにAliceの計算モデルと実装について説明を行い、Aliceにおけるプログラミング手法を述べた。
次に、今回新たに追加した動的なトポロジーの作成の機能とAliceのComputationを変更するMeta Computationについて説明を行った。
そして、追加した機能を用いて実際に例題を記述することで、その有効性を示した。
改善点では例題を記述する際に発見された問題点について並列と分散両方の観点から説明し、その改善を示した。

最後に、今回行った改善点の効果を測るためリングトポロジー上での実験を行った。また、先行研究であるFederated Lindaとの性能比較を行い、同程度の性能を持つことを確認した。また、TreeVNCとAliceVNCをコードの量という観点から評価を行った。

\section{データの永続性の確保}
現在のAliceは、On memoryであるためプロセスの終了とともにData Segmentは全て失われてしまう。

この問題を解決するためには、Data Segmentを他のKey Value Store等のシステムに保存し、永続性を確保する昼用がある。また、JungleのようにLogファイルとして出力することでも解決ができる。

\section{Data Segmentの領域分け}
現在Meta Data SegmentとData Segmentは、同じKey Value Queueで管理されている。つまり、Data Segment APIを用いれば、誰でもMeta Data Segmentを変更することができてしまう。Meta Data SegmentにAliceの状態を表すものがあるため、ユーザーによる変更は望ましくない。また、ユーザーが意図せずMeta Data Segment Keyに対して、putすることも考えられる。そして、Meta Code Segmentがactiveになりエラーを起こす。Meta Code Segmentでエラーが起こった場合、ソースコードを見ることができないため解決しづらい。

このようなエラーを防ぐためにMeta Data SegmentとData Segmentの領域を分ける必要がある。Data Segmentを分けることによりKeyの重複によるエラーをアプリケーションレベルにすることができる。しかし、領域を分けるだけでは足りない。領域をわけることで解決することができるのはputまたはupdateの場合だけである。Meta Data Segmentを取得する際にtakeを使用した場合Meta Data SegmentがQueueから取り除かれてしまう。この問題に対処するためには権限をCode Segmentに対して設定する必要がある。その権限により、takeと記述しても実際にはpeekを行うようにすることができる。

\section{記述に関する注意点}
\subsubsection{setKey のシンタックス問題}
setKeyメソッドをコンストラクタで呼ぶ際、setKeyメソッドを必ず最後に呼ばなければならない。

Code Segmentは内部で実行に必要なData Segmentを数えている。Data Segmentの取得に成功するとこの値が、デクリメントされ、0になると必要なData Segmentが全て揃ったことと判断される。全て揃った際にはThread poolへ送られる。

setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。

\begin{table}[html]
\lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java}
\end{table}

ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にData Segmentの取得数を決めようとしている。しかし、setKeyが最初に呼ばれた際に、Data Segmentの取得に成功すると実行可能と判断されてしまう。runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。

\begin{table}[html]
\lstinputlisting[label=src:success,caption=NullPointerExceptionにならない記述]{source/ShowData.java}
\end{table}

この問題は現状のコンストラクタ内でsetKeyを行う方法ではCode Segmentのインスタンスを扱うことができないことを意味する。インスタンス化ができないためCloseEventManagerに登録するCode SegmentはClassで指定しなければならない。setKeyをどのタイミングで呼ぶべきか考えなおす必要がある。

\subsubsection{Singleton Code Segment}
Javaには、クラスのインスタンスを1つに限定するSingletonパターンがある。Code SegmentにSingletonパターンを使用したい場合があり得る。その場合、setKeyを行なう前に{\tt ids.init()}を行なう必要がある。先ほどのsetKeyのシンタックス問題でも述べたが、Code Segmentは内部で実行に必要なData Segmentを示す値がある。一度実行された状態のCode Segmentと新しくインスタンスを作成した場合のCode Segmentでは、値が違うため{\tt ids.init()}を呼ばずにsetKeyを行なうとData Segmentが揃ったにもかかわらずCode Segmentが実行されない。そのためsetKeyを呼ぶ前に{\tt ids.init()}を呼び内部の値を初期化する必要がある。(ソースコード\ref{src:Singleton})

\begin{table}[html]
\lstinputlisting[label=src:Singleton,caption=setKeyを呼ぶ前にinitを呼ぶ必要がある。]{source/Singleton.java}
\end{table}

\section{データの圧縮}
TreeVNCではデータをZRLEEというエンコードで圧縮して送信している。
この圧縮により、データ量を40%程度まで減らしている(図\ref {fig:compress})。
Aliceにもこの圧縮機能を入れることで、送信にかかる時間を減らすことができると考えられる。

\begin{figure}[htbp]
\begin{center}
\includegraphics[width=120mm]{images/compare_encoding.pdf}
\end{center}
\caption{圧縮データと非圧縮データの比較}
\label{fig:compress}
\end{figure}