Mercurial > hg > Papers > 2015 > sugi-master
changeset 14:b9b3f2241ab4
modify chapter2
author | sugi |
---|---|
date | Tue, 13 Jan 2015 17:10:56 +0900 |
parents | ef47dab5764f |
children | 930eae4e8aeb |
files | paper/chapter1.tex paper/chapter2.tex paper/chapter3.tex paper/images/TopologyFix.pdf paper/images/TopologyFix2.pdf paper/images/TopologyFix3.pdf paper/master_paper.tex paper/source/ShowData.java paper/source/ShowDataFailed.java |
diffstat | 9 files changed, 97 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter1.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/chapter1.tex Tue Jan 13 17:10:56 2015 +0900 @@ -237,7 +237,24 @@ \end{figure} \section{Aliceによるプログラミング手法} +AliceはCode SegmentとData Segmentによってプログラミングを行なう。Code Segmentから別にCode SegmentへData Segmentを引き渡す際、コンストラクタは使わない。Code SegmentがLocal / Remote Data Segmentに対してputを行い、別のCode SegmentがLocal / Remote Data Segmentに対してpeekを行うことで引き渡される。つまり、Code Segmentは実行前後にData Segmentへ通信が行われるのである。この通信の順序がCode Segmentの実行順序を決定している。 +すなわち、Aliceによるプログラミングとは通信の管理を行うことであり、プロトコルを設計することと捉える事ができる。 + \subsection{記述に関する注意点} -\subsubsection{nullpointerException} -\subsubsection{Message Packの使い方} +\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} \subsubsection{singleton Code Segment} \ No newline at end of file
--- a/paper/chapter2.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/chapter2.tex Tue Jan 13 17:10:56 2015 +0900 @@ -98,7 +98,7 @@ %画像挿入 -subsection{処理の流れ} +\subsection{処理の流れ} 図\ref{fig:NodeToClient}はデータの伝搬の様子をコラボレーションダイアグラムで示したものである。 \begin{enumerate} \item ユーザーが魚を操作することで魚の座標のData SegmentであるfishDataが更新される。
--- a/paper/chapter3.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/chapter3.tex Tue Jan 13 17:10:56 2015 +0900 @@ -73,7 +73,6 @@ 接続状態に問題があり、{\tt CLOSE}タスクの実行されるまでにレスポンスがない場合は、{\tt CLOSE}タスクによりRemote Data Segmentが削除される。 heartbeatは、Node AからNode Bに一方向に送られる訳ではなく、Node BからNode Aにも送られている。 -%Singleton Code Segmentの注意点 ids.initが必要とその理由の記述 \section{切断時の処理} DataBaseではデータ更新の際にトランザクション処理に障害が起こった場合、DataBase側でトランザクション処理開始前に戻すロールバックという処理が行われる。 @@ -99,7 +98,53 @@ その際は、もちろんInput Data Segmentが全て揃うまでCode Segmentは実行されない。 \section{Topologyの再構成} -AliceVNCのTopologyは木構造であるため、木の途中のNodeが切断した場合にTopologyを再構成しなければならない。特定の切断時の処理が終わると自動でTopologyの再構成を行なう。 +ノードは永続的にアプリケーションに参加し続ける訳ではない。目的を果たすとアプリケーションから離脱する。 +Topology次第では、アプリケーションに支障をきたす。 +例えば、AliceVNCは木構造であるため、子ノードを持つノードがアプリケーションから離脱した場合、その子ノードに対してデータを送信することができなくなる。 + +この問題を解決するには、アプリケーションからノードが切断するたびにTopologyの再構成を行なう必要がある。そこで、Dynamic Topology Managerに、Topologyの再構成を行う機能を追加した。 + +図 \ref{fig:TopologyFIx}、 \ref{fig:TopologyFIx2}、\ref{fig:TopologyFIx3}はTopologyの再構成をコラボレーションダイアグラムで表したものである。 + +%コラボレーションダイアグラム図の挿入 +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=120mm]{images/TopologyFIx.pdf} +\end{center} +\caption{切断ノードの検知} +\label{fig:TopologyFIx} +\end{figure} + +\begin{enumerate} +\item Keep AliveがNode1の切断を検知すると、Node3からTopology Managerに対して切断したノードの情報がputされる。keep Aliveは各ノードで動いているため、実際にはNode0とNode4もTopology Managerに対してNode1の情報をputする。 +\item Topology Managerは最後にアプリケーションに参加したNode6とその親Node2に対して互いを切断するための準備を行わせる、CLOSEMESSAGEをputする。 +\item 切断する準備ができるとお互いに準備完了を知らせるCLOSEREADYをputする。 +\item \label {tb:last}CLOSEREADYを受け取ると切断を行い、Remote Data Segmentが使用不可能になる。 +\end{enumerate} + +\begin{figure}[htbp] + \begin{minipage}{0.5\hsize} + \begin{center} + \includegraphics[width=90mm]{images/TopologyFix2.pdf} + \end{center} + \caption{接続すべきノード情報の送信} + \label{fig:TopologyFIx2} + \end{minipage} + \begin{minipage}{0.5\hsize} + \begin{center} + \includegraphics[width=80mm]{images/TopologyFix3.pdf} + \end{center} + \caption{再構成の完了} + \label{fig:TopologyFIx3} + \end{minipage} +\end{figure} + +\begin{enumerate} +\setcounter{enumi}{4} +\item Node1、Node3、Node4に対してNode6の情報を送り、接続を行わせる。 +\item Node6に対して、Node1、Node3、Node4の情報を送り、接続を行わせる。 +\item お互いにRemote Data Segmentの名前を贈り合い、Remote Data Segmentが利用可能になる。 +\end{enumerate} \section{再接続の処理}
--- a/paper/master_paper.tex Mon Jan 12 19:35:31 2015 +0900 +++ b/paper/master_paper.tex Tue Jan 13 17:10:56 2015 +0900 @@ -8,7 +8,7 @@ \usepackage{url} \input{dummy.tex} %% font -\jtitle{分散ネットワークフレームワーク Alice 改良} +\jtitle{分散フレームワーク Alice の改良と評価} \etitle{Design and Implementation Distributed network framework Alice} \year{平成23年度} \affiliation{\center%
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/ShowData.java Tue Jan 13 17:10:56 2015 +0900 @@ -0,0 +1,10 @@ +public ShowData(int cnt) { + info = new Receiver[cnt]; + for (int i= 0;i < cnt; i++) { + info[i] = ids.create(CommandType.TAKE); + } + + for (int i= 0;i < cnt; i++) { + info[i].setKey(SetInfo.array[i]); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/ShowDataFailed.java Tue Jan 13 17:10:56 2015 +0900 @@ -0,0 +1,19 @@ +public class ShowData extends CodeSegment{ + private Receiver[] info; + + public ShowData(int cnt) { + info = new Receiver[cnt]; + for (int i= 0;i < cnt; i++) { + info[i] = ids.create(CommandType.TAKE); + info[i].setKey(SetInfo.array[i]); + } + } + + @Override + public void run() { + int size = 0; + for (Receiver anInfo : info) { + DataList dlist = anInfo.asClass(DataList.class); + dlist.showData(); + } + } \ No newline at end of file