0
|
1 \chapter{結論} \label{chapter:conclusion}
|
|
2
|
|
3 \section{まとめ}
|
16
|
4 今回の研究では、さまざまなアプリケーションの作成を行い、Aliceの性能的問題や不足機能を洗い出した。
|
|
5 性能的な問題に対しては、並列と分散の両方の観点から改善を行った。その結果、実行速度を最大24\%改善した。
|
|
6 不足機能に関しては、洗いだした機能を実装することで、当研究室で開発しているTreeVNCをAlice上で実装できるまでになった。
|
|
7
|
|
8 しかし、性能も機能も十分であるとは言えない。性能に関しては、先行研究であるFederated Lindaに勝てていない。
|
|
9 機能に関しては、versionの違うプロトコルに対応するなどまだ必要な機能も多い。
|
0
|
10
|
|
11 \section{今後の課題}
|
16
|
12 \subsection{データの永続性の確保}
|
|
13 現在のAliceは、On memoryであるためプロセスの終了とともにData Segmentは全て失われてしまう。
|
0
|
14
|
16
|
15 この問題を解決するためには、Data Segmentを他のKey Value Store等のシステムに保存し、永続性を確保する昼用がある。また、JungleのようにLogファイルとして出力することでも解決ができる。
|
0
|
16
|
15
|
17 \subsection{DataSegmentKeyの領域分け}
|
16
|
18 現在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でエラーが起こった場合、ソースコードを見ることができないため解決しづらい。
|
|
19
|
|
20 このようなエラーを防ぐためにMeta Data SegmentとData Segmentの領域を分ける必要がある。Data Segmentを分けることによりKeyの重複によるエラーをアプリケーションレベルにすることができる。しかし、領域を分けるだけでは足りない。領域をわけることで解決することができるのはputまたはupdateの場合だけである。Meta Data Segmentを取得する際にtakeを使用した場合Meta Data SegmentがQueueから取り除かれてしまう。この問題に対処するためには権限をCode Segmentに対して設定する必要がある。その権限により、takeと記述しても実際にはpeekを行うようにすることができる。
|
15
|
21
|
|
22 \subsection{記述に関する注意点}
|
|
23 \subsubsection{setKey のシンタックス問題}
|
|
24 setKeyメソッドをコンストラクタ等で呼ぶ際、setKeyメソッドを必ず最後に呼ばなければならない。
|
|
25
|
|
26 Code Segmentは内部で実行に必要なData Segmentを数えている。Data Segmentの取得に成功するとこの値が、デクリメントされ、0になると必要なData Segmentが全て揃ったことと判断される。全て揃った際にはThread poolへ送られる。
|
|
27
|
|
28 setKey移行に処理を記述した場合、その処理が行われない可能性がありThread poolへと送られNullPointerExceptionを引き起こす。
|
|
29
|
|
30 \begin{table}[html]
|
|
31 \lstinputlisting[label=src:NullPointerException,caption=NullPointerExceptionになる可能性がある]{source/ShowDataFailed.java}
|
|
32 \end{table}
|
|
33
|
|
34 ソースコード\ref{src:NullPointerException}は、for文でsetKeyとids.createをcntの回数呼び、動的にData Segmentの取得数を決めようとしている。しかし、setKeyが最初に呼ばれた際に、Data Segmentの取得に成功すると実行可能と判断されてしまう。runの中でinfoの配列の要素だけ中身を表示させようとしてるが、2回目のasClassでNullPointExceptionを引き起こす。今回の場合、コンストラクタ内をソースコード\ref{src:success}のように記述する必要がある。
|
|
35
|
|
36 \begin{table}[html]
|
|
37 \lstinputlisting[label=src:success,caption=NullPointerExceptionにならない記述]{source/ShowData.java}
|
|
38 \end{table}
|
16
|
39
|
|
40 \subsubsection{singleton Code Segment}
|
|
41 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})
|
|
42
|
|
43
|
|
44 \begin{table}[html]
|
|
45 \lstinputlisting[label=src:Singleton,caption=setKeyを呼ぶ前にinitを呼ぶ必要がある。]{source/Singleton.java}
|
|
46 \end{table} |