Mercurial > hg > Papers > 2014 > nobuyasu-master
diff paper/chapter4.tex @ 115:eac8620cf9cd
Fixed spell miss
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 05 Mar 2014 19:54:34 +0900 |
parents | d116e59fc8a2 |
children | d45899154815 |
line wrap: on
line diff
--- a/paper/chapter4.tex Tue Mar 04 00:25:04 2014 +0900 +++ b/paper/chapter4.tex Wed Mar 05 19:54:34 2014 +0900 @@ -54,7 +54,7 @@ に記述している通りにサーバノード同士が接続を行うよう指示をだす. トポロジーマネージャーは接続要求先を聞いてくるサーバノードに対して名前を割り振り, 接続相手を伝える. -dot ファイル\ref{src:alice_dot}により形成されるトポロジーを図\ref{fig:tree_topology}に示す. +ソースコード\ref{src:alice_dot}のdotファイルにより形成されるトポロジーを図\ref{fig:tree_topology}に示す. \begin{figure}[htpb] @@ -96,12 +96,12 @@ \section{Alice を用いての分散実装} Aliceのポロジー形成と他のサーバのデータへのアクセスする機構を用いるためには, Aliceが 提供するプログラミングスタイルに沿わなければならない. -それはDataSegment(データ)とCodeSegment(タスク)によるプログラムである. +それはDataSegmentとCodeSegmentによるプログラムである. ここではまず, DataSegmentとCodeSegmentによるプログラムの方法について説明し, 他サーバとの 通信部分の実装について述べる. \subsection{Alice によるプログラミング} -AliceはDataSegment(データ)とCodeSegment(タスク)単位でプログラミングを行うことを述べた. +AliceはDataSegment(データ)とCodeSegment(タスク)単位でプログラミングを行う. CodeSegmentには計算に必要なDataSegmentが登録される. そしてDataSegmentが準備され次第CodeSegmentによる計算が実行される. DataSegmentの取得は文字列のキーを使うことで行える. @@ -110,11 +110,11 @@ \begin{lstlisting}[frame=lrbt,label=src:cs_sample,caption=CodeSegmentの実行,numbers=left] public class TestCodeSegment extends CodeSegment { public Receiver arg1 = ids.create(CommandType.TAKE); - + public TestCodeSegment() { } public void run() { - int count = ds.asInteger(); + int count = arg1.asInteger(); count++; System.out.println("count = "+count); if(c > 10) { exit(0); } @@ -130,7 +130,7 @@ } } \end{lstlisting} -コードの説明を行う. + ソースコード\ref{src:cs_sample}の説明を行う. このプログラムは, 数字を1から10まで出力を行い終了するプログラムである. 17行目から19行目の処理が最初に行われる. まずTestCodeSegmentというCodeSegmentのインスタンスcsを生成する. @@ -145,8 +145,8 @@ 上記のコード19行目ではputにより"count"をキーとして数値の0を登録している. putがされるとcsの計算が始まり別スレッドにより8行目からの処理が行われる. -putによりキー"count"に登録された数値0はReceiverであるdsを使って取ることができる. -7行目から13行目では\verb|ds.asInteger()|により, "count"に登録したデータの中身を受け取りインクリメントし出力する. +putによりキー"count"に登録された数値0はReceiverであるarg1を使って取ることができる. +7行目から13行目では\verb|arg1.asInteger()|により, "count"に登録したデータの中身を受け取りインクリメントし出力する. そして, 最後には\verb|ods.put|を行っている. 新たなTestCodeSegmentも生成しており, これはインクリメントされた"count"がputされることで実行される. この一連の処理を"count"の数値が10以上になるまで行う. @@ -215,7 +215,7 @@ } \end{lstlisting} 上記のStudentクラスはプリミティブ型しか保持していない. -そのためシリアライズが可能である +そのためシリアライズが可能である. また, 次のようなクラスもシリアライズ可能な型となる(ソースコード\ref{src:msgpack2}). \begin{lstlisting}[frame=lrbt,label=src:msgpack2,caption=MessagePackによりシリアライズ可能なクラス2,numbers=left] import org.msgpack.annotation.Message @@ -227,11 +227,11 @@ \end{lstlisting} この場合, フィールドはプリミティブな型でないStudentクラスのフィールドを保持している. しかし, Studentクラスはシリアライズ可能な形で作成しているため, クラスのフィールドとして -保持しても問題はない. +保持しても問題ない. これらの制約にそった形で作成しDataSegmentにネットワークを介してクラスのインスタンス をputすることができる. -DataSegmentから受け取ったデータはそのままではシリアライズされたものため, 一度手元で +DataSegmentから受け取ったデータはそのままではシリアライズされたものなため, 一度手元で 元のクラスにコンバートすることで扱う. 例として, AliceにおけるStudenクラスのコンバートを次に示す(ソースコード\ref{src:msgpack1}). \begin{lstlisting}[frame=lrbt,label=src:msgpack3,caption=DataSegment,numbers=left] @@ -271,7 +271,7 @@ % 木がなければそのばでつくるようにした \subsection{NetworkTreeOperationLogの実装} -NetworkTreeOperationLogの実装の一部を以下(図\ref{src:netlog})に示す. +NetworkTreeOperationLogの実装の一部を以下(ソースコード\ref{src:netlog})に示す. \begin{lstlisting}[frame=lrbt,label=src:netlog,caption=NetworkTreeOperationが持つフィールド,numbers=left] @Message public class NetworkTreeOperationLog implements TreeOperationLog @@ -304,7 +304,7 @@ \end{lstlisting} LogPutCodeSegmentの実装は次のようになっている(ソースコード\ref{src:logputcs}). -\begin{lstlisting}[frame=lrbt,label=src:logputcs,caption=putを行うためだけのCodeSegmentの用意,numbers=left] +\begin{lstlisting}[frame=lrbt,label=src:logputcs,caption=putを行うためのCodeSegmentの用意,numbers=left] public class LogPutCodeSegment extends CodeSegment{ NetworkTreeOperationLog log; public LogPutCodeSegment(NetworkTreeOperationLog _log) { @@ -316,7 +316,7 @@ } } \end{lstlisting} - 上で述べた問題は, ベンチマークテストなど, 大量の負荷をかけたさいに発生する. + 上で述べた問題は, ベンチマークテストなど, 大量の負荷をかけた際に発生する. 負荷とはJungleのデータに変更が加わることである. 多数のデータの変更により大量のログが生成される. そのため, \verb|ods.put|によりDataSegmentの"log"にアクセスが集中してしまい, レスポンスが @@ -349,7 +349,7 @@ } : \end{lstlisting} - 12行目の\verb|ods.put(node, log.key, log.getVal())|が他サーバノードへデータを送る部分になる. + 12行目の\verb|ods.put(node, log.key, log.getVal())|が他サーバノードへデータを送る部分になる. 変数logにはNetworTreeOperationLogが入っている. 変数listには"\_CLIST"により得られたデータが入っている. それは文字列のListとなっている. @@ -362,12 +362,13 @@ \subsection{ログの受信とデータ反映} 次は受け取ったログからデータの編集を行う部分の実装を行う. -Jungleはのデータを変更する手段として木構造データ毎にTreeEditorクラスが提供される. +Jungleはデータを変更する手段として木構造データ毎にTreeEditorクラスを提供している. このTreeEditorを使用し, ログに入っているTreeOperationを1つ1つ取り出し同じ編集を行わせる. 例えば次のようになる(ソースコード\ref{src:data_edit}). \begin{lstlisting}[frame=lrbt,label=src:data_edit,caption=ログを受け取ってのデータの反映,numbers=left] // Receiver log <- "log"キーから取得できるデータが入っている // Jungle jugnle +// Either<Error,JungleTreeEditor> either NetworkTreeOperationLog netLog = log.asClass(NetworkTreeOperationLog.class); String treeName = netLog.getTreeName(); JungleTree tree = jungle.getTreeByName(treeName); @@ -382,7 +383,7 @@ editor = either.b(); } \end{lstlisting} - 7行目で取り出されたTreeOperationからさらにNodePathとNodeOperationを取り出しているのが8行目と9行目になる. + 8行目で取り出されたTreeOperationからさらにNodePathとNodeOperationを取り出しているのが9行目と10行目になる. 最後にedit関数にTreeEditorとNodePath, それとNodeOpeartionを引き渡している. edit関数は次のようになる(ソースコード\ref{src:data_edit2}). \begin{lstlisting}[frame=lrbt,label=src:data_edit2,caption=edit関数の実装,numbers=left] @@ -454,8 +455,8 @@ ログの書き出しを行いたいときはこのPersistentChangeListWriterを設定することで行えるようになった. これにより木の編集が行われるたびにNetworkTreeOperationLogが書き込まれていく. -読み込みたいときはMessagePackを使ってディスクから読み込み, データ分散実装と同じの方法で木の編集を行っていく -ことができる(ソースコード\ref{src:data_edit}, \ref{src:data_edit2}). +読み込みたいときはMessagePackを使ってディスクから読み込み, データ分散実装と同じ方法で木の編集を行っていく +ことができる. \newpage @@ -506,7 +507,7 @@ \subsection{掲示板プログラムにおけるMerge} 図\ref{fig:merge_imp2}の server node0 の木の状態にするのが理想である. -掲示板のへの書き込みの表示は, 書き込みされた時間が早い順に表示されるようにしたい. +掲示板への書き込みの表示は, 書き込みされた時間が早い順に表示されるようにしたい. これを timestamp を利用することで行う. 他サーバノードから来たデータに関しては, timestamp を参照し, 次に自分の保持している 木の子ノードの timestamp と比べていくことでデータの追加する場所を決める.